Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
#3 - Git - Branching e Merging
Rodrigo Branas
rodrigo.branas@agilecode.com.br
http://www.agilecode.com.br
• Arquiteto de Software na Gennera
• Professor na Agile Code
• Autor na Java Magazine e PacktPub
• Palestrante
http://www.youtube.com/rodrigobranas
O que é um branch e quais são
as vantagens de utilizá-lo?
Um branch é uma nova linha de
desenvolvimento que permite isolar o
código de uma nova funcionalidade,
mantendo a linha base estável.
É possível trocar de branch
facilmente, a qualquer momento
Os commits podem continuar
contando a história do projeto
O branch pode ser sincronizado e
compartilhado, evitando perdas
Depois de trabalhar no branch é
necessário realizar um merge
git branch
commit a9ae
tree f4b3
parent
master
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
master
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
master
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
git branch feature1
git branch
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1
No Git, um branch é apenas uma
referência para um commit.
cat .git/refs/heads/master
cat .git/refs/heads/feature1
git log --oneline --decorate
HEAD?
cat .git/HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1HEAD
git checkout feature1
cat .git/HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1 HEAD
Criando um commit no branch...
echo d > d.txt
git add -A
git commit -m "d.txt"
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature1 HEAD
commit a42c
tree ad86
parent b274
git log --oneline --decorate
Trocando de branch, os arquivos
são substituídos
git checkout master
ls -la
git log --oneline --decorate
git log --oneline --decorate --all
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature1 HEAD
commit a42c
tree ad86
parent b274
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature1
commit a42c
tree ad86
parent b274
HEAD
Realizando um merge no
master...
git merge feature1
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature1
commit a42c
tree ad86
parent b274
HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1
commit a42c
tree ad86
parent b274
HEAD
Fast-Forward
A estratégia fast-forward é apenas uma
atualização da referência e só é possível
quando não existe divergência entre
os branches.
git log --oneline --decorate --all
git branch -d feature1
git log --oneline --decorate --all
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature1
commit a42c
tree ad86
parent b274
HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
HEAD
Criando uma divergência entre o
master e o branch...
git branch feature2
git checkout feature2
ou
git checkout -b feature2
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
HEAD
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature2
commit a42c
tree ad86
parent b274
HEAD
echo e > e.txt
git add -A
git commit -m "e.txt"
git log --oneline --decorate --all
commit a9ae
tree f4b3
parent
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature2
commit a42c
tree ad86
parent b274
HEAD
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature2
commit a42c
tree ad86
parent b274
HEAD
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
git checkout master
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
echo f > f.txt
git add -A
git commit -m "f.txt"
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
git log --oneline --decorate --all
git log --oneline --decorate --all --graph
Realizando um merge...
git merge feature2
commit 372d
tree d11b
parent a9ae
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
Recursive
A estratégia recursive é utilizada
quando existe divergência entre os
branches e um commit para unir ambos
se torna necessário.
git log --oneline --decorate --all --graph
git branch -d feature2
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
feature2
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
E se der conflito?
git checkout -b feature3
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
commit 7f64
tree 6300
parent 372d
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
echo g2 > g.txt
git add -A
git commit -m "g.txt"
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
git log --oneline --decorate --all --graph
git checkout master
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
HEAD
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
echo g1 > g.txt
git add -A
git commit -m "g.txt"
commit b274
tree 15eb
parent 7f64
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
commit c85e
tree a1bb
parent cc8a
git merge feature3
git status
git diff
vi g.txt
git add -A
git commit -m "g.txt"
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
commit c85e
tree a1bb
parent cc8a
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
commit c85e
tree a1bb
parent cc8a
commit 270e
tree 82b4
parent c85e
parent c5b5
git log --oneline --decorate --all --graph
git branch -d feature3
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
feature3
commit c5b5
tree 82b4
parent cc8a
HEAD
commit c85e
tree a1bb
parent cc8a
commit 270e
tree 82b4
parent c85e
parent c5b5
master
commit a42c
tree ad86
parent b274
commit fde2
tree a025
parent a42c
commit d67a
tree 10e6
parent a42c
commit cc8a
tree 10e6
parent d67a
parent fde2
commit c5b5
tree 82b4
parent cc8a
HEAD
commit c85e
tree a1bb
parent cc8a
commit 270e
tree 82b4
parent c85e
parent c5b5
Rodrigo Branas
Site: http://www.agilecode.com.br
Twitter: @rodrigobranas
Facebook: http://www.facebook.com/canalrodrigobranas
SlideShare: http://www.slideshare.com/rodrigobranas
YouTube: http://www.youtube.com/rodrigobranas
LinkedIn: http://br.linkedin.com/in/rodrigobranas
+Plus: https://plus.google.com/+RodrigoBranas
GitHub: http://www.github.com/rodrigobranas

#3 - Git - Branching e Merging