2009-10-10 12 views
568

Jak znaleźć najnowszego wspólnego przodka dwóch gałęzi Git?Znajdź najnowszy wspólny przodek dwóch gałęzi Git

+3

Definiowanie najnowsza: czas rzeczywisty świat, liczbę zatwierdzeń, inne metryki? –

+2

Odnośne (krzyżowanie krzyżowe): http://stackoverflow.com/questions/26370185/how-do-criss-cross-merges-arise-in-git – Jubobs

Odpowiedz

661

Szukasz git merge-base. Zastosowanie:

$ git merge-base branch2 branch3 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 
+58

Należy zauważyć, że znajduje to najnowszy wspólny przodek ... który Uważam, że jest to, czego chce pytający, więc +1. Zauważając to, na wypadek gdyby ktoś tu przyszedł, próbując znaleźć * najstarszego * wspólnego przodka (tak jak ja) - dla którego zobacz także: http://stackoverflow.com/questions/1527234/finding-a-branch-point -with-git – lindes

+1

Prawdopodobnie tego szukał, ale strona man nie gwarantuje, że będzie najnowsza ani w czasie rzeczywistym, ani w liczbie zatwierdzeń: tylko, że będzie to jeden z najlepszych wspólnych przodków. –

+0

Myślę, że będę używał tego małego fragmentu: '$ (git merge-base master HEAD)'. Na przykład: 'git log $ (git merge-base HEAD master) .. HEAD' – funroll

-1

Po nabyciu wspólny przodek SHA mogą być stosowane, na przykład, aby wyświetlić dostępne rewizje na pilocie, tak:

#!/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 
+2

Wydaje się to dość styczne w stosunku do tego, co zostało zadane. –

17

git diff master...feature

pokazy wszystkie nowe zatwierdzenia twojej aktualnej gałęzi (prawdopodobnie wielokrotnego zatwierdzenia).

man git-diff dokumenty:

git diff A...B 

jest taka sama, jak:

git diff $(git merge-base A B) B 

ale ... łatwiej jest wpisać i zapamiętać.

Jak wspomniano by Dave, specjalny przypadek HEAD można pominąć. Więc:

git diff master...HEAD 

jest taka sama, jak:

git diff master... 

co wystarcza, jeśli bieżąca gałąź jest feature.

Wreszcie, pamiętaj, że kolejność ma znaczenie! Wykonanie git diff feature...master spowoduje wyświetlenie zmian, które są na master, a nie na feature.

Chciałbym, aby więcej poleceń git obsługiwało tę składnię, ale nie sądzę, że tak. A niektóre nawet mają różne semantykę dla ...: What are the differences between double-dot ".." and triple-dot "..." in Git commit ranges?

+5

Lub po prostu 'git diff master ...' w szczególnym przypadku diffing do 'HEAD' – Dave

4

Z gitk można zobaczyć dwa oddziały graficznie:

gitk branch1 branch2 

i wtedy jest to łatwe do znalezienia wspólnego przodka w historii obu oddziałów.

+1

Nie wszystko można zrobić wizualnie w każdym przypadku. Istnieją powody, dla których może być konieczne automatyczne programowanie. – ADTC

9

Jak wspomniano we wcześniejszej odpowiedzi, git merge-base utwory:

$ git merge-base myfeature develop 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

ale jeśli myfeature jest obecny oddział, co jest powszechne, można użyć użytku --fork-point:

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

Ten argument działa tylko w odpowiednio nowszych wersjach gita. Zobacz także this answer.


Dla pełnej popełnienia informacji, należy rozważyć:

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

Mam 'git wersji 2.14.1.windows.1'. Uruchamianie 'git merge-base --fork-point branch2' z odgałęzieniem _ (z własnymi commitami) _ że ** Wiem ** rozwidlało się z bieżącej gałęzi nie daje żadnego wyniku, podczas gdy' git merge-base branch1 branch2' poprawnie pokazuje punkt rozwidlenia. Jaki może być problem? – ADTC

+0

@ADTC Kasa 'branch2', a następnie uruchom' git merge-base --fork-point branch1'. –

+0

Tak, zrobiłem to. Nic nie pojawiło się ponownie. – ADTC

Powiązane problemy