Comment obtenir les parents d'un merge commit dans git?

140

Certaines commandes git prennent le parent comme révision; d'autres (comme git revert), comme numéro de parent. Comment obtenir les parents dans les deux cas. Je ne veux pas utiliser la commande de journal graphique car cela nécessite souvent de faire défiler une longue arborescence pour trouver le deuxième parent.

Casebash
la source

Réponses:

179

Simple git log <hash>appelé pour un commit de fusion montre les hachages abrégés de ses parents:

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

git renvoie les parents en fonction de leur numéro: le premier hachage (le plus à gauche) est pour le premier parent, et ainsi de suite.

Si vous ne voulez que les hachages, les deux choix équivalents sont:

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

git rev-list peut également afficher les hachages des parents, bien qu'il répertorie d'abord le hachage pour un commit:

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

Si vous souhaitez examiner les parents, vous pouvez vous y référer directement avec des carats comme <commit>^1et <commit>^2, par exemple:

git show <commit>^1

Cela se généralise; pour une fusion de poulpe, vous pouvez désigner le n ème parent comme <commit>^n. Vous pouvez faire référence à tous les parents avec <commit>^@, bien que cela ne fonctionne pas lorsqu'un seul commit est requis. Des suffixes supplémentaires peuvent apparaître après la n ième syntaxe parent (par exemple <commit>^2^, <commit>^2^@), alors qu'ils ne peuvent pas après ^@( <commit>^@^n'est pas valide). Pour plus d'informations sur cette syntaxe, lisez la rev-parsepage de manuel.

Cascabel
la source
1
Répondre à ma propre question: les résultats de 'git rev-list --parents -n 1 <somehash>' sont: <somehash> <parent1> <parent2>. Ie, les parents sont numérotés.
mikemaccana
Vous pouvez également utiliser git-parents github.com/danielribeiro/dotfiles/blob/master/bin/git-parents . Mettez-le simplement dans votre PATH et appelez $ git parents <commit> (<commit> est par défaut HEAD)
Daniel Ribeiro
@jefromi, je veux vraiment que la partie "Notez également que la sortie normale du journal montre ..." soit en haut de votre réponse. :)
Adam Monsen
3
git loget git showproduire des choses très différentes lorsqu'il n'y a qu'un seul parent. Préférez git logsi vous voulez de la cohérence.
Noel Yap
Cette réponse ne fonctionne pas sur ma machine Ubuntu avec git (v2.17.1). Je ne vois pas de Mergefichier en git log -1sortie.
mja
29

Voici le moyen le plus simple que j'ai trouvé pour afficher les parents d'une fusion

git show --pretty=raw 3706454
user1483344
la source
14
git cat-file -p 3706454 est le même mais encore plus court :)
sabgenton
1
Les deux sont très utiles!
tecknut
Another optiongit log --pretty=raw -1 3706454
selalerer