SlideShare uma empresa Scribd logo
1 de 74
Baixar para ler offline
git fail --force
faça as pazes com seus pull requests
Carlos Duarte Do Nascimento
@chesterbr • http://chester.me
Vamos codar!
Ops...
WTF?
Impressão: ou é “bê-a-bá”...
Hovertext:“If that doesn't fix it, git.txt
contains the phone number of a friend
of mine who understands git.
Just wait through a few minutes of 'It's
really pretty simple, just think of
branches as...' and eventually you'll learn
the commands that will fix everything.”
Git - 30/Out/2015
https://xkcd.com/1597/
Nem leigo, nem especialista
Um bom profissional busca aprender os
conceitos por trás das suas ferramentas
e ganhar experiência no seu uso
“Regrinhas”
● “Dá git pull de vez em quando”
● “Nunca use git pull”
● “Sempre dê rebase”
● “Nunca dê rebase”
Onde isso vai dar?
Proposta
Revisitar conceitos do git olhando
para um fluxo de trabalho típico,
evitando o excesso de teoria
e o abuso das “receitas de bolo”
Carlos Duarte Do Nascimento
(Chester)
@chesterbr • http://chester.me
Não-especialista em git
https://www.shopify.com/careers
Git
Um sistema que ajuda pessoas a
trabalhar com código-fonte de forma
organizada e simultânea
Commit
Quando uma mudança significativa
acontece, você leva ela para o palco
(stage) e tira uma fotografia (commit)
A92347C2…1F2493E34: Muda cor do botão Enviar
DescriçãoID
Commit == fotografia
“Git is all about composing and saving
snapshots of your project and then
working with and comparing those
snapshots”
http://gitref.org/basic/
Branch
Commits formam uma linha do tempo
Você pode criar linhas alternativas
(branches) e depois integrar as
mudanças na linha principal (master)
Trabalho em grupo
Seus commits “moram” em um
repositório local (.git/)
Você pode mandar (push) commits para
outros repositórios (remotes)
e também baixar commits deles (pull)
Grupo organizado
Existem várias formas de organizar esse
fluxo de commits/branches (workflows)
Um repositório central que
facilite code reviews por meio
de pull requests ajuda bastante...
Exemplo de workflow
● Atualiza master (remote ⇒ local)
● Novo branch a partir dali
● Commits evolutivos
● Push e PR (meu branch ⇒ master)
●
● Merge, auto-deploy,
Mas e se...
● ...o CI* falhou?
● ...outros devs sugerem mudanças?
● ...o master mudou enquanto isso?
*Continuous Integration
Conflito!
Imagem:: Ernani D’Almeida /VEJA
Merge manual
$ git checkout master
$ git pull
$ git checkout meu-branch
...
$ git commit
$ git push
...
$ git push --force
#SQN
Sempre pode piorar
● Conflitos que não resolvem
● Commits estranhos no meu PR
● O commit está lá, o código não
● O botão continua cinza
● ...
A culpa é dela:
Receita de Bolo
$ git checkout master
$ git pull
$ git checkout meu-branch
...
$ git commit
$ git push
...
$ git push --force
O que fazer então?
Entender o que acontece num pull
request para rastrear as possíveis
causas dos problemas
Pull request
Pull Merge request
“wants to merge?”
git merge
Incorpora os commits feitos em outro
branch no atual, sem modificá-los
(um commit extra no final
consolida as mudanças)
Quando pode dar errado?
Consolidar mudanças feitas em dois
históricos fica complexo na medida
em que eles divergem
Evitando o problema
Quando possível, fazer branches
menores, isolados e de curta duração
git rebase
Refaz o branch a partir do mesmo
ponto (ou não), criando novos commits
iguais aos originais (ou não)
Utilidades do rebase
● (re-)basear suas mudanças num
master mais atualizado
(git fetch; git rebase origin/master)
● Simplificar os seus commits
(git rebase --interactive master)
Quando pode dar errado?
Atualizar o branch e simplificar
commits ao mesmo tempo é difícil
Refazer um branch que já está
publicado causa incompatibilidades
Sugestão pré-PR (1)
Refaça seu branch a partir de um
master mais recente
(sem modificar os commits)
git checkout master
git pull
git checkout meu-branch
git rebase master
Sugestão pré-PR (2)
Agora que você reduziu a chance de
conflito, simplifique o branch
(sem modificar a origem)
git rebase –interactive master
Sugestão ≠ regra
Se o master não mudou (muito),
não precisa atualizar
Se os seus commits estão claros,
não precisa interagir
E se o PR já foi?
Novos commits podem ser
adicionados ao remote via git push
Rebase não é tão simples...
Rebase muda o passado!!!
(hmm... e daí?)
Image © Universal Studios.All rights Reserved
Isso é um problema?
git pull de um branch que teve
rebase tem que trocar tudo o que está
no remote pelo novo histórico
(por isso o --force)
E vai ter commits novos?
Se o workflow diz que só o criador faz
commits no PR, rebases feitos naquele
branch não causam problemas
Evitando problemas
Não mude a origem e o conteúdo dos
commits ao mesmo tempo
Um commit extra dá menos dor de
cabeça que um rebase
O master é sagrado!
Branches e pull requests só são
relevantes enquanto existem
E se a casa já caiu?
git diff & git apply
git diff c1 c2 cria (na saída padrão)
o patch que transforma c1 em c2
git apply aplica um patch qualquer na
sua cópia do código
Automatizando
Ao invés de refazer as mudanças
manualmente, você pode gerar um
patch delas com o git diff e dar um
git apply dele no código mais recente
git log & git reflog
git log lista os commits feitos no
branch atual (--grep faz buscas)
git reflog lista as operações que
alteraram o repositório local
#comofas
1.Ache o commit do master a partir
do qual o branch foi criado
git log git reflog
#comofas
2.Ache o seu último commit
git log --grep • git reflog
#comofas
3. Crie o patch que leva do commit
origem até o seu commit final
git diff origem final > /tmp/patch.txt
IDs (hexa)
#comofas
4. Crie um branch novo a partir do
master atualizado com o servidor
git checkout master
git pull
git checkout -b branch-novo
#comofas
5.Aplique o patch nos seus arquivos
arquivos e crie um commit
git apply /tmp/patch.txt
...
git add .
git commit -am “Refiz tudo ;-)”
#comofas
6. Coloque o branch novo no lugar do
velho (local e remotamente)
git checkout master
git branch -D meu-branch
git branch -m branch-novo meu-branch
git checkout meu-branch
git push –-set-upstream origin meu-branch
--force
Corre pro abraço!
Conclusões
Você não precisa saber tudo sobre git,
mas sim entender bem alguns conceitos
(ex.: commit, branch, merge, rebase)
Escuta o tio
Escuta o tio
Obrigado!
Carlos Duarte Do Nascimento
@chesterbr • http://chester.me
shopify.com/careers
http://slideshare.net/chesterbr
Bonus stage
Além da linha de comando
Uma ferramenta gráfica é produtiva se
você entende os comandosconceitos
por trás das facilidades
gitk
GitHub Desktop
Tig
Mantenha-se atualizado
git pull --rebase --autostash
git < 2.9:
gem install git-up
git up
~/.gitignore
Se o seu computador é o único que
gera “lixo”, use um .gitignore global
git config --global
core.excludesfile ~/.gitignore
git cherry-pick
Cria um commit no seu branch com
as mudanças de outro commit
(por exemplo, de outro branch)
git cherry-pick id
Obrigado!
Carlos Duarte Do Nascimento
@chesterbr • http://chester.me
shopify.com/careers
http://slideshare.net/chesterbr
This presentation is available under the Creative Commons “by-nc” 3.0 license
(available at https://creativecommons.org/licenses/by-nc/3.0/),
noticing the exceptions below.
Images and text from third parties were included (with due credits wherever possible)
under a fair use assumption (or, for Brazilian media, under Art. 46 of Law 9610/98)
and/or under their respective licenses. Omissions are unintended and corrections
welcome. Such content is excluded from the license above.
GitHub, the GitHub logo and mascot are trademarks of GitHub, Inc.
Shopify and the Shopify logo are trademaks of Shopify, Inc.
The opinions stated here belong solely to the author, not offically representing his
employer’s opinions, nor any of of the persons or companies mentioned in any extent.
Credits And License

Mais conteúdo relacionado

Mais procurados

Existe Vida além do FTP!
Existe Vida além do FTP! Existe Vida além do FTP!
Existe Vida além do FTP! Gustavo Pereira
 
Gitlab flow solo (minimo)
Gitlab flow solo (minimo)Gitlab flow solo (minimo)
Gitlab flow solo (minimo)viniciusban
 
Mini curso Git - 2º dia
Mini curso Git - 2º diaMini curso Git - 2º dia
Mini curso Git - 2º diaArmando Couto
 
Controle de versionamento com Git
Controle de versionamento com GitControle de versionamento com Git
Controle de versionamento com GitRaphael Cruzeiro
 
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019Tchelinux
 
Gitlab flow solo (pt-BR)
Gitlab flow solo (pt-BR)Gitlab flow solo (pt-BR)
Gitlab flow solo (pt-BR)viniciusban
 
MINI CURSO DE GIT NA UECE – 3º DIA
MINI CURSO DE GIT NA UECE – 3º DIAMINI CURSO DE GIT NA UECE – 3º DIA
MINI CURSO DE GIT NA UECE – 3º DIAArmando Couto
 
Estratégias para o uso de integração e entrega contínua com gocd
Estratégias para o uso de integração e entrega contínua com gocdEstratégias para o uso de integração e entrega contínua com gocd
Estratégias para o uso de integração e entrega contínua com gocdWalmyr Lima e Silva Filho
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Stefan Teixeira
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorStefan Teixeira
 
Introdução ao GitHub e Git
Introdução ao GitHub  e GitIntrodução ao GitHub  e Git
Introdução ao GitHub e GitIgor Steinmacher
 

Mais procurados (20)

Existe Vida além do FTP!
Existe Vida além do FTP! Existe Vida além do FTP!
Existe Vida além do FTP!
 
Git flow no projeto
Git flow no projetoGit flow no projeto
Git flow no projeto
 
Gitlab flow solo (minimo)
Gitlab flow solo (minimo)Gitlab flow solo (minimo)
Gitlab flow solo (minimo)
 
Controle de versão com Git
Controle de versão com GitControle de versão com Git
Controle de versão com Git
 
Introdução ao Git
Introdução ao GitIntrodução ao Git
Introdução ao Git
 
Gitlab flow
Gitlab flowGitlab flow
Gitlab flow
 
Git conceitos
Git conceitosGit conceitos
Git conceitos
 
Mini curso Git - 2º dia
Mini curso Git - 2º diaMini curso Git - 2º dia
Mini curso Git - 2º dia
 
Git e GitHub - Conceitos Básicos
Git e GitHub - Conceitos BásicosGit e GitHub - Conceitos Básicos
Git e GitHub - Conceitos Básicos
 
Controle de versionamento com Git
Controle de versionamento com GitControle de versionamento com Git
Controle de versionamento com Git
 
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019
Git em pequenos projetos - Sandro Custódio - Tchelinux Livramento 2019
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
Gitlab flow solo (pt-BR)
Gitlab flow solo (pt-BR)Gitlab flow solo (pt-BR)
Gitlab flow solo (pt-BR)
 
MINI CURSO DE GIT NA UECE – 3º DIA
MINI CURSO DE GIT NA UECE – 3º DIAMINI CURSO DE GIT NA UECE – 3º DIA
MINI CURSO DE GIT NA UECE – 3º DIA
 
Estratégias para o uso de integração e entrega contínua com gocd
Estratégias para o uso de integração e entrega contínua com gocdEstratégias para o uso de integração e entrega contínua com gocd
Estratégias para o uso de integração e entrega contínua com gocd
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
 
Git e GitHub
Git e GitHubGit e GitHub
Git e GitHub
 
Introdução ao GitHub e Git
Introdução ao GitHub  e GitIntrodução ao GitHub  e Git
Introdução ao GitHub e Git
 
Git e Github
Git e GithubGit e Github
Git e Github
 

Semelhante a Como resolver problemas comuns em pull requests no Git

Controle de Versão com Git e como Otimizar seu Workflow com Git Flow
Controle de Versão com Git e como Otimizar seu Workflow com Git FlowControle de Versão com Git e como Otimizar seu Workflow com Git Flow
Controle de Versão com Git e como Otimizar seu Workflow com Git FlowLucas Araújo Mezêncio
 
Controle de Versões com Git
Controle de Versões com GitControle de Versões com Git
Controle de Versões com GitVagner Santana
 
Processo de desenvolvimento na samba
Processo de desenvolvimento na sambaProcesso de desenvolvimento na samba
Processo de desenvolvimento na sambajoaogmaciel
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareAldson Diego
 
Minicurso GIT PET Computação
Minicurso GIT PET ComputaçãoMinicurso GIT PET Computação
Minicurso GIT PET ComputaçãoBruno Orlandi
 
Rogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJRogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJNathália Cruz de Oliveira
 
GIT - Gerenciamento de Projeto e Versionamento Semântico
GIT - Gerenciamento de Projeto e Versionamento SemânticoGIT - Gerenciamento de Projeto e Versionamento Semântico
GIT - Gerenciamento de Projeto e Versionamento SemânticoDjanilson Alves
 
Rogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJRogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJNathália Cruz de Oliveira
 
Introdução ao git
Introdução ao gitIntrodução ao git
Introdução ao gitDiogo Gomes
 
Git para quem gosta de git
Git para quem gosta de gitGit para quem gosta de git
Git para quem gosta de gitEduardo Bohrer
 
Minicurso GIT 2022 - SENAC
Minicurso GIT 2022 - SENACMinicurso GIT 2022 - SENAC
Minicurso GIT 2022 - SENACDanilo Pinotti
 
Usando Git na Unity - Gaming For All 2021
Usando Git na Unity - Gaming For All 2021Usando Git na Unity - Gaming For All 2021
Usando Git na Unity - Gaming For All 2021Erik Cruz
 
Introdução ao Git
Introdução ao GitIntrodução ao Git
Introdução ao GitOto Junior
 

Semelhante a Como resolver problemas comuns em pull requests no Git (20)

Controle de Versão com Git e como Otimizar seu Workflow com Git Flow
Controle de Versão com Git e como Otimizar seu Workflow com Git FlowControle de Versão com Git e como Otimizar seu Workflow com Git Flow
Controle de Versão com Git e como Otimizar seu Workflow com Git Flow
 
Controle de Versões com Git
Controle de Versões com GitControle de Versões com Git
Controle de Versões com Git
 
Git 101
Git 101Git 101
Git 101
 
GIT: O Commit, o Fluxo e a Tag
GIT: O Commit, o Fluxo e a TagGIT: O Commit, o Fluxo e a Tag
GIT: O Commit, o Fluxo e a Tag
 
Processo de desenvolvimento na samba
Processo de desenvolvimento na sambaProcesso de desenvolvimento na samba
Processo de desenvolvimento na samba
 
Git v2
Git v2Git v2
Git v2
 
Git ...ftw!
Git ...ftw!  Git ...ftw!
Git ...ftw!
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de Software
 
Minicurso GIT PET Computação
Minicurso GIT PET ComputaçãoMinicurso GIT PET Computação
Minicurso GIT PET Computação
 
Rogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJRogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJ
 
GIT - Hands-On
GIT - Hands-On GIT - Hands-On
GIT - Hands-On
 
GIT - Gerenciamento de Projeto e Versionamento Semântico
GIT - Gerenciamento de Projeto e Versionamento SemânticoGIT - Gerenciamento de Projeto e Versionamento Semântico
GIT - Gerenciamento de Projeto e Versionamento Semântico
 
Rogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJRogue Snail Talk - Usando Git na Game Jam - WGJ
Rogue Snail Talk - Usando Git na Game Jam - WGJ
 
Git
GitGit
Git
 
Introdução ao git
Introdução ao gitIntrodução ao git
Introdução ao git
 
Git para quem gosta de git
Git para quem gosta de gitGit para quem gosta de git
Git para quem gosta de git
 
Minicurso GIT 2022 - SENAC
Minicurso GIT 2022 - SENACMinicurso GIT 2022 - SENAC
Minicurso GIT 2022 - SENAC
 
Usando Git na Unity - Gaming For All 2021
Usando Git na Unity - Gaming For All 2021Usando Git na Unity - Gaming For All 2021
Usando Git na Unity - Gaming For All 2021
 
Git
GitGit
Git
 
Introdução ao Git
Introdução ao GitIntrodução ao Git
Introdução ao Git
 

Mais de Carlos Duarte do Nascimento

Mais de Carlos Duarte do Nascimento (11)

git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)
 
