Fala escoteiro, curtindo aprender a usar o Git? Vamos dar prosseguimento nos nossos estudos vendo como trabalhar com branchs.
Ramificando nosso projeto
O primeiro comando que vamos aprender é o git branch
esse arquivo lista para nós todos os branchs (ramos) que temos em nosso projeto. Se executarmos esse comando agora veremos apenas o branch master, afinal, é o único que temos por enquanto.
git branch
Resposta:
* master
Esse * (asterisco), serve para indicar em qual branch estamos atualmente, como só temos a master, é nela que estamos. Porém engana-se quem acha que esse comando só faz isso, ele é muito mais poderoso.
Dentre outras coisas podemos criar um novo branch com esse mesmo comando simplesmente informando o nome da mesma.
git branch feature/funcaoIniciaisEmMinusculas
Se executarmos novamente o comando git branch (sem informar nome algum) teremos a seguinte resposta agora
feature/funcaoIniciaisEmMinusculas
* master
Perceba que o comando acima listou todas as branchs e nos informou que ainda estamos na branch master.
Essa nova branch tem uma copia exata do projeto até agora
Mas, com podemos fazer para mudar para outra branch?
Navegando entre as branchs
O Git nos fornece um comando muito legal e muito fácil de usar que é o git checkout
, com ele podemos navegar entre nossos ramos simplesmente informando para qual ramos desejamos ir.
git checkout feature/funcaoIniciaisEmMinusculas
A resposta desse comando será:
Switched to branch 'feature/funcaoIniciaisEmMinusculas'
Se executarmos o git branch
teremos:
* feature/funcaoIniciaisEmMinusculas
master
Ou seja, agora o asterisco foi movido para a branch feature/funcaoIniciaisEmMinusculas
, indicando que agora estamos nessa branch e qualquer alteração feita nela só existirá nela e não na master ou qualquer outra branch que tenhamos criado até aqui.
Para deixar o exemplo mais interessante, vamos alterar nosso funcoes.php.
<?php
function obterIniciais(string $nomeCompleto) {
$partes = explode(" ", $nomeCompleto);
$iniciais = array_map(function($nome) {
return $nome[0];
}, $partes);
return strtolower(implode("", $iniciais));
}
Vish, mas o que foi modificado ai? Pra mim tá igual a como estava anteriormente. Não?
O Git nos fornecesse uma forma interessante de saber o que foi modificado
git diff
Ao executarmos o comando acima, teremos a seguinte resposta:
diff --git a/funcoes.php b/funcoes.php
index d82652f..2093a67 100644
--- a/funcoes.php
+++ b/funcoes.php
@@ -6,5 +6,5 @@ function obterIniciais(string $nomeCompleto) {
return $nome[0];
}, $partes);
- return implode("", $iniciais);
+ return strtolower(implode("", $iniciais));
}
Tudo que tiver com o sinal de "-" indica o que foi removido e tudo que tiver com sinal de "+" indica o que foi inserido. Ou seja, ele está dizendo que a linha:
return implode("", $iniciais);
foi substituída pela linha:
return strtolower(implode("", $iniciais));
Agora que já sabemos o que foi modificado, vamos adicionar as alterações ao stage e commitar.
git add .
git commit -m "Faz obterIniciais devolver em minúscula"
Ao executar estes comandos, o resultado será:
[feature/funcaoIniciaisEmMinusculas 91030ba] Faz obterIniciais devolver em minúscula
1 file changed, 1 insertion(+), 1 deletion(-)
A partir de agora o nosso ramo feature/funcaoIniciaisEmMinusculas está à frente do ramo master ou seja, ele está mais atualizado que o ramo master. Mas, como podemos ter certeza disso?
Temos um flag legal no comando git log
que pode nos ajudar nessa tarefa:
git log --graph
Ao executar esse comando a resposta será:
* commit 91030ba7324b008e4bdf2e39b79df64b37f13e81 (HEAD -> feature/funcaoIniciaisEmMinusculas)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 15:33:30 2022 -0300
|
| Faz obterIniciais devolver em minúscula
|
* commit 5b90cf90d5bd13761d45727131d4542d2851831c (master)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 14:40:06 2022 -0300
|
| Adiciona um arquivo para as funções
|
* commit fb6ace173e96e23a34417ec47d58ed2f988b10a1
Author: Paulo Reis <acampamentodev@gmail.com>
Date: Sun Aug 7 13:13:53 2022 -0300
Commit inicial
Porém se navegarmos de volta para a branch master e executarmos esse mesmo comando de lá, a resposta será diferente.
git checkout master
git log --graph
Resposta:
* commit 5b90cf90d5bd13761d45727131d4542d2851831c (HEAD -> master)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 14:40:06 2022 -0300
|
| Adiciona um arquivo para as funções
|
* commit fb6ace173e96e23a34417ec47d58ed2f988b10a1
Author: Paulo Reis <acampamentodev@gmail.com>
Date: Sun Aug 7 13:13:53 2022 -0300
Commit inicial
Se você comparar as duas respostas verá que no ramo master o commit "Faz obterIniciais devolver em minúscula" não existe.
Uma coisa que você deve ter percebido aqui é que ao fazer o checkout
para a master, o arquivo funcoes.php voltou para o estado inicial, ou seja, as alterações realizadas na branch feature/funcaoIniciaisEmMinusculas. Será que as alterações foram perdidas? Na verdade não, mas elas só existe lá na outra branch 😎.
Então você deve ter ciência agora que qualquer alteração feita aqui na master, não afetará o código que está na branch feature/funcaoIniciaisEmMinusculas.
Essa isolação de código é benéfica porque assim diversos programadores podem trabalhar em alterações / implementações diferentes sem se preocupar (em partes) com o que está acontecendo na outra branch.
Vamos alterar novamente o arquivo funcoes.php, porém dessa vez aqui na master.
Isso é apenas um exemplo a nível de estudo, na vida real, principalmente em projetos onde temos vários desenvolvedores trabalhando no mesmo código, não realizamos alterações diretamente na master.
<?php
function obterIniciais(string $nomeCompleto) {
$partes = explode(" ", $nomeCompleto);
$iniciais = array_map(function($nome) {
return $nome[0];
}, $partes);
return implode("", $iniciais);
}
function calcularPercentual($total, $percentual) {
return $total * $percentual / 100;
}
Agora vamos novamente adicionar o arquivo e commitar
git add .
git commit -m "Inclui função para calculo percentual"
A resposta será:
[master 90b3d2f] Inclui função para calculo percentual
1 file changed, 4 insertions(+)
Vamos executar o git log --graph
nas duas branchs e ver a resposta.
Master:
* commit 90b3d2f55587cd19fba97847af611072170de0bf (HEAD -> master)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 15:58:16 2022 -0300
|
| Inclui função para calculo percentual
|
* commit 5b90cf90d5bd13761d45727131d4542d2851831c
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 14:40:06 2022 -0300
|
| Adiciona um arquivo para as funções
|
* commit fb6ace173e96e23a34417ec47d58ed2f988b10a1
Author: Paulo Reis <acampamentodev@gmail.com>
Date: Sun Aug 7 13:13:53 2022 -0300
Commit inicial
feature/funcaoIniciaisEmMinusculas:
* commit 91030ba7324b008e4bdf2e39b79df64b37f13e81 (HEAD -> feature/funcaoIniciaisEmMinusculas)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 15:33:30 2022 -0300
|
| Faz obterIniciais devolver em minúscula
|
* commit 5b90cf90d5bd13761d45727131d4542d2851831c
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 14:40:06 2022 -0300
|
| Adiciona um arquivo para as funções
|
* commit fb6ace173e96e23a34417ec47d58ed2f988b10a1
Author: Paulo Reis <acampamentodev@gmail.com>
Date: Sun Aug 7 13:13:53 2022 -0300
Commit inicial
Beleza, dá para ver como esse recurso funciona e realmente é bem legal, mas é chato ficar mudando de branch o tempo todo. Não tem uma forma melhor de fazer isso?
É claro jovem escoteiro 😏
git log --graph --all
A flag --all fala para o git mostrar tudo. O resultado será:
* commit 90b3d2f55587cd19fba97847af611072170de0bf (master)
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 15:58:16 2022 -0300
|
| Inclui função para calculo percentual
|
| * commit 91030ba7324b008e4bdf2e39b79df64b37f13e81 (HEAD -> feature/funcaoIniciaisEmMinusculas)
|/ Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 15:33:30 2022 -0300
|
| Faz obterIniciais devolver em minúscula
|
* commit 5b90cf90d5bd13761d45727131d4542d2851831c
| Author: Paulo Reis <acampamentodev@gmail.com>
| Date: Sun Aug 7 14:40:06 2022 -0300
|
| Adiciona um arquivo para as funções
|
* commit fb6ace173e96e23a34417ec47d58ed2f988b10a1
Author: Paulo Reis <pauloreisprofissional@gmail.com>
Date: Sun Aug 7 13:13:53 2022 -0300
Commit inicial
Perceba que visualmente ele cria um ramo (mesmo que em formato textual) indicando que o commit "Faz obterIniciais devolver em minúscula" está em outra branch.
Beleza, mas em alguma momento eu vou precisar juntar o conteúdo de duas ou mais branch. Como eu posso fazer isso?
É justamente isso que veremos no próximo post. Até lá, escoteiro 🤓!