Étant donné un identifiant de commit, comment déterminer si la branche actuelle contient le commit?
156
Ce que j'essaie de faire, c'est une vérification de version. Je veux m'assurer que le code reste au-dessus d'une version minimale. J'ai donc besoin d'un moyen de savoir si la branche actuelle contient un commit spécifié.
Voir le doublon proposé pour savoir comment trouver toutes les branches qui contiennent un commit spécifié. Pour savoir si la branche courante contient le commit C , utilisez la commande "plumbing" 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
torek
1
Bonjour, veuillez soumettre ceci comme réponse afin qu'elle puisse être sélectionnée comme réponse correcte =)
Ben
1
@Ben - Je l'ai ajouté en tant que réponse wiki de la communauté.
Zitrax
1
@Remover: dans les scripts shell, zéro est vrai, différent de zéro est faux: l'inverse de la convention C. /bin/truea été initialement implémenté au fur exit 0et à /bin/falsemesure exit 1. (Des coquilles modernes ont ensuite été intégrées.)
torek
Réponses:
220
Il existe plusieurs façons d'atteindre ce résultat. La première option naïve est d'utiliser git loget de rechercher un commit spécifique en utilisant grep, mais ce n'est pas toujours précis
git log | grep <commit_id>
Il vaut mieux utiliser git branchdirectement pour trouver toutes les branches contenant des données en COMMIT_IDutilisant
git branch --contains $COMMIT_ID
L'étape suivante consiste à découvrir la branche actuelle qui peut être effectuée depuis l' git 1.8.1utilisation
Mais la commande ci-dessus ne renvoie ni vrai ni faux et il existe une version plus courte qui renvoie le code de sortie 0 si la validation est dans la branche actuelle OU le code de sortie 1 sinon
git merge-base --is-ancestor $COMMIT_ID HEAD
Le code de sortie est sympa, mais comme vous voulez une chaîne trueou falsecomme réponse, vous devez en ajouter un peu plus, puis combiner avec iffrom bash, vous obtenez
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
Ce n'est pas correct; le greppourrait entraîner des faux positifs si les git logmentions du commettras SHA pour d' autres raisons, par exemple , il est mentionné dans un message de validation à la suite d'un port d' une autre branche.
L' grepici pourrait également entraîner des faux positifs s'il existe d'autres branches contenant le commit dont les noms contiennent également en <branch-name>tant que sous-chaîne.
Adam Spiers
1
Oui @AdamSpiers, a mis à jour la réponse avec une correspondance exacte avec le nom de la succursale pargrep -E '(^|\s)branchname$'
Sajib Khan
1
Selon ce commentaire sur la question associée, il peut être utile d'ajouter l' option -r("remote") ou -a("all") git branchpour rechercher les branches qui ne peuvent pas être répliquées dans le clone du dépôt local.
sxc731
Cela n'a pas fonctionné pour moi, j'avais besoin git branch --all --contains <commit-id>
Arthur Tacca
7
Commentaire extrait par @torek comme réponse:
Voir le duplicata proposé pour savoir comment trouver toutes les branches qui contiennent un commit spécifié.
Pour savoir si la branche courante contient le commit C, utilisez la commande "plumbing" 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 latérale: dans les scripts shell, une commande qui sort de zéro est "vraie" tandis que celle qui sort de zéro est "fausse".)
Cela fonctionne mieux pour moi car cela fonctionnerait également sur des branches distantes mises en cache localement telles que remotes/origin/master, sur lesquelles git branch --containsne fonctionnera pas.
Cela couvre plus que la question d'OP sur la "branche actuelle", mais je trouve idiot de poser une version "toute branche" de cette question, alors je décide de poster quand même ici.
nope ...error: malformed object name 'branch-name'
bbodenmiller
1
Vous pouvez obtenir cette erreur dans 2 cas 1. Lorsque le <nom de la branche> donné ne contient pas le <commit id> donné 2. Le contrôle <nom de la branche> n'est pas le <nom de la branche> donné
DreamUth
0
Puisque cette question a de belles réponses scripty, j'ajoute mes favoris.
Celui-ci vous montrera, pour les derniers $ncommits dans $brquelles branches contient chacun:
git merge-base --is-ancestor
. La branche courante contient C si C est un ancêtre deHEAD
, donc:if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
/bin/true
a été initialement implémenté au furexit 0
et à/bin/false
mesureexit 1
. (Des coquilles modernes ont ensuite été intégrées.)Réponses:
Il existe plusieurs façons d'atteindre ce résultat. La première option naïve est d'utiliser
git log
et de rechercher un commit spécifique en utilisantgrep
, mais ce n'est pas toujours précisIl vaut mieux utiliser
git branch
directement pour trouver toutes les branches contenant des données enCOMMIT_ID
utilisantL'étape suivante consiste à découvrir la branche actuelle qui peut être effectuée depuis l'
git 1.8.1
utilisationEt combinés ensemble comme
Mais la commande ci-dessus ne renvoie ni vrai ni faux et il existe une version plus courte qui renvoie le code de sortie 0 si la validation est dans la branche actuelle OU le code de sortie 1 sinon
Le code de sortie est sympa, mais comme vous voulez une chaîne
true
oufalse
comme réponse, vous devez en ajouter un peu plus, puis combiner avecif
from bash, vous obtenezla source
grep
pourrait entraîner des faux positifs si lesgit log
mentions du commettras SHA pour d' autres raisons, par exemple , il est mentionné dans un message de validation à la suite d'un port d' une autre branche.--format=format:%H
àgit log
.Obtenez une liste de branche (s) contenant le commit spécifique.
Vérifiez si une branche a le commit spécifique.
Recherchez la branche (par exemple
feature
) avec une correspondance exacte .par exemple , si vous avez 3 branches locales appelées
feature
,feature1
,feature2
puisVous pouvez également rechercher dans les deux branches
local
etremote
(utilisation-a
) ou uniquement dans lesremote
branches (utilisation-r
).la source
grep
ici pourrait également entraîner des faux positifs s'il existe d'autres branches contenant le commit dont les noms contiennent également en<branch-name>
tant que sous-chaîne.grep -E '(^|\s)branchname$'
-r
("remote") ou-a
("all")git branch
pour rechercher les branches qui ne peuvent pas être répliquées dans le clone du dépôt local.git branch --all --contains <commit-id>
Commentaire extrait par @torek comme réponse:
Voir le duplicata proposé pour savoir comment trouver toutes les branches qui contiennent un commit spécifié.
Pour savoir si la branche courante contient le commit C, utilisez la commande "plumbing"
git merge-base --is-ancestor
. La branche courante contient C si C est un ancêtre de HEAD, donc:(Note latérale: dans les scripts shell, une commande qui sort de zéro est "vraie" tandis que celle qui sort de zéro est "fausse".)
la source
Pour lister les branches locales contenant commit:
git branch --contains <commit-id>
et pour lister toutes les branches, y compris distantes uniquement, contenant commit:
git branch -a --contains <commit-id>
De même pour vérifier si le commit est dans une branche particulière:
git log <branch> | grep <commit_id>
et si la branche n'existe pas localement, préfixez le nom de la branche avec
origin/
la source
-a
. Merci pour ce conseil!Ouais une autre alternative:
Cela fonctionne mieux pour moi car cela fonctionnerait également sur des branches distantes mises en cache localement telles que
remotes/origin/master
, sur lesquellesgit branch --contains
ne fonctionnera pas.Cela couvre plus que la question d'OP sur la "branche actuelle", mais je trouve idiot de poser une version "toute branche" de cette question, alors je décide de poster quand même ici.
la source
Il renverra le nom de la branche cible si l'ID de validation existe dans cette branche. Sinon, la commande échouera.
la source
error: malformed object name 'branch-name'
Puisque cette question a de belles réponses scripty, j'ajoute mes favoris.
Celui-ci vous montrera, pour les derniers
$n
commits dans$br
quelles branches contient chacun:Celui-ci est similaire mais fait de même pour une liste de branches:
la source