Sobre branches, commit IDs, histórico.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 28 Jun 2014 04:36:26 +0000 (01:36 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 28 Jun 2014 04:36:26 +0000 (01:36 -0300)
Um pouco mais sobre branches, os grafos criados pelas relações entre
commits, e amend.

Merge.mdwn [new file with mode: 0644]

diff --git a/Merge.mdwn b/Merge.mdwn
new file mode 100644 (file)
index 0000000..033aec8
--- /dev/null
@@ -0,0 +1,83 @@
+# Merge
+
+Branches permitem experimentar com o repositório, e separar o
+desenvolvimento de novas funcionalidades e correções. Também permite que
+várias pessoas trabalhem no mesmo projeto, através de branches remotos.
+
+Em algum momento, os vários branches devem ser reunidos em uma nova
+versão. Há várias formas de fazê-lo. Uma das ferramentas que o permite é
+o merge. Mas antes, revisaremos e veremos alguns conceitos.
+
+## Branches
+
+Discutimos como criar branches na seção [[Branches]] e como obter
+branches remotos na seção [[Remotes]]. Vejamos, no entanto, porque levam
+esse nome.
+
+A imagem abaixo mostra um repositório com poucos commits. Com exceção do
+primeiro commit, todos os commits em Git possuem um ou mais genitores.
+Isso faz com que a relação entre os commits constitua um grafo acíclico
+dirigido, uma estrutura similar àquela associada a uma árvore
+genealógica.
+
+O exemplo abaixo mostra commits com apenas um genitor. Note, no entanto,
+que há um ramo, representado pelo branch devel. Isto é o que chamamos de
+histórico não-linear. Há formas de linearizar históricos e veremos mais
+adiante as razões para fazê-lo, quando não fazê-lo, e como fazê-lo.
+
+[[!img branches.png]]
+
+## Commit IDs
+
+Vimos em [[Git_log]] que um commit é identificado por um ID. Este ID é
+um hash SHA-1 do objeto do commit. O objeto é composto pelo log, autor,
+data, a árvore de arquivos, outros metadados, e a lista de genitores.
+Dada a natureza de um hash criptográfico como SHA-1, pequenas mudanças
+no commit, seja no sumário, em algum arquivo, genitor, ou outros, causa
+uma mudança no commit ID.
+
+Vejamos como alterar um commit usando a opção --amend do comando git
+commit. Para tanto, criaremos um novo branch a partir do master e
+alteraremos nosso novo HEAD.
+
+       ~/project$ git checkout -b amend master
+       Switched to a new branch 'amend'
+       ~/project$ 
+
+Veja como fica o nosso grafo após o novo branch ser criado na imagem
+abaixo. Note que o grafo continua o mesmo e o branch amend é apenas uma
+referência ao mesmo commit ao qual o branch master se refere.
+
+[[!img branch.png]]
+
+Neste exemplo, alteramos apenas a mensagem de log, usando a opção
+--amend.
+
+       ~/project$ git commit --amend
+       [amend 571a638] Acrescenta lista de arquivos a serem ignorados.
+        1 file changed, 2 insertions(+)
+        create mode 100644 .gitignore
+       ~/project$ 
+
+Note o resultado na figura abaixo. O commit foi alterado, mudando seu
+ID. Ele ainda aponta para o mesmo genitor, mas é um commit diferente
+daquele referenciado pelo branch master.
+
+[[!img amend.png]]
+
+## Histórico
+
+## Fast-foward
+
+## Merge
+
+Integração de código e histórico.
+
+       ~/project$ git merge devel
+       Faz o merge de testes.
+       Merge made by the 'recursive' strategy.
+        Makefile | 3 +++
+        1 file changed, 3 insertions(+)
+       ~/project$ 
+
+[[!img merge.png]]