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.

[[email protected] src]$ git branch new_branch

[[email protected] 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.

[[email protected] src]$ git checkout new_branch
Switched to branch 'new_branch'
[[email protected] 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.

[[email protected] src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[[email protected] 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.

[[email protected] src]$ git branch
master
new_branch
* test_branch

[[email protected] src]$ git checkout master
Switched to branch 'master'

[[email protected] src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Agora, o Git mostrará apenas dois ramos.

[[email protected] 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.

[[email protected] src]$ git branch
* master
new_branch

[[email protected] src]$ git branch -m new_branch wchar_support

Agora, o comando git branch mostrará o novo nome do branch.

[[email protected] 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 -

[[email protected] src]$ git branch
master
* wchar_support

[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src

[[email protected] 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.

[[email protected] src]$ git status -s
M string_operations.c
?? string_operations

[[email protected] src]$ git add string_operations.c

[[email protected] 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.

[[email protected] 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.

[[email protected] src]$ pwd
/home/tom/top_repo/project/src

[[email protected] 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.

[[email protected] project]$ git branch
* master

[[email protected] project]$ pwd
/home/tom/top_repo/project

[[email protected] 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.

[[email protected] project]$ cd src/

[[email protected] 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

[[email protected] 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.

[[email protected] 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.