Git: Finde den neuesten gemeinsamen Vorfahren zweier Zweige

844

Wie finde ich den neuesten gemeinsamen Vorfahren zweier Git-Zweige?

Ted
quelle
3
Zuletzt definieren: Echtzeit, Anzahl der Commits, andere Metrik?
Ciro Santilli 法轮功 病毒 审查 六四 事件 17
2
Relevant (Cross-Cross- Merges
jub0bs
1
@CiroSantilli 中心 改造 6 996ICU 六四 事件 es ist in jeder Metrik gleich, nicht wahr?
YakovL
@YakovL Ich glaube nein wegen der Verzweigung und weil Sie beliebige Festschreibungsdaten für Ihre Festschreibungsobjekte festlegen können: Dieses Datum selbst ist wahrscheinlich nicht das, was Sie wollen.
Ciro Santilli 法轮功 病毒 审查 六四 事件 19
1
@CiroSantilli 中心 改造 6 996ICU 六四 事件 Es scheint mir, dass dies nur anders sein kann, wenn vor dem letzten gemeinsamen Commit im Baum ein Commit mit einem älteren Zeitstempel vorhanden ist. Können Sie ein weniger triviales Beispiel liefern?
YakovL

Antworten:

1019

Sie suchen git merge-base. Verwendungszweck:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
CB Bailey
quelle
85
Beachten Sie, dass dies den neuesten gemeinsamen Vorfahren findet ... was meiner Meinung nach der Fragesteller will, also +1. Nur um es zu erwähnen, falls jemand hierher kommt und versucht, den ältesten gemeinsamen Vorfahren zu finden (wie ich) - siehe auch: stackoverflow.com/questions/1527234/…
lindes
16
@funroll: Oder die Abkürzung dafür:git log master...HEAD
CB Bailey
17
@indes wäre der älteste gemeinsame Vorfahr nicht das anfängliche Commit?
Thorbjørn Ravn Andersen
8
@ ThorbjørnRavnAndersen, ja, ich nehme an, das ist so ... Die Schwierigkeit bei der Beschreibung liegt in der Tatsache, dass git einen gerichteten azyklischen Graphen verwendet und dennoch oft als Baum betrachtet wird, was es technisch nicht ist. Um in meinem Wortlaut vorsichtiger zu sein, habe ich über den Fall gesprochen, in dem das übergeordnete Element der ersten Instanz der "Zweige" divergieren soll ... da sie möglicherweise mehrere Punkte haben, an denen sie wieder zusammengeführt und neu aufgeteilt werden der "älteste" von diesen, aber nicht wirklich der älteste Vorfahr, der (glaube ich) immer das anfängliche Commit ist.
Lindes
5
Während es bei dieser Frage ausschließlich darum geht, einen gemeinsamen Vorfahren von zwei Zweigen zu finden, sollte jeder, der den gemeinsamen Vorfahren von drei oder mehr Zweigen haben möchte, beachten, dass er die --octopusFlagge übergeben muss, um das richtige Ergebnis zu erzielen. Das Offensichtliche, aber Falsche git merge-base branch1 branch2 branch3gibt Ihnen ein Commit, aber wie im Abschnitt Diskussion in den Dokumenten beschrieben, ist es nicht unbedingt ein gemeinsamer Vorfahr aller drei Zweige.
Mark Amery
46

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 HEADweggelassen 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...masterwerden Änderungen angezeigt , die masternicht 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?

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
8
Oder nur git diff master...in dem speziellen Fall, dass man sich vonHEAD
Dave
das "..." hat bei mir in Powershell nicht funktioniert, lustig, es hat in der Git-Konsole funktioniert, vielleicht war das Repo nicht vollständig, Git Diff $ (Git Merge-Base AB) B hat funktioniert und da ich ein bisschen neu in Git bin Ich war ein bisschen skeptisch, dass dies die Zweige zusammenführen könnte :)
Moiz Ahmed
1
Beeindruckend. ziemlich beeindruckend. und wenn die gewünschte Filiale in Ihrem lokalen Repo nicht vorhanden ist, weil Sie sie nie ausgecheckt haben, können Sie dies einfach tungit diff origin/branchname...
Mark Ch
25

Wie in einer vorherigen Antwort erwähnt, git merge-basefunktioniert:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

Wenn myfeaturees 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) 
Scharfsinn
quelle
Ich habe git version 2.14.1.windows.1. Das Ausführen git merge-base --fork-point branch2mit 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 branch2der Gabelpunkt korrekt angezeigt wird. Was könnte das Problem sein?
ADTC
@ADTC Checkout branch2und dann ausführen git merge-base --fork-point branch1.
Acumenus
@ADTC Verwenden Sie einen grafischen Commit-Viewer, z. B. gitkusw., um zu sehen, wie der Baum aussieht. Vielleicht bekommst du deine Antwort.
Acumenus
Ich sehe nichts Seltsames an dem Baum, wenn ich ihn grafisch betrachte. Ich kann die Pfade verfolgen und den gemeinsamen Vorfahren finden, der zum Ergebnis von passt git merge-base branch1 branch2. Aber was seltsam ist, dass --fork-pointes so oder so nichts gibt. Haben Sie bestätigt, dass es für Sie wie beabsichtigt funktioniert?
ADTC
1
Ich bekomme das gleiche wie @ADTC. Der Befehl 'git log -1 $ (git merge-base --fork-point anotherBranch)' zeigt mit git Version 2.16.2.windows.1 kein Ergebnis an.
Masinger
10

Mit können gitkSie die beiden Zweige grafisch anzeigen:

gitk branch1 branch2

Und dann ist es leicht, den gemeinsamen Vorfahren in der Geschichte der beiden Zweige zu finden.

Martin G.
quelle
6
Nicht alles kann in jedem Fall visuell gemacht werden. Es gibt Gründe, warum Dinge möglicherweise programmgesteuert automatisiert werden müssen.
ADTC