416 votes

Étant donné un identifiant de commit, comment déterminer si la branche courante contient le commit ?

Ce que j'essaie de faire, c'est un contrôle de version. Je veux m'assurer que le code reste à la hauteur d'une version minimale. J'ai donc besoin d'un moyen de savoir si la branche actuelle contient un commit spécifique.

7 votes

16 votes

Voir le duplicata proposé pour savoir comment trouver tous branches qui contiennent un commit spécifié. Pour savoir si le actuel la branche contient un commit C utiliser la commande "plomberie". git merge-base --is-ancestor . La branche actuelle contient C si C est un ancêtre de HEAD donc : if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi

1 votes

Bonjour, veuillez soumettre cette réponse pour qu'elle soit sélectionnée comme réponse correcte =)

488voto

JiriS Points 793

Il existe plusieurs façons d'obtenir ce résultat. La première option naïve consiste à utiliser git log et rechercher un commit spécifique en utilisant grep mais ce n'est pas toujours précis

git log | grep <commit_id>

Il est préférable d'utiliser git branch directement pour trouver toutes les branches contenant un COMMIT_ID en utilisant

git branch --contains $COMMIT_ID

L'étape suivante consiste à trouver la branche actuelle, ce qui peut être fait depuis git 1.8.1 en utilisant

git symbolic-ref --short HEAD

Et combinés ensemble comme

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

Mais la commande ci-dessus ne renvoie pas true ou false et il existe une version plus courte qui renvoie le code de sortie 0 si le commit est dans la branche courante OU le code de sortie 1 si ce n'est pas le cas.

git merge-base --is-ancestor $COMMIT_ID HEAD

Le code de sortie est bien, mais comme vous voulez une chaîne de caractères true o false comme réponse vous devez ajouter un peu plus et ensuite combiné avec if à partir de bash vous obtenez

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi

22 votes

Ce n'est pas correct ; le grep pourrait entraîner des faux positifs si git log mentionne le commit SHA pour d'autres raisons, par exemple, il est mentionné dans un message de commit comme résultat d'un portage depuis une autre branche.

1 votes

Corrigé (ou plutôt ajouté une autre option).

3 votes

Veuillez consulter le commentaire sur la question, qui utilise le jeu d'outils git intégré. stackoverflow.com/questions/43535132/

122voto

Sajib Khan Points 11151

Obtenir une liste de branche(s) qui contient le commit spécifique.

# get all the branches where the commit exists
$ git branch --contains <commit-id>

Vérifier si une branche a le commit spécifique.

# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>

Cherchez dans la branche (disons, feature ) avec correspondance exacte .

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

par exemple Si vous avez 3 branches locales appelées feature , feature1 , feature2 entonces

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

Vous pouvez également effectuer une recherche dans les deux local y remote branches (utiliser -a ) ou seulement dans remote branches (utiliser -r ).

# search in both 'local' & 'remote' branches  
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'

1 votes

El grep ici pourrait aussi donner lieu à des faux positifs s'il y a d'autres branches contenant le commit dont les noms contiennent aussi <branch-name> comme une sous-chaîne.

1 votes

Oui @AdamSpiers, mise à jour de la réponse avec une correspondance exacte du nom de la branche par grep -E '(^|\s)branchname$'

2 votes

Par ce commentaire sur la question connexe il peut être utile d'ajouter l'option -r ("à distance") ou -a ("tous") à l'option git branch pour rechercher les branches qui peuvent ne pas être répliquées dans le clone du repo local.

21voto

Zitrax Points 3443

Extraction du commentaire de @torek comme réponse :

Voir le duplicata proposé pour savoir comment trouver toutes les branches qui contiennent un commit spécifié.

Pour savoir si le actuel la branche contient le commit C, utilisez la commande "plumbing" (plomberie) git merge-base --is-ancestor . La branche courante contient C si C est un ancêtre de HEAD, donc :

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(Note secondaire : dans le shell scripts, une commande qui sort zéro est "vraie" tandis qu'une qui sort non zéro est "fausse").

10voto

logicor Points 302

Oui, une autre alternative :

git rev-list <branch name> | grep `git rev-parse <commit>`

Cela fonctionne mieux pour moi car cela fonctionne aussi sur les branches distantes mises en cache localement, telles que remotes/origin/master sur lequel git branch --contains ne fonctionnera pas.

Cela couvre plus que la question de l'OP sur la "branche actuelle" mais je trouve stupide de demander une version "toute branche" de cette question donc je décide de poster ici quand même.

4voto

DreamUth Points 90
git branch --contains <commit-id> --points-at <target branch name>

Il retournera le nom de la branche cible si l'identifiant de commit existe dans cette branche. Sinon, la commande échouera.

0 votes

Non... error: malformed object name 'branch-name'

1 votes

Vous pouvez obtenir cette erreur dans deux cas : 1. Lorsque le <branch name> donné ne contient pas le <commit id> donné 2. Le <branch name> de sortie n'est pas le <branch name> donné.

1 votes

Je pense que ça a changé, maintenant si la branche cible n'a pas le commit tu n'obtiens rien, si la branche cible n'existe pas alors tu as une erreur

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