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

git fail --force (faça as pazes com seus pull requests)

  • 1.
    git fail --force façaas pazes com seus pull requests Carlos Duarte Do Nascimento @chesterbr • http://chester.me
  • 2.
  • 3.
  • 4.
  • 7.
    Impressão: ou é“bê-a-bá”...
  • 10.
    Hovertext:“If that doesn'tfix 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, nemespecialista Um bom profissional busca aprender os conceitos por trás das suas ferramentas e ganhar experiência no seu uso
  • 12.
    “Regrinhas” ● “Dá gitpull de vez em quando” ● “Nunca use git pull” ● “Sempre dê rebase” ● “Nunca dê rebase”
  • 13.
  • 14.
    Proposta Revisitar conceitos dogit olhando para um fluxo de trabalho típico, evitando o excesso de teoria e o abuso das “receitas de bolo”
  • 15.
    Carlos Duarte DoNascimento (Chester) @chesterbr • http://chester.me Não-especialista em git
  • 16.
  • 18.
    Git Um sistema queajuda pessoas a trabalhar com código-fonte de forma organizada e simultânea
  • 19.
    Commit Quando uma mudançasignificativa 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 “Gitis 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 umalinha do tempo Você pode criar linhas alternativas (branches) e depois integrar as mudanças na linha principal (master)
  • 22.
    Trabalho em grupo Seuscommits “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áriasformas 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
  • 26.
  • 27.
    Merge manual $ gitcheckout master $ git pull $ git checkout meu-branch ... $ git commit $ git push ... $ git push --force
  • 28.
  • 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.
  • 31.
    Receita de Bolo $git checkout master $ git pull $ git checkout meu-branch ... $ git commit $ git push ... $ git push --force
  • 32.
    O que fazerentão? Entender o que acontece num pull request para rastrear as possíveis causas dos problemas
  • 33.
  • 34.
  • 35.
    git merge Incorpora oscommits feitos em outro branch no atual, sem modificá-los (um commit extra no final consolida as mudanças)
  • 36.
    Quando pode darerrado? Consolidar mudanças feitas em dois históricos fica complexo na medida em que eles divergem
  • 37.
    Evitando o problema Quandopossível, fazer branches menores, isolados e de curta duração
  • 38.
    git rebase Refaz obranch 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 darerrado? 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çaseu 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) Agoraque você reduziu a chance de conflito, simplifique o branch (sem modificar a origem) git rebase –interactive master
  • 43.
    Sugestão ≠ regra Seo master não mudou (muito), não precisa atualizar Se os seus commits estão claros, não precisa interagir
  • 44.
    E se oPR já foi? Novos commits podem ser adicionados ao remote via git push Rebase não é tão simples...
  • 45.
    Rebase muda opassado!!! (hmm... e daí?) Image © Universal Studios.All rights Reserved
  • 46.
    Isso é umproblema? 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 tercommits 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 mudea 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 acasa 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 derefazer 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 commitdo 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 opatch que leva do commit origem até o seu commit final git diff origem final > /tmp/patch.txt IDs (hexa)
  • 57.
    #comofas 4. Crie umbranch novo a partir do master atualizado com o servidor git checkout master git pull git checkout -b branch-novo
  • 58.
    #comofas 5.Aplique o patchnos seus arquivos arquivos e crie um commit git apply /tmp/patch.txt ... git add . git commit -am “Refiz tudo ;-)”
  • 59.
    #comofas 6. Coloque obranch 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
  • 60.
  • 61.
    Conclusões Você não precisasaber tudo sobre git, mas sim entender bem alguns conceitos (ex.: commit, branch, merge, rebase)
  • 62.
  • 63.
  • 64.
    Obrigado! Carlos Duarte DoNascimento @chesterbr • http://chester.me shopify.com/careers http://slideshare.net/chesterbr
  • 65.
  • 66.
    Além da linhade comando Uma ferramenta gráfica é produtiva se você entende os comandosconceitos por trás das facilidades
  • 67.
  • 68.
  • 69.
  • 70.
    Mantenha-se atualizado git pull--rebase --autostash git < 2.9: gem install git-up git up
  • 71.
    ~/.gitignore Se o seucomputador é o único que gera “lixo”, use um .gitignore global git config --global core.excludesfile ~/.gitignore
  • 72.
    git cherry-pick Cria umcommit no seu branch com as mudanças de outro commit (por exemplo, de outro branch) git cherry-pick id
  • 73.
    Obrigado! Carlos Duarte DoNascimento @chesterbr • http://chester.me shopify.com/careers http://slideshare.net/chesterbr
  • 74.
    This presentation isavailable 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