Wie bekomme ich die Eltern eines Merge Commits in Git?

140

Einige Git-Befehle nehmen das übergeordnete Element als Revision. andere (wie git revert) als übergeordnete Nummer. Wie man die Eltern für beide Fälle bekommt. Ich möchte den Befehl "Grafisches Protokoll" nicht verwenden, da häufig ein langer Baum nach unten gescrollt werden muss, um das zweite übergeordnete Element zu finden.

Casebash
quelle

Antworten:

179

Simple, git log <hash>das für ein Merge-Commit aufgerufen wird, zeigt abgekürzte Hashes seiner Eltern:

 $ git log -1 395f65d
 commit 395f65d438b13fb1fded88a330dc06c3b0951046
 Merge: 9901923 d28790d
 ...

git gibt Eltern entsprechend ihrer Anzahl aus: Der erste (ganz links stehende) Hash ist für den ersten Elternteil und so weiter.

Wenn Sie nur die Hashes wünschen, haben Sie zwei Möglichkeiten:

$ git log --pretty=%P -n 1 <commit>
$ git show -s --pretty=%P <commit>

git rev-list kann auch die Hashes der Eltern anzeigen, obwohl zuerst der Hash für ein Commit aufgelistet wird:

$ git rev-list --parents -n 1 <commit>

Wenn Sie die Eltern untersuchen möchten, können Sie sie direkt mit Karat als <commit>^1und bezeichnen <commit>^2, z.

git show <commit>^1

Dies verallgemeinert; Für eine Octopus-Zusammenführung können Sie sich auf das n- te übergeordnete Element als beziehen <commit>^n. Sie können sich auf alle Eltern mit beziehen <commit>^@, obwohl dies nicht funktioniert, wenn ein einzelnes Commit erforderlich ist. Zusätzliche Suffixe können nach dem n erscheinen th Mutter Syntax (zB <commit>^2^, <commit>^2^@), während sie nicht nach ^@( <commit>^@^nicht gültig). Weitere Informationen zu dieser Syntax finden Sie in der rev-parseManpage.

Cascabel
quelle
1
Beantwortung meiner eigenen Frage: Die Ergebnisse von 'git rev-list --parents -n 1 <somehash>' sind: <somehash> <parent1> <parent2>. Dh die Eltern sind eins nummeriert.
Mikemaccana
Sie können auch git- parent github.com/danielribeiro/dotfiles/blob/master/bin/git-parents verwenden . Tragen Sie es einfach in Ihren PFAD ein und rufen Sie $ git parent <commit> an (<commit> ist standardmäßig HEAD)
Daniel Ribeiro,
@jefromi, ich möchte wirklich, dass der Teil "Beachten Sie auch, dass die normale Protokollausgabe zeigt ..." ganz oben auf Ihrer Antwort steht. :)
Adam Monsen
3
git logund git showsehr unterschiedliche Dinge ausgeben, wenn es nur einen Elternteil gibt. Bevorzugen git logSie, wenn Sie Konsistenz wünschen.
Noel Yap
Diese Antwort funktioniert auf meinem Ubuntu-Computer nicht mit git (v2.17.1). Ich sehe keine MergeDatei in der git log -1Ausgabe.
Mja
29

Das Folgende ist die einfachste Möglichkeit, die Eltern einer Zusammenführung anzuzeigen

git show --pretty=raw 3706454
user1483344
quelle
14
git cat-file -p 3706454 ist das gleiche, aber noch kürzer :)
Sabgenton
1
Beide sind sehr nützlich!
Tecknut
Eine andere Optiongit log --pretty=raw -1 3706454
Selalerer