Git - Gerenciando Ramos
A operação de filial permite criar outra linha de desenvolvimento. Podemos usar essa operação para separar o processo de desenvolvimento em duas direções diferentes. Por exemplo, lançamos um produto para a versão 6.0 e podemos querer criar um branch para que o desenvolvimento dos recursos do 7.0 possam ser mantidos separados das correções de bugs do 6.0.
Criar Filial
Tom cria um novo branch usando o comando git branch <branch name>. Podemos criar um novo ramo a partir de um existente. Podemos usar um commit ou tag específico como ponto de partida. Se qualquer ID de confirmação específico não for fornecido, o branch será criado com HEAD como seu ponto de partida.
[jerry@CentOS src]$ git branch new_branch
[jerry@CentOS src]$ git branch
* master
new_branch
Uma nova ramificação é criada; Tom usou o comando git branch para listar os branches disponíveis. Git mostra uma marca de asterisco antes do branch atualmente retirado.
A representação pictórica da operação de criação de ramificação é mostrada abaixo -
Alternar entre ramos
Jerry usa o comando git checkout para alternar entre ramos.
[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch
Atalho para criar e trocar de filial
No exemplo acima, usamos dois comandos para criar e alternar ramos, respectivamente. Git fornece–bopção com o comando checkout; esta operação cria uma nova ramificação e muda imediatamente para a nova ramificação.
[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'
[jerry@CentOS src]$ git branch
master
new_branch
* test_branch
Excluir uma filial
Um branch pode ser excluído fornecendo a opção –D com o comando git branch. Mas antes de excluir o branch existente, mude para o outro branch.
Jerry está atualmente no test_branche ele deseja remover esse galho. Então ele muda o branch e exclui o branch como mostrado abaixo.
[jerry@CentOS src]$ git branch
master
new_branch
* test_branch
[jerry@CentOS src]$ git checkout master
Switched to branch 'master'
[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).
Agora, o Git mostrará apenas dois ramos.
[jerry@CentOS src]$ git branch
* master
new_branch
Renomear uma filial
Jerry decide adicionar suporte para caracteres largos em seu projeto de operações de string. Ele já criou um novo branch, mas o nome do branch não é apropriado. Então, ele muda o nome do branch usando–m opção seguida por old branch name e a new branch name.
[jerry@CentOS src]$ git branch
* master
new_branch
[jerry@CentOS src]$ git branch -m new_branch wchar_support
Agora, o comando git branch mostrará o novo nome do branch.
[jerry@CentOS src]$ git branch
* master
wchar_support
Mesclar dois ramos
Jerry implementa uma função para retornar o comprimento da string de uma string de caracteres larga. O novo código aparecerá da seguinte forma -
[jerry@CentOS src]$ git branch
master
* wchar_support
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS src]$ git diff
O comando acima produz o seguinte resultado -
t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
+
const wchar_t *p = s;
+
+
while (*p)
+ ++p;
+ return (p - s);
+
}
Após o teste, ele confirma e envia suas alterações para o novo branch.
[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations
[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'
[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)
Observe que Jerry está empurrando essas mudanças para o novo branch, e é por isso que ele usou o nome do branch wchar_support ao invés de master ramo.
[jerry@CentOS src]$ git push origin wchar_support <−−− Observer branch_name
O comando acima produzirá o seguinte resultado.
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support
Depois de confirmar as alterações, o novo branch aparecerá da seguinte forma -
Tom está curioso para saber o que Jerry está fazendo em sua agência privada e verifica o registro do wchar_support ramo.
[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
[tom@CentOS src]$ git log origin/wchar_support -2
O comando acima produzirá o seguinte resultado.
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530
Added w_strlen function to return string lenght of wchar_t string
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
Ao visualizar as mensagens de confirmação, Tom percebe que Jerry implementou a função strlen para caracteres amplos e deseja a mesma funcionalidade no branch master. Em vez de reimplementar, ele decide pegar o código de Jerry mesclando seu branch com o branch master.
[tom@CentOS project]$ git branch
* master
[tom@CentOS project]$ pwd
/home/tom/top_repo/project
[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
Após a operação de mesclagem, o branch master aparecerá da seguinte forma -
Agora, o galho wchar_supportfoi mesclado com o branch master. Podemos verificar isso vendo a mensagem de confirmação ou vendo as modificações feitas no arquivo string_operation.c.
[tom@CentOS project]$ cd src/
[tom@CentOS src]$ git log -1
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse
Date: Wed Sep 11 16:10:06 2013 +0530
Added w_strlen function to return string lenght of wchar_t string
[tom@CentOS src]$ head -12 string_operations.c
O comando acima produzirá o seguinte resultado.
#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
const wchar_t *p = s;
while (*p)
++p;
return (p - s);
}
Após o teste, ele envia suas alterações de código para o branch master.
[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master
Ramificações de rebase
O comando Git rebase é um comando branch merge, mas a diferença é que ele modifica a ordem dos commits.
O comando Git merge tenta colocar os commits de outros branches no topo do HEAD do branch local atual. Por exemplo, seu branch local tem commits A−> B−> C−> D e o branch merge tem commits A−> B−> X−> Y, então git merge irá converter o branch local atual em algo como A−> B−> C−> D−> X−> Y
O comando Git rebase tenta descobrir o ancestral comum entre o branch local atual e o branch merge. Em seguida, ele envia os commits para o branch local, modificando a ordem dos commits no branch local atual. Por exemplo, se seu branch local tem commits A−> B−> C−> D e o branch merge tem commits A−> B−> X−> Y, então o rebase Git irá converter o branch local atual para algo como A− > B−> X−> Y−> C−> D.
Quando vários desenvolvedores trabalham em um único repositório remoto, você não pode modificar a ordem dos commits no repositório remoto. Nesta situação, você pode usar a operação rebase para colocar seus commits locais no topo dos commits do repositório remoto e você pode enviar essas mudanças.