git fail --force (faça as pazes com seus pull requests)
TRANSCRIPT
git fail --forcefaça as pazes com seus pull requests
Carlos Duarte Do Nascimento@chesterbr • http://chester.me
Hovertext: “If that doesn't fix it, git.txtcontains 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 ofbranches as...' and eventually you'll learnthe commands that will fix everything.”
Git - 30/Out/2015https://xkcd.com/1597/
Nem leigo, nem especialista
Um bom profissional busca aprender osconceitos 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”
Proposta
Revisitar conceitos do git olhandopara um fluxo de trabalho típico,
evitando o excesso de teoriae o abuso das “receitas de bolo”
Carlos Duarte Do Nascimento(Chester)
@chesterbr • http://chester.meNão-especialista em git
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 savingsnapshots of your project and thenworking 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 grupoSeus commits “moram” em um
repositório local (.git/)
Você pode mandar (push) commits paraoutros repositórios (remotes)
e também baixar commits deles (pull)
Grupo organizadoExistem várias formas de organizar essefluxo de commits/branches (workflows)
Um repositório central quefacilite 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
Merge manual$ git checkout master$ git pull$ git checkout meu-branch...$ git commit$ git push...$ git push --force
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● ...
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 pullrequest para rastrear as possíveis
causas dos problemas
git merge
Incorpora os commits feitos em outrobranch no atual, sem modificá-los
(um commit extra no finalconsolida as mudanças)
Quando pode dar errado?
Consolidar mudanças feitas em doishistóricos fica complexo na medida
em que eles divergem
git rebase
Refaz o branch a partir do mesmoponto (ou não), criando novos commits
iguais aos originais (ou não)
Utilidades do rebase
● (re-)basear suas mudanças nummaster mais atualizado(git fetch; git rebase origin/master)
● Simplificar os seus commits(git rebase --interactive master)
Quando pode dar errado?
Atualizar o branch e simplificarcommits 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 deconflito, 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 seradicionados ao remote via git push
Rebase não é tão simples...
Isso é um problema?
git pull de um branch que teverebase 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 fazcommits no PR, rebases feitos naquele
branch não causam problemas
Evitando problemas
Não mude a origem e o conteúdo doscommits ao mesmo tempo
Um commit extra dá menos dor decabeça que um rebase
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 nasua cópia do código
Automatizando
Ao invés de refazer as mudançasmanualmente, você pode gerar um
patch delas com o git diff e dar umgit apply dele no código mais recente
git log & git reflog
git log lista os commits feitos nobranch atual (--grep faz buscas)
git reflog lista as operações quealteraram o repositório local
#comofas
3. Crie o patch que leva do commitorigem até o seu commit final
git diff origem final > /tmp/patch.txt
IDs (hexa)
#comofas
4. Crie um branch novo a partir domaster atualizado com o servidor
git checkout mastergit pull
git checkout -b branch-novo
#comofas
5. Aplique o patch nos seus arquivosarquivos e crie um commit
git apply /tmp/patch.txt...git add .git commit -am “Refiz tudo ;-)”
#comofas6. 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
Conclusões
Você não precisa saber tudo sobre git,mas sim entender bem alguns conceitos
(ex.: commit, branch, merge, rebase)
Obrigado!
Carlos Duarte Do Nascimento@chesterbr • http://chester.me
shopify.com/careers
http://slideshare.net/chesterbr
Além da linha de comando
Uma ferramenta gráfica é produtiva sevocê entende os comandosconceitos
por trás das facilidades
~/.gitignore
Se o seu computador é o único quegera “lixo”, use um .gitignore global
git config --globalcore.excludesfile ~/.gitignore
git cherry-pick
Cria um commit no seu branch comas 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 hisemployer’s opinions, nor any of of the persons or companies mentioned in any extent.
Credits And License