Como encontrar o ancestral comum mais recente de dois ramos Git?

Como encontrar o ancestral comum mais recente de dois ramos Git?

Você está procurando por git merge-base . Uso:

 $ git merge-base branch2 branch3 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

git diff master...feature

mostra todos os novos commits do seu branch atual (possivelmente multi-commit).

man git-diff documenta que:

 git diff A...B 

é o mesmo que:

 git diff $(git merge-base AB) B 

mas o ... é mais fácil de digitar e lembrar.

Como mencionado por Dave , o caso especial de HEAD pode ser omitido. Assim:

 git diff master...HEAD 

é o mesmo que:

 git diff master... 

o que é suficiente se o ramo atual é feature .

Finalmente, lembre-se que a ordem é importante! Fazendo o git diff feature...master mostrará as mudanças que estão no master não no feature .

Eu gostaria que mais comandos git suportassem essa syntax, mas eu não acho que eles façam. E alguns até têm semânticas diferentes para ... : Quais são as diferenças entre o ponto duplo “..” e o ponto triplo “…” nos intervalos de confirmação do Git?

Como observado em uma resposta anterior, o git merge-base funciona:

 $ git merge-base myfeature develop 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

mas se myfeature for o branch atual, como é comum, você pode usar use --fork-point :

 $ git merge-base --fork-point develop 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

Este argumento funciona apenas em versões suficientemente recentes do git. Infelizmente, isso nem sempre funciona, e não está claro o porquê. Por favor, consulte as limitações observadas no final desta resposta .


Para informações de confirmação completas, considere:

 $ git log -1 $(git merge-base --fork-point develop) 

Com o gitk você pode ver as duas ramificações graficamente:

 gitk branch1 branch2 

E então é fácil encontrar o ancestral comum na história dos dois ramos.

Uma vez adquirido, o ancestral comum SHA pode ser usado, por exemplo, para visualizar os commits disponíveis no remoto, da seguinte forma:

 #!/bin/bash git remote update REMBR=`git show-remote-branch` REMHEAD=`git rev-parse $REMBR` MERGEBASE=`git merge-base HEAD $REMBR` REMURL=`git config remote.origin.url` git request-pull $MERGEBASE $REMURL $REMHEAD