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

74
git fail --force faça as pazes com seus pull requests Carlos Duarte Do Nascimento @chesterbr • http://chester.me

Upload: carlos-duarte-do-nascimento

Post on 21-Jan-2017

67 views

Category:

Software


0 download

TRANSCRIPT

git fail --forcefaç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.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”

Onde isso vai dar?

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

https://www.shopify.com/careers

Git

Um sistema que ajuda pessoas atrabalhar 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 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

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 pullrequest para rastrear as possíveis

causas dos problemas

Pull request

Pull Merge request

“wants to merge?”

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

Evitando o problema

Quando possível, fazer branchesmenores, isolados e de curta duração

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...

Rebase muda o passado!!!

(hmm... e daí?)Image © Universal Studios. All rights Reserved

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

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 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

1. Ache o commit do master a partirdo 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 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

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 sevocê 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 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