Ich habe das Gleiche gesucht und bin auf diese Frage gestoßen. Danke, dass Sie sie gestellt haben!
Ich habe jedoch festgestellt, dass die Antworten, die ich hier finde, nicht den Tatsachen entsprechen. ziemlich die Antwort geben, nach der Sie gefragt haben (oder nach der ich gesucht habe) - sie scheinen die G
anstelle der A
verpflichten.
Ich habe also den folgenden Baum erstellt (die Buchstaben sind in chronologischer Reihenfolge zugeordnet), damit ich die Dinge testen kann:
A - B - D - F - G <- "master" branch (at G)
\ \ /
C - E --' <- "topic" branch (still at E)
Das sieht ein wenig anders aus als bei Ihnen, denn ich wollte sicherstellen, dass ich (bezogen auf dieses Diagramm, nicht auf Ihres) B, aber nicht A (und nicht D oder E) erhalte. Hier sind die Buchstaben, die an SHA-Präfixe und Commit-Nachrichten angehängt sind (mein Repo kann geklont werden von aquí (falls das jemanden interessiert):
G: a9546a2 merge from topic back to master
F: e7c863d commit on master after master was merged to topic
E: 648ca35 merging master onto topic
D: 37ad159 post-branch commit on master
C: 132ee2a first commit on topic branch
B: 6aafd7f second commit on master before branching
A: 4112403 initial commit on master
Also, die Ziel: B finden . Hier sind drei Möglichkeiten, die ich nach einigem Herumprobieren gefunden habe:
1. visuell, mit gitk:
Sie sollten einen Baum wie diesen sehen (vom Master aus gesehen):
![gitk screen capture from master]()
oder hier (vom Thema her gesehen):
![gitk screen capture from topic]()
in beiden Fällen habe ich die Übergabe ausgewählt, die B
in meinem Diagramm. Sobald Sie darauf klicken, wird die vollständige SHA in einem Texteingabefeld direkt unter dem Diagramm angezeigt.
2. visuell, aber vom Terminal aus:
git log --graph --oneline --all
(Bearbeitung/Nebenbemerkung: Hinzufügen --decorate
kann auch interessant sein; es fügt einen Hinweis auf Zweignamen, Tags usw. hinzu. Ich füge dies nicht zur obigen Befehlszeile hinzu, da die untenstehende Ausgabe die Verwendung nicht widerspiegelt).
die zeigt (unter der Annahme, dass git config --global color.ui auto
):
![output of git log --graph --oneline --all]()
Oder, im Klartext:
\* a9546a2 merge from topic back to master
|\\
| \* 648ca35 merging master onto topic
| |\\
| \* | 132ee2a first commit on topic branch
\* | | e7c863d commit on master after master was merged to topic
| |/
|/|
\* | 37ad159 post-branch commit on master
|/
\* 6aafd7f second commit on master before branching
\* 4112403 initial commit on master
in beiden Fällen ist die Übergabe 6aafd7f der niedrigste gemeinsame Punkt, d. h. B
in meinem Diagramm, oder A
in Ihrem.
3. Mit Muschelzauber:
Sie haben in Ihrer Frage nicht angegeben, ob Sie etwas wie das oben beschriebene wollen oder einen einzelnen Befehl, der Ihnen nur die eine Revision liefert und sonst nichts. Nun, hier ist das Letztere:
diff -u <(git rev-list --first-parent topic) \
<(git rev-list --first-parent master) | \
sed -ne 's/^ //p' | head -1
6aafd7ff98017c816033df18395c5c1e7829960d
Das können Sie auch in Ihre ~/.gitconfig einfügen als (Hinweis: Der Bindestrich am Ende ist wichtig; danke Brian dafür, dass Sie darauf aufmerksam gemacht haben) :
[alias]
oldest-ancestor = !zsh -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' -
Dies könnte über die folgende (mit Anführungszeichen versehene) Befehlszeile geschehen:
git config --global alias.oldest-ancestor '!zsh -c '\''diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne "s/^ //p" | head -1'\'' -'
Anmerkung: zsh
hätte genauso gut lauten können bash
aber sh
se no Arbeit - die <()
Syntax existiert nicht in Vanille sh
. (Nochmals vielen Dank, @conny, dass du mich in einem Kommentar zu einer anderen Antwort auf dieser Seite darauf aufmerksam gemacht hast!)
Anmerkung: Alternative Version des obigen Textes:
Dank an liori para hinweisend dass das obige Verfahren beim Vergleich identischer Zweige scheitern könnte, und eine alternative diff-Form zu entwickeln, die die sed-Form aus dem Mix entfernt und das Verfahren "sicherer" macht (d.h. es liefert ein Ergebnis (nämlich die jüngste Übergabe), auch wenn man Master mit Master vergleicht):
Als eine .git-config-Zeile:
[alias]
oldest-ancestor = !zsh -c 'diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1' -
Aus der Schale:
git config --global alias.oldest-ancestor '!zsh -c '\''diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1'\'' -'
Also, in meinem Testbaum (der für eine Weile nicht verfügbar war, sorry; er ist wieder da), funktioniert das jetzt sowohl im Master als auch im Topic (mit den Commits G bzw. B). Nochmals vielen Dank, liori, für die alternative Form.
Das ist es, was ich [und Iiori] mir ausgedacht haben. Es scheint für mich zu funktionieren. Es erlaubt auch ein paar zusätzliche Aliasnamen, die sich als nützlich erweisen könnten:
git config --global alias.branchdiff '!sh -c "git diff `git oldest-ancestor`.."'
git config --global alias.branchlog '!sh -c "git log `git oldest-ancestor`.."'
Viel Spaß beim Stöbern!