Avec Git, comment puis-je savoir si un commit dans ma branche est un descendant d'une autre de commettre?
Réponses
Trop de publicités?À 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 $?
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.
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.
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.