@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?
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.
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:
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:
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.
Antworten:
Sie suchen
git merge-base
. Verwendungszweck:quelle
git log master...HEAD
--octopus
Flagge übergeben muss, um das richtige Ergebnis zu erzielen. Das Offensichtliche, aber Falschegit 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:ist das gleiche wie:
aber das
...
ist einfacher zu tippen und zu merken.Wie von Dave erwähnt , kann der Sonderfall von
HEAD
weggelassen werden. Damit:ist das gleiche wie:
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 , diemaster
nicht aktiviert sindfeature
.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?quelle
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:Wenn
myfeature
es sich jedoch wie üblich um den aktuellen Zweig handelt, können Sie Folgendes verwenden--fork-point
: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:
quelle
git version 2.14.1.windows.1
. Das Ausführengit 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ährendgit merge-base branch1 branch2
der Gabelpunkt korrekt angezeigt wird. Was könnte das Problem sein?branch2
und dann ausführengit 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:Und dann ist es leicht, den gemeinsamen Vorfahren in der Geschichte der beiden Zweige zu finden.
quelle