Fluxo de Versionamento 
William Lima 
Avanti Agência Digital
Sistema de Controle de 
Versão 
• Controle de histórico 
• Trabalho em equipe 
• Marcação e resgate de versões estáveis 
• Ramificação do Projeto
Por que Git? 
• Distribuído 
• Um clone “completo” vai para a maquina do desenvolvedor. 
• Versionamento local. 
• Modelo de Branch. 
• Fácil: checkout -b <nomeDoBanchFeature> 
• Conveniente: Tente, crie, comite, descarte, volte atrás. 
• Pequeno e Rápido. 
• Processos Locais. 
• Confiabilidade. 
• Efetivo.
Benchmarking 
Não acho justo, mas também é um ponto a se analisar.
Free e Open Source 
• GPLv2 
• Free, e melhor… 
• Free para sempre.
“O software é como sexo, é melhor quando é 
livre.” 
–Linus Torvalds (criador do Linux e Git)
Funções Básicas 
$git init 
Transforma o diretório atual em repositório git. 
$git init <dir> 
Cria um diretório <dir> e transforma em repositório 
git. 
$git clone <repo.git> 
Clona o repositório para maquina local 
$git clone <repo.git> <dir> 
Clona o repositório para maquina o diretório <dir> 
Realiza o commit com a mensagem 
$git status 
Lista arquivos que não estão na área transitória, e 
os arquivos que não estão sendo rastreados. 
$git add <arquivo|dir> 
adiciona as mudanças do arquivo | diretório 
$git reset <arquivo> 
Remove as mudanças do arquivo 
$git commit -m ‘<msg>' 
Realiza o commit com a mensagem 
git blame <arquivo> 
Exibe quem modificou cada linha do arquivo 
<arquivo>, incluindo a data e commit. 
$git diff <commit> 
Exibe a diferença nos arquivos entre o commit 
<commit> e o diretório local
Fluxo Git 
Agora é para complicar!
Fluxo Git 
• Ramificações (Branchs) Principais: 
• Master 
• Desenvolvimento 
• Ramificações de Auxiliares 
• Feature 
• Release 
• Hot-fix
Fluxo Git 
main branches 
Ramificações Principais 
• MASTER: é o código fonte 
principal, deve refletir o que 
está em produção atualmente. 
• DEVELOP: refere-se as 
últimas mudanças para o 
próximo release.
Fluxo Git 
support branches 
Ramificações Auxiliares 
FEATURE 
• Utilizada para novos recursos ou 
releases distantes. 
• Normalmente saem de um brach 
de desenvolvimento. 
• Deve ser feito fundido de volta ao 
branch de desenvolvimento. 
• Convenção de nome do branch: 
<desenvolvedor>-<feature> 
william-galeria
Fluxo Git 
support branches 
Ramificações Auxiliares 
RELEASE 
• Prepara o versionamento para 
produção (número da versão, 
etc). 
• Origem natural: DEVELOP 
• Enviadados para MASTER e 
DEVELOP 
• Convenção de nome do branch: 
release-* 
release-1.0
Fluxo Git 
support branches 
Ramificações Auxiliares 
HOT-FIX 
• Quando é necessário fazer uma 
correção imediata. Bug Crítico. 
• SEMPRE deve ter sua origem na 
versão que está em produção 
atualmente. 
• Deve enviar suas correções para 
MASTER e DEVELOP 
• Convenção de nome do branch: 
hotfix-* 
hotfix-1.2.1
Feature. Como? 
$ git checkout -b myfeature develop 
Switched to a new branch “myfeature” 
• >>>> Faço o que tem fazer 
$ git checkout develop 
Switched to branch 'develop' 
$ git merge --no-ff myfeature 
Updating ea1b82a..05e9557 
(Summary of changes) 
$ git branch -d myfeature 
Deleted branch myfeature (was 05e9557). 
$ git push origin develop
--no-ff 
• Esta flag gera mais um commit 
no merge. 
• Sem ela é impossível 
acompanhar a origem das 
mudanças (de qual branch 
saiu). 
• Sem ela você precisa ler todo 
o log para acompanhar de 
onde cada mudança se 
originou.
Release. Como? 
$ git checkout -b release-1.2 develop 
Switched to a new branch "release-1.2" 
Modifique manualmente os arquivos README, RELEASE, 
NOTES, ETC. 
$ git commit -a -m "Bumped version number to 1.2" 
[release-1.2 74d9424] Bumped version number to 
1.2 
1 files changed, 1 insertions(+), 1 deletions(-)
Fechando o Release. Como? 
Você precisa passar as modificações para o branch principal, o master, e colocar uma tag nesta versão. 
$ git checkout master 
Switched to branch 'master' 
$ git merge --no-ff release-1.2 
Merge made by recursive. 
(Summary of changes) 
Você precisa também garantir que o branch develop seja atualizado com as informações. 
$ git tag -a 1.2 
git checkout develop 
Switched to branch 'develop' 
$ git merge --no-ff release-1.2 
Merge made by recursive. 
(Summary of changes) 
Agora você deve com calma resolver os conflitos de merge. 
Por último excluir o branch release. 
$ git branch -d release-1.2 
Deleted branch release-1.2 (was ff452fe).
Hot-Fix. Como? 
$ git checkout -b hotfix-1.2.1 master 
Switched to a new branch "hotfix-1.2.1" 
Modifique manualmente os arquivos README, RELEASE, NOTES, ETC. 
$ git commit -a -m "Bumped version number to 1.2.1" 
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1 
1 files changed, 1 insertions(+), 1 deletions(-) 
Corrija o bug e faça commit. 
$ git commit -m "Fixed severe production problem" 
[hotfix-1.2.1 abbe5d6] Fixed severe production problem 
5 files changed, 32 insertions(+), 17 deletions(-)
Fechando Hot-Fix. Como? 
Você precisa passar as modificações para o branch principal, o master, e colocar uma tag nesta versão. 
$ git checkout master 
Switched to branch 'master' 
$ git merge --no-ff hotfix-1.2.1 
Merge made by recursive. 
(Summary of changes) 
$ git tag -a 1.2.1 
Você precisa também garantir que o branch develop seja atualizado com as informações. 
$ git checkout develop 
Switched to branch 'develop' 
$ git merge --no-ff hotfix-1.2.1 
Merge made by recursive. 
(Summary of changes) 
Agora você deve com calma resolver os conflitos de merge. 
Por último excluir o branch release. 
git branch -d hotfix-1.2.1 
Deleted branch hotfix-1.2.1 (was abbe5d6).
Referências 
• http://nvie.com/posts/a-successful-git-branching-model/ 
• https://www.atlassian.com/git/workflows#!workflow-gitflow 
• http://learn.github.com/p/tagging.html 
• http://git-scm.com/ 
• http://rogerdudler.github.io/git-guide/index.pt_BR.html 
• http://git-scm.com/book/en/Git-Basics-Tips-and-Tricks 
• http://www.javaworld.com/article/2113465/developer-tools-ideit-smart- 
20-essential-tips-for-/developer-tools-ide/git-smart-20- 
essential-tips-for-git-and-github-users.html

