Comment puis-je savoir si un engagement est un descendant d’un autre commit?

Avec Git, comment puis-je savoir si un engagement dans ma twig est un descendant d’un autre commit?

Si vous voulez vérifier cela par programmation (par exemple dans un script), vous pouvez vérifier si git merge-base AB est égal à git rev-parse --verify A (alors A est accessible depuis B), ou s’il s’agit de git rev-parse --verify B (alors B est accessible depuis A). git rev-parse est ici nécessaire pour convertir le nom de la validation en commit SHA-1 / commit.

Utiliser git rev-list comme dans VonC answer est également possible.


Si l’un des commits dont vous parlez est un emtwigment de twig , alors git branch --contains ou git branch --merged pourrait être une meilleure solution non-programmatique.

A partir de Git 1.8.0, cette option est prise en charge pour merge-base :

 git merge-base --is-ancestor   

De la page de manuel:

–is-ancêtre

Vérifiez si le premier est un ancêtre du second et quittez avec le statut 0 si vrai ou avec le statut 1 si ce n’est pas le cas. Les erreurs sont signalées par un statut non nul différent de 1.

Par exemple:

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

Ce type d’opération repose sur la notion de plage de révisions détaillée dans la question SO: ” Différence dans ‘git log origin / master’ vs ‘git log origin / master ..’ “.

git rev-list devrait pouvoir revenir d’un commit à un autre s’il est accessible.

Donc j’essaierais:

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

(Les commits de limite sont préfixés par - )

Si le dernier commit affiché est le même que le premier commit de la commande git rev-list , alors il s’agit d’un commit accessible depuis le second commit.

Si le premier commit n’est pas accessible depuis le second, git rev-list ne doit rien retourner.

 git rev-list --boundary A..B 

finirait par A , si A est accessible depuis B
C’est la même chose que:

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

, avec B une référence positive , et A une référence négative .
Il commence à B et retourne dans le graphique jusqu’à ce qu’il rencontre une révision accessible depuis A
Je dirais que si A est directement accessible depuis B , il rencontrera (et affichera à cause de l’option --boundary ) A lui-même.

Une autre façon serait d’utiliser git log et grep.

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

Cela produira une ligne de sortie si commit def456 est un ancêtre de commit abc123, ou aucune autre sortie.

Vous pouvez généralement vous en passer en omettant l’argument “–pretty”, mais vous devez vous assurer que vous ne faites que rechercher les hachages de validation réels et non les commentaires de journaux, etc.

https://stackoverflow.com/a/13526591/895245 le mentionne, maintenant pour le rendre plus humain:

 git-is-ancestor() ( if git merge-base --is-ancestor "$1" "$2"; then echo 'ancestor' elif git merge-base --is-ancestor "$2" "$1"; then echo 'descendant' else echo 'unrelated' fi ) alias giia='git-is-ancestor' 

git show-branch twig-sha1 commit-sha1

Où:

  • branch-sha1: le sha1 dans votre twig que vous voulez vérifier
  • commit-sha1: le sha1 du commit contre lequel vous voulez vérifier

Construire sur la réponse d’itub, au cas où vous devriez le faire pour toutes les balises du référentiel:

 for i in `git tag` ; do echo -ne $i "\t" ; git log --pretty=format:%H $i | (grep  || echo ""); done