Git: introdução parte 2

Git básico para principiantes

Este é o segundo post desta sequência. Caso não tenha visto ou queira dar uma revisada confira o post Git: introdução parte 1.

Na parte 1 vimos como:

  • Criar um repositório
  • Adicionar modificações
  • Criar um commit

Aqui  na parte 2 vemos como:

  • Criar um novo branch (ramo)
  • Trocar o branch ativo
  • Merge (fundir) dois branches

Requisitos

Os requisitos continuam os mesmos da parte anterior, portanto nada adicional será necessário.

Como o Git se organiza

Para entender melhor como o Git funciona precisamos de um pouco de teria.

Git é baseia-se em uma árvore direcional acíclica de commits.

Árvore: é uma estrutura de dados onde cada nodo está interligado a zero ou mais nodos pais e pode possuir nodos filhos. No caso do Git os nodos são os commits.

Direcional: Cada nodo da árvore aponta para um nodo pai formando uma sequência. No Git cada commit aponta para seus commits pais, podendo ser zero, um ou mais pais.

Acíclica: Não permite ciclos na árvore, ou seja, um nodo não pode apontar para um nodo filho como sendo seu pai. Para o Git isso implica que não haverá paradoxos sobre o ovo e a galinha.

Criando um novo branch

Para o Git um branch é apenas um pequeno arquivo que especifica qual commit ele aponta.

Para visualizar os branches disponíveis utilize o comando a seguir. A opção -v faz mostrar o ID e a descrição do commit. A estrela no início da linha mostra o branch ativo.

$ git branch -v
* master c5b6a74 Descrição do commit

Para criar um novo branch utilizamos o comando a seguir. Escolha o nome que desejar para seu branch novo.

$ git branch NOME

 

Agora liste os branches disponíveis. Verá que seu novo branch foi criado no mesmo ponto que branch atual.

Caso queira criar um branch em outro commit, basta especificar o ID do commit que deseja.

$ git branch OUTRONOME 23fd25c

Trocar o branch ativo

O branch ativo é aquele que receberá os commits.

Ao criar um branch o Git não ativa ele automaticamente. Para ativar um branch utilize

$ git checkout NOME

Liste os branches disponíveis e verá que agora o outro branch está ativo (com a estrela ao lado dele).

Case quiser criar um branch e ativá-lo, é possível tomar um atalho e fazer isso em um só comando fornecendo a opção -b.

$ git checkout -b NOME

É possível ainda indicar o commit que o branch deve apontar fornecendo o ID do commit após o nome do branch

$ git checkout -b NOME 422948d

Merge dois branches

Merge significa misturar ou fundir. No caso do Git significa aplicar as alterações que ocorreram em um branch em outro.

Fast-forward

Suponhamos que um branch chamado ‘desenvolvimento’ foi criado e que nele foram realizados alguns commits, fazendo com que ele divergisse de branch ‘master’.

Queremos então aplicar estas mesmas alterações no branch ‘master’. Para isso, primeiro ativamos o branch ‘master’ e então realizamos o merge.

$ git checkout -b desenvolvimento
$ # EDITAR ARQUIVO
$ git add .
$ git commit -m 'Descrição do commit...'

$ git checkout master
$ git merge desenvolvimento
Updating 8eca0fb..42a8747
Fast-forward
 1 file changed, 1 insertion(+), 1 deletion(-)

Neste caso obtivemos um merge do tipo ‘fast-forward’, o que indica que no banch ‘master’ não foram realizados commits desde que o branch ‘desenvolvimento’ foi criado.

Recursive

No entanto, quando ambos os branches ‘master’ e ‘desenvolvimento’ recebem commits não é mais possível utilizar um merge fast-forward.

Neste caso é utilizado a técnica recursiva, onde o Git verifica qual o primeiro commit em comum entre os dois branches (o commit onde ocorre a divergência) e calcula as diferenças entre cada branch e aquele commit.

Caso não haja conflitos nas diferenças, ou seja, as diferenças ocorram em partes diferentes dos arquivos, o Git é capaz de unir os dois branches através da técnica recursiva, criando um novo commit que terá como pais ambos os branches utilizados no merge (que será o ponto de convergência dos dois branches).

$ git checkout -b desenvolvimento
$ # EDITAR ARQUIVO
$ git add .
$ git commit -m 'Descrição do commit...'

$ git checkout master
$ # EDITAR ARQUIVO
$ git add .
$ git commit -m 'Descrição deste outro commit...'

$ git merge desenvolvimento
Mesclagem automática
Merge made by the 'recursive' strategy.
 1 file changed, 1 insertion(+), 1 deletion(-)

Conflito

Se na situação anterior alguma parte de um arquivo tivesse sido modificada por ambos os branches teríamos uma situação de conflito. Nesses casos o Git une todas as diferenças sem conflito e marca nos arquivos as seções onde há conflito.

O usuário precisa então resolver as partes conflitantes manualmente.

$ git merge desenvolvimento
Mesclagem automática
CONFLITO (conteúdo): conflito de mesclagem
Automatic merge failed; fix conflicts and then commit the result.

$ git status # Mostra arquivos em conflito
$ # EDITAR ARQUIVOS EM CONFLITO
$ git add .
$ git commit

Concluindo

Diferente de outros sistemas de controle de versão, os branches no Git são muito fáceis de trabalhar e, o melhor de tudo, são muito fáceis de realizar um merge, mesmo em situações de conflito.

Agora, portanto, é possível isolar grandes modificações em diferentes branches, evitando aquela comum bagunça onde o commit anterior não tem nada a ver com o seguinte.

Gostou do post? Curte usar o Git, espalhe a palavra e compartilhe com seus amigos!

 

Djones

 

Deixe uma resposta