Wie finde ich den neuesten gemeinsamen Vorfahren zweier Git-Zweige?
Wie finde ich den neuesten gemeinsamen Vorfahren zweier Git-Zweige?
Antworten:
Sie suchen git merge-base
. Verwendungszweck:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
Flagge übergeben muss, um das richtige Ergebnis zu erzielen. Das Offensichtliche, aber Falsche git merge-base branch1 branch2 branch3
gibt Ihnen ein Commit, aber wie im Abschnitt Diskussion in den Dokumenten beschrieben, ist es nicht unbedingt ein gemeinsamer Vorfahr aller drei Zweige.
git diff master...feature
Zeigt alle neuen Commits Ihres aktuellen (möglicherweise Multi-Commit-) Feature-Zweigs an.
man git-diff
dokumentiert, dass:
git diff A...B
ist das gleiche wie:
git diff $(git merge-base A B) B
aber das ...
ist einfacher zu tippen und zu merken.
Wie von Dave erwähnt , kann der Sonderfall von HEAD
weggelassen werden. Damit:
git diff master...HEAD
ist das gleiche wie:
git diff master...
Das reicht aus, wenn der aktuelle Zweig ist feature
.
Denken Sie zum Schluss daran, dass die Reihenfolge wichtig ist! Wenn Sie dies tun, git diff feature...master
werden Änderungen angezeigt , die master
nicht aktiviert sind feature
.
Ich wünschte, mehr Git-Befehle würden diese Syntax unterstützen, aber ich glaube nicht, dass sie dies tun. Und einige haben sogar unterschiedliche Semantiken für ...
: Was sind die Unterschiede zwischen Doppelpunkt ".." und Dreifachpunkt "..." in Git-Festschreibungsbereichen?
git diff master...
in dem speziellen Fall, dass man sich vonHEAD
git diff origin/branchname...
Wie in einer vorherigen Antwort erwähnt, git merge-base
funktioniert:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Wenn myfeature
es sich jedoch wie üblich um den aktuellen Zweig handelt, können Sie Folgendes verwenden --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Dieses Argument funktioniert nur in ausreichend aktuellen Versionen von git. Leider funktioniert es nicht immer und es ist nicht klar warum. Bitte beachten Sie die Einschränkungen, die am Ende dieser Antwort angegeben sind .
Beachten Sie die vollständigen Informationen zum Festschreiben:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. Das Ausführen git merge-base --fork-point branch2
mit einem Zweig (mit eigenen Commits) , von dem ich weiß, dass er vom aktuellen Zweig gegabelt wurde, führt zu keinem Ergebnis, während git merge-base branch1 branch2
der Gabelpunkt korrekt angezeigt wird. Was könnte das Problem sein?
branch2
und dann ausführen git merge-base --fork-point branch1
.
gitk
usw., um zu sehen, wie der Baum aussieht. Vielleicht bekommst du deine Antwort.
git merge-base branch1 branch2
. Aber was seltsam ist, dass --fork-point
es so oder so nichts gibt. Haben Sie bestätigt, dass es für Sie wie beabsichtigt funktioniert?
Mit können gitk
Sie die beiden Zweige grafisch anzeigen:
gitk branch1 branch2
Und dann ist es leicht, den gemeinsamen Vorfahren in der Geschichte der beiden Zweige zu finden.