ruby2600 - an Atari 2600 emulator written in Ruby
ruby2600 - an Atari 2600 emulator written in Rubyruby2600 - an Atari 2600 emulator written in Ruby
ruby2600 - an Atari 2600 emulator written in Ruby
 
Atari 2600 VCS Programming
Atari 2600 VCS ProgrammingAtari 2600 VCS Programming
Atari 2600 VCS Programming
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Programação para Atari 2600
Programação para Atari 2600Programação para Atari 2600
Programação para Atari 2600
 
Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)
 
Aplicativos Mobile: Da Idéia ao Produto (ou não)
Aplicativos Mobile: Da Idéia ao Produto (ou não)Aplicativos Mobile: Da Idéia ao Produto (ou não)
Aplicativos Mobile: Da Idéia ao Produto (ou não)
 
Apontador API (para programadores Python)
Apontador API (para programadores Python)Apontador API (para programadores Python)
Apontador API (para programadores Python)
 
Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0
 
Cruzalinhas - Palestra Relâmpago no Fisl 11
Cruzalinhas - Palestra Relâmpago no Fisl 11Cruzalinhas - Palestra Relâmpago no Fisl 11
Cruzalinhas - Palestra Relâmpago no Fisl 11
 
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
 

Como resolver problemas comuns em pull requests no Git

  • 1. git fail --force faça as pazes com seus pull requests Carlos Duarte Do Nascimento @chesterbr • http://chester.me
  • 5.
  • 6.
  • 7. Impressão: ou é “bê-a-bá”...
  • 8.
  • 9.
  • 10. Hovertext:“If that doesn't fix it, git.txt contains the phone number of a friend of mine who understands git. Just wait through a few minutes of 'It's really pretty simple, just think of branches as...' and eventually you'll learn the commands that will fix everything.” Git - 30/Out/2015 https://xkcd.com/1597/
  • 11. Nem leigo, nem especialista Um bom profissional busca aprender os conceitos por trás das suas ferramentas e ganhar experiência no seu uso
  • 12. “Regrinhas” ● “Dá git pull de vez em quando” ● “Nunca use git pull” ● “Sempre dê rebase” ● “Nunca dê rebase”
  • 14. Proposta Revisitar conceitos do git olhando para um fluxo de trabalho típico, evitando o excesso de teoria e o abuso das “receitas de bolo”
  • 15. Carlos Duarte Do Nascimento (Chester) @chesterbr • http://chester.me Não-especialista em git
  • 17.
  • 18. Git Um sistema que ajuda pessoas a trabalhar com código-fonte de forma organizada e simultânea
  • 19. Commit Quando uma mudança significativa acontece, você leva ela para o palco (stage) e tira uma fotografia (commit) A92347C2…1F2493E34: Muda cor do botão Enviar DescriçãoID
  • 20. Commit == fotografia “Git is all about composing and saving snapshots of your project and then working with and comparing those snapshots” http://gitref.org/basic/
  • 21. Branch Commits formam uma linha do tempo Você pode criar linhas alternativas (branches) e depois integrar as mudanças na linha principal (master)
  • 22. Trabalho em grupo Seus commits “moram” em um repositório local (.git/) Você pode mandar (push) commits para outros repositórios (remotes) e também baixar commits deles (pull)
  • 23. Grupo organizado Existem várias formas de organizar esse fluxo de commits/branches (workflows) Um repositório central que facilite code reviews por meio de pull requests ajuda bastante...
  • 24. Exemplo de workflow ● Atualiza master (remote ⇒ local) ● Novo branch a partir dali ● Commits evolutivos ● Push e PR (meu branch ⇒ master) ● ● Merge, auto-deploy,
  • 25. Mas e se... ● ...o CI* falhou? ● ...outros devs sugerem mudanças? ● ...o master mudou enquanto isso? *Continuous Integration
  • 27. Merge manual $ git checkout master $ git pull $ git checkout meu-branch ... $ git commit $ git push ... $ git push --force
  • 28. #SQN
  • 29. Sempre pode piorar ● Conflitos que não resolvem ● Commits estranhos no meu PR ● O commit está lá, o código não ● O botão continua cinza ● ...
  • 30. A culpa é dela:
  • 31. Receita de Bolo $ git checkout master $ git pull $ git checkout meu-branch ... $ git commit $ git push ... $ git push --force
  • 32. O que fazer então? Entender o que acontece num pull request para rastrear as possíveis causas dos problemas
  • 35. git merge Incorpora os commits feitos em outro branch no atual, sem modificá-los (um commit extra no final consolida as mudanças)
  • 36. Quando pode dar errado? Consolidar mudanças feitas em dois históricos fica complexo na medida em que eles divergem
  • 37. Evitando o problema Quando possível, fazer branches menores, isolados e de curta duração
  • 38. git rebase Refaz o branch a partir do mesmo ponto (ou não), criando novos commits iguais aos originais (ou não)
  • 39. Utilidades do rebase ● (re-)basear suas mudanças num master mais atualizado (git fetch; git rebase origin/master) ● Simplificar os seus commits (git rebase --interactive master)
  • 40. Quando pode dar errado? Atualizar o branch e simplificar commits ao mesmo tempo é difícil Refazer um branch que já está publicado causa incompatibilidades
  • 41. Sugestão pré-PR (1) Refaça seu branch a partir de um master mais recente (sem modificar os commits) git checkout master git pull git checkout meu-branch git rebase master
  • 42. Sugestão pré-PR (2) Agora que você reduziu a chance de conflito, simplifique o branch (sem modificar a origem) git rebase –interactive master
  • 43. Sugestão ≠ regra Se o master não mudou (muito), não precisa atualizar Se os seus commits estão claros, não precisa interagir
  • 44. E se o PR já foi? Novos commits podem ser adicionados ao remote via git push Rebase não é tão simples...
  • 45. Rebase muda o passado!!! (hmm... e daí?) Image © Universal Studios.All rights Reserved
  • 46. Isso é um problema? git pull de um branch que teve rebase tem que trocar tudo o que está no remote pelo novo histórico (por isso o --force)
  • 47. E vai ter commits novos? Se o workflow diz que só o criador faz commits no PR, rebases feitos naquele branch não causam problemas
  • 48. Evitando problemas Não mude a origem e o conteúdo dos commits ao mesmo tempo Um commit extra dá menos dor de cabeça que um rebase
  • 49. O master é sagrado! Branches e pull requests só são relevantes enquanto existem
  • 50. E se a casa já caiu?
  • 51. git diff & git apply git diff c1 c2 cria (na saída padrão) o patch que transforma c1 em c2 git apply aplica um patch qualquer na sua cópia do código
  • 52. Automatizando Ao invés de refazer as mudanças manualmente, você pode gerar um patch delas com o git diff e dar um git apply dele no código mais recente
  • 53. git log & git reflog git log lista os commits feitos no branch atual (--grep faz buscas) git reflog lista as operações que alteraram o repositório local
  • 54. #comofas 1.Ache o commit do master a partir do qual o branch foi criado git log git reflog
  • 55. #comofas 2.Ache o seu último commit git log --grep • git reflog
  • 56. #comofas 3. Crie o patch que leva do commit origem até o seu commit final git diff origem final > /tmp/patch.txt IDs (hexa)
  • 57. #comofas 4. Crie um branch novo a partir do master atualizado com o servidor git checkout master git pull git checkout -b branch-novo
  • 58. #comofas 5.Aplique o patch nos seus arquivos arquivos e crie um commit git apply /tmp/patch.txt ... git add . git commit -am “Refiz tudo ;-)”
  • 59. #comofas 6. Coloque o branch novo no lugar do velho (local e remotamente) git checkout master git branch -D meu-branch git branch -m branch-novo meu-branch git checkout meu-branch git push –-set-upstream origin meu-branch --force
  • 61. Conclusões Você não precisa saber tudo sobre git, mas sim entender bem alguns conceitos (ex.: commit, branch, merge, rebase)
  • 64. Obrigado! Carlos Duarte Do Nascimento @chesterbr • http://chester.me shopify.com/careers http://slideshare.net/chesterbr
  • 66. Além da linha de comando Uma ferramenta gráfica é produtiva se você entende os comandosconceitos por trás das facilidades
  • 67. gitk
  • 69. Tig
  • 70. Mantenha-se atualizado git pull --rebase --autostash git < 2.9: gem install git-up git up
  • 71. ~/.gitignore Se o seu computador é o único que gera “lixo”, use um .gitignore global git config --global core.excludesfile ~/.gitignore
  • 72. git cherry-pick Cria um commit no seu branch com as mudanças de outro commit (por exemplo, de outro branch) git cherry-pick id
  • 73. Obrigado! Carlos Duarte Do Nascimento @chesterbr • http://chester.me shopify.com/careers http://slideshare.net/chesterbr
  • 74. This presentation is available under the Creative Commons “by-nc” 3.0 license (available at https://creativecommons.org/licenses/by-nc/3.0/), noticing the exceptions below. Images and text from third parties were included (with due credits wherever possible) under a fair use assumption (or, for Brazilian media, under Art. 46 of Law 9610/98) and/or under their respective licenses. Omissions are unintended and corrections welcome. Such content is excluded from the license above. GitHub, the GitHub logo and mascot are trademarks of GitHub, Inc. Shopify and the Shopify logo are trademaks of Shopify, Inc. The opinions stated here belong solely to the author, not offically representing his employer’s opinions, nor any of of the persons or companies mentioned in any extent. Credits And License