Git - Fluxo do Versionamento adotado

  • 1.
    Fluxo de Versionamento William Lima Avanti Agência Digital
  • 2.
    Sistema de Controlede Versão • Controle de histórico • Trabalho em equipe • Marcação e resgate de versões estáveis • Ramificação do Projeto
  • 3.
    Por que Git? • Distribuído • Um clone “completo” vai para a maquina do desenvolvedor. • Versionamento local. • Modelo de Branch. • Fácil: checkout -b <nomeDoBanchFeature> • Conveniente: Tente, crie, comite, descarte, volte atrás. • Pequeno e Rápido. • Processos Locais. • Confiabilidade. • Efetivo.
  • 4.
    Benchmarking Não achojusto, mas também é um ponto a se analisar.
  • 5.
    Free e OpenSource • GPLv2 • Free, e melhor… • Free para sempre.
  • 6.
    “O software écomo sexo, é melhor quando é livre.” –Linus Torvalds (criador do Linux e Git)
  • 7.
    Funções Básicas $gitinit Transforma o diretório atual em repositório git. $git init <dir> Cria um diretório <dir> e transforma em repositório git. $git clone <repo.git> Clona o repositório para maquina local $git clone <repo.git> <dir> Clona o repositório para maquina o diretório <dir> Realiza o commit com a mensagem $git status Lista arquivos que não estão na área transitória, e os arquivos que não estão sendo rastreados. $git add <arquivo|dir> adiciona as mudanças do arquivo | diretório $git reset <arquivo> Remove as mudanças do arquivo $git commit -m ‘<msg>' Realiza o commit com a mensagem git blame <arquivo> Exibe quem modificou cada linha do arquivo <arquivo>, incluindo a data e commit. $git diff <commit> Exibe a diferença nos arquivos entre o commit <commit> e o diretório local
  • 8.
    Fluxo Git Agoraé para complicar!
  • 9.
    Fluxo Git •Ramificações (Branchs) Principais: • Master • Desenvolvimento • Ramificações de Auxiliares • Feature • Release • Hot-fix
  • 11.
    Fluxo Git mainbranches Ramificações Principais • MASTER: é o código fonte principal, deve refletir o que está em produção atualmente. • DEVELOP: refere-se as últimas mudanças para o próximo release.
  • 12.
    Fluxo Git supportbranches Ramificações Auxiliares FEATURE • Utilizada para novos recursos ou releases distantes. • Normalmente saem de um brach de desenvolvimento. • Deve ser feito fundido de volta ao branch de desenvolvimento. • Convenção de nome do branch: <desenvolvedor>-<feature> william-galeria
  • 13.
    Fluxo Git supportbranches Ramificações Auxiliares RELEASE • Prepara o versionamento para produção (número da versão, etc). • Origem natural: DEVELOP • Enviadados para MASTER e DEVELOP • Convenção de nome do branch: release-* release-1.0
  • 14.
    Fluxo Git supportbranches Ramificações Auxiliares HOT-FIX • Quando é necessário fazer uma correção imediata. Bug Crítico. • SEMPRE deve ter sua origem na versão que está em produção atualmente. • Deve enviar suas correções para MASTER e DEVELOP • Convenção de nome do branch: hotfix-* hotfix-1.2.1
  • 16.
    Feature. Como? $git checkout -b myfeature develop Switched to a new branch “myfeature” • >>>> Faço o que tem fazer $ git checkout develop Switched to branch 'develop' $ git merge --no-ff myfeature Updating ea1b82a..05e9557 (Summary of changes) $ git branch -d myfeature Deleted branch myfeature (was 05e9557). $ git push origin develop
  • 17.
    --no-ff • Estaflag gera mais um commit no merge. • Sem ela é impossível acompanhar a origem das mudanças (de qual branch saiu). • Sem ela você precisa ler todo o log para acompanhar de onde cada mudança se originou.
  • 18.
    Release. Como? $git checkout -b release-1.2 develop Switched to a new branch "release-1.2" Modifique manualmente os arquivos README, RELEASE, NOTES, ETC. $ git commit -a -m "Bumped version number to 1.2" [release-1.2 74d9424] Bumped version number to 1.2 1 files changed, 1 insertions(+), 1 deletions(-)
  • 19.
    Fechando o Release.Como? Você precisa passar as modificações para o branch principal, o master, e colocar uma tag nesta versão. $ git checkout master Switched to branch 'master' $ git merge --no-ff release-1.2 Merge made by recursive. (Summary of changes) Você precisa também garantir que o branch develop seja atualizado com as informações. $ git tag -a 1.2 git checkout develop Switched to branch 'develop' $ git merge --no-ff release-1.2 Merge made by recursive. (Summary of changes) Agora você deve com calma resolver os conflitos de merge. Por último excluir o branch release. $ git branch -d release-1.2 Deleted branch release-1.2 (was ff452fe).
  • 20.
    Hot-Fix. Como? $git checkout -b hotfix-1.2.1 master Switched to a new branch "hotfix-1.2.1" Modifique manualmente os arquivos README, RELEASE, NOTES, ETC. $ git commit -a -m "Bumped version number to 1.2.1" [hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1 1 files changed, 1 insertions(+), 1 deletions(-) Corrija o bug e faça commit. $ git commit -m "Fixed severe production problem" [hotfix-1.2.1 abbe5d6] Fixed severe production problem 5 files changed, 32 insertions(+), 17 deletions(-)
  • 21.
    Fechando Hot-Fix. Como? Você precisa passar as modificações para o branch principal, o master, e colocar uma tag nesta versão. $ git checkout master Switched to branch 'master' $ git merge --no-ff hotfix-1.2.1 Merge made by recursive. (Summary of changes) $ git tag -a 1.2.1 Você precisa também garantir que o branch develop seja atualizado com as informações. $ git checkout develop Switched to branch 'develop' $ git merge --no-ff hotfix-1.2.1 Merge made by recursive. (Summary of changes) Agora você deve com calma resolver os conflitos de merge. Por último excluir o branch release. git branch -d hotfix-1.2.1 Deleted branch hotfix-1.2.1 (was abbe5d6).
  • 22.
    Referências • http://nvie.com/posts/a-successful-git-branching-model/ • https://www.atlassian.com/git/workflows#!workflow-gitflow • http://learn.github.com/p/tagging.html • http://git-scm.com/ • http://rogerdudler.github.io/git-guide/index.pt_BR.html • http://git-scm.com/book/en/Git-Basics-Tips-and-Tricks • http://www.javaworld.com/article/2113465/developer-tools-ideit-smart- 20-essential-tips-for-/developer-tools-ide/git-smart-20- essential-tips-for-git-and-github-users.html