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?
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.
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
"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
Você quer fazer uma correção, então crie um "fixbranch" que é ramificado a partir do mestre
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
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.
Agora fixbranch está atualizado com o master central, deixe-me mesclar fixbranch no branch master
Terminei! deixe-me empurrar o mestre local para o mestre central
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
fonte