Como encontrar o ancestral comum mais recente de dois ramos do Git?
Como encontrar o ancestral comum mais recente de dois ramos do Git?
Respostas:
Você está procurando git merge-base. Uso:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopusbandeira para obter o resultado certo. O óbvio, mas errado git merge-base branch1 branch2 branch3, fornecerá uma confirmação, mas, conforme descrito na seção Discussão nos documentos, não é necessariamente um ancestral comum dos três ramos.
git diff master...feature
mostra todos os novos commit do seu ramo de recurso atual (possivelmente com vários commit).
man git-diff documentos que:
git diff A...B
é o mesmo que:
git diff $(git merge-base A B) B
mas ...é mais fácil digitar e lembrar.
Conforme mencionado por Dave , o caso especial de HEADpode ser omitido. Assim:
git diff master...HEAD
é o mesmo que:
git diff master...
o que é suficiente se o ramo atual for feature.
Finalmente, lembre-se de que a ordem é importante! Doing git diff feature...mastermostrará alterações que masternão estão ativadas feature.
Eu gostaria que mais comandos git suportassem essa sintaxe, mas acho que não. 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?
git diff master...no caso especial de diferir paraHEAD
git diff origin/branchname...
Como observado em uma resposta anterior, git merge-basefunciona:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
mas se myfeatureé o ramo 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, nem sempre funciona, no entanto, e não está claro o porquê. Por favor, consulte as limitações observadas no final desta resposta .
Para informações completas sobre confirmação, considere:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1. A execução git merge-base --fork-point branch2com uma ramificação (com seus próprios commits) que eu sei que foi bifurcada na ramificação atual não produz nenhum resultado, enquanto git merge-base branch1 branch2mostra corretamente o ponto de bifurcação. Qual poderia ser o problema?
branch2e, em seguida, execute git merge-base --fork-point branch1.
gitk, etc. para ver como é a árvore. Talvez você obtenha sua resposta.
git merge-base branch1 branch2. Mas o estranho é que isso --fork-pointnão dá nada de qualquer maneira. Você confirmou que funciona para você como pretendido?
Com gitkvocê pode visualizar os dois ramos graficamente:
gitk branch1 branch2
E então é fácil encontrar o ancestral comum na história dos dois ramos.