Como evitar o inferno de merge-commit no GitHub / BitBucket

100

Estamos terminando com muitos commits como este em nosso repo:

Merge branch 'master' of bitbucket.org:user/repo

Isso acontece sempre que um desenvolvedor sincroniza seu fork local com o repositório de nível superior.

Existe alguma maneira de evitar que esse inferno de merge-commit atrapalhe todo o repo log? É possível evitá-los ao iniciar as solicitações pull de alguma forma?

Eu sei que posso fazer git rebase se isso for feito na minha VM local apenas, há alguma equivalência na IU do GitHub / BitBucket?

Como vocês fazem isso?

Niklas9
fonte

Respostas:

135

Rebase de ramificações de recursos antes de mesclar

Se quiser evitar os commits de mesclagem, você precisa garantir que todos os commits sejam encaminhados rapidamente. Você faz isso certificando-se de que seu branch de recurso seja realocado corretamente em sua linha de desenvolvimento antes de uma fusão como esta:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase também tem muitos sinalizadores, incluindo rebase interativo com o -isinalizador, mas você pode não precisar disso se estiver mantendo as coisas o mais simples possível e quiser preservar todo o seu histórico de branch em uma fusão.

Use a --ff-onlybandeira

Além de rebasing, o uso da --ff-onlybandeira irá garantir que apenas os commits de avanço rápido sejam permitidos. Um commit não será feito se, em vez disso, for um commit de mesclagem. A página do manual git-merge (1) diz:

--ff-only

Recuse-se a mesclar e saia com um status diferente de zero, a menos que o HEAD atual já esteja atualizado ou a mesclagem possa ser resolvida como um avanço rápido.

Todd A. Jacobs
fonte
1
Esta é uma ótima resposta. Eu uso o rebase sempre que possível. Eu não sabia sobre o sinalizador --ff-only. Muito legal!
Leo Correa
3
Obrigado pelos conselhos de rebase e --ff-only. No entanto, como disse na minha pergunta, como posso fazer isso dentro da IU do GitHub / BitBucket?
Niklas9
3
@Niklas Tenho certeza de que você precisará recorrer ao CLI para fazer o que quiser. O GitHub não expõe todo o poder do Git; apenas um subconjunto de seus recursos, mais algumas agregações de valor gráficas e de redes sociais. Boa sorte!
Todd A. Jacobs
3
Uma coisa a notar com este processo é que, antes de mesclar o branch de tópico (feature / foo) de volta ao master, é melhor você git pull origin master (se estiver usando um remoto), para garantir que o branch master esteja atualizado . Se as atualizações forem encontradas, certifique-se de rebase novamente o master no branch do tópico antes de mesclá-lo de volta no master.
chikamichi
19
@CodeGnome não chame isso de "recorrer" à CLI ... na realidade, você deveria estar avisando sobre "recorrer" à IU!
Droogans
9

"Todd A. Jacobs" já mencionou "rebase" é o conceito aqui. Esta é apenas uma maneira mais detalhada de fazer as coisas.

Digamos que você esteja no branch master

$ git branch
  * master

Você quer fazer uma correção, então crie um "fixbranch" que é ramificado a partir do mestre

$ git checkout -b fixbranch

Talvez você trabalhasse por alguns dias neste branch e tivesse alguns commits.

O dia em que você quis enviar seus commits para o repositório mestre central! Faça check-out do mestre e obtenha as últimas alterações do repositório mestre central

$ git checkout master
$ git pull origin master

Realize o rebase de seu fixbranch com o master para ter um histórico limpo e resolver os conflitos, se houver, no próprio repo local.

$ git checkout fixbranch
$ git rebase master

Agora fixbranch está atualizado com o master central, deixe-me mesclar fixbranch no branch master

 $ git checkout master
 $ git merge fixbranch

Terminei! deixe-me empurrar o mestre local para o mestre central

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
fonte
Agradeço esta resposta.
lasec0203