188 votes

Comment puis-je savoir si un commit est un descendant d'une autre de commettre?

Avec Git, comment puis-je savoir si un commit dans ma branche est un descendant d'une autre de commettre?

327voto

Matt R Points 1837

À partir de Git version 1.8.0, c'est pris en charge comme une option pour merge-base:

git merge-base --is-ancestor <commit> <commit>

À partir de la page de man:

--est-ancêtre

Vérifiez si le premier est un ancêtre de la deuxième , et à la sortie avec l'état 0 si la valeur est true, ou avec l'état 1 si pas. Les erreurs sont signalé par un état différent de zéro qui n'est pas 1.

Par exemple:

git merge-base --is-ancestor origin/master master; echo $?

62voto

Jakub Narębski Points 87537

Si vous voulez vérifier par programme (par exemple, dans le script), vous pouvez vérifier si git merge-base A B est égal à git rev-parse --verify A (alors accessible à partir de B), ou si c'est git rev-parse --verify B (alors B est accessible à partir d'Une). git rev-parse est ici nécessaire pour convertir de commettre nom de commettre SHA-1 / validation d'identité.

À l'aide de git rev-list comme dans VonC réponse est aussi de la possibilité.


Si l'on s'engage de vous parlez est une branche de la pointe, alors git branch --contains <commit> ou git branch --merged <commit> peut-être mieux non-solution de programmation.

17voto

VonC Points 414372

Ce type d'opérations s'appuie sur la notion de plage de révisions détaillées dans la question: "laDifférence dans git log origin/master' vs ‘git log origin/master..'".

git rev-list devrait être capable de marcher en arrière à partir d'un commit, jusqu'à un autre si accessible.

Je voudrais donc essayer:

git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20

Si le dernier commit affichée est la même que la première s'engager dans le git rev-commande de la liste, alors il est un commit est accessible à partir de la deuxième commettre.

Si le premier commit n'est pas accessible à partir de la deuxième, git rev-list devrait renvoyer rien.

git rev-list --boundary A..B

aurait fini par Un, si A est accessible à partir de B. C'est la même chose que:

git rev-list --boundary B --not A

avec B une référence positive et Une négative de référence.
Il commence à B et revenir à pied à travers le graphe jusqu'à ce qu'il rencontre une révision qui est accessible à partir de A.
Je dirais que si A est directement accessible à partir de B, il va rencontrer (et d'affichage, en raison de l' --boundary option) Un lui-même.

13voto

itub Points 303

Un autre moyen serait d'utiliser la commande git log et grep.

git log --pretty=format:%H abc123 | grep def456

Ceci va produire une ligne de sortie si la validation def456 est un ancêtre de commettre abc123, ou pas de sortie autrement.

Vous pouvez généralement s'en tirer avec l'omission de l' "- assez" argument, mais il est nee si vous voulez vous assurer que vous n'recherche réels de commettre des hachages et non par le biais du journal des commentaires et ainsi de suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X