#3 - git - branching e merging
TRANSCRIPT
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
#3 - Git - Branching e Merging
Rodrigo [email protected]
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 HEADcommit 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 HEADcommit 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
feature1commit 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
feature1commit 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 feature1commit 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 feature1commit 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
mastercommit 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
mastercommit 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 feature2commit 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 feature2commit 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 feature2commit 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 feature2commit 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 feature2commit 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
feature2commit a42c tree ad86 parent b274
commit fde2 tree a025 parent a42c
HEADcommit 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
feature2commit a42c tree ad86 parent b274
commit fde2 tree a025 parent a42c
HEADcommit d67a tree 10e6 parent a42c
commit 7f64 tree 6300 parent 372d
commit b274 tree 15eb parent 7f64
master
feature2commit a42c tree ad86 parent b274
commit fde2 tree a025 parent a42c
HEADcommit d67a tree 10e6 parent a42c
commit 7f64 tree 6300 parent 372d
commit b274 tree 15eb parent 7f64
master
feature2commit 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
feature2commit 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
feature3commit 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
feature3commit 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
feature3commit 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
feature3commit 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
feature3commit 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
feature3commit c5b5 tree 82b4 parent cc8a
HEADcommit 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
feature3commit c5b5 tree 82b4 parent cc8a
HEADcommit 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
feature3commit 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
feature3commit 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