Comment lister les branches qui contiennent un commit donné?

1088

Comment puis-je interroger git pour savoir quelles branches contiennent un commit donné? gitklistera généralement les branches, sauf s'il y en a trop, auquel cas il dit simplement "beaucoup (38)" ou quelque chose comme ça. J'ai besoin de connaître la liste complète, ou du moins si certaines branches contiennent le commit.

Andrew Arnott
la source
Question connexe pour un commit équivalent par commentaires: stackoverflow.com/questions/16304574/…
UpAndAdam

Réponses:

1471

Depuis la page de manuel de git-branch :

 git branch --contains <commit>

Liste uniquement les branches qui contiennent le commit spécifié (HEAD si non spécifié). Implique --list.


 git branch -r --contains <commit>

Répertorie également les branches de suivi à distance (comme mentionné dans la réponse de user3941992 ci-dessous) qui sont des "branches locales qui ont une relation directe avec une branche distante".


Voir aussi cet article prêt pour git .

La --containsbalise déterminera si un certain commit a déjà été introduit dans votre branche. Vous avez peut-être un SHA de validation à partir d'un correctif que vous pensiez avoir appliqué, ou vous voulez simplement vérifier si la validation de votre projet open source préféré qui réduit l'utilisation de la mémoire de 75% est encore disponible.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <[email protected]>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Remarque: si la validation se trouve sur une branche de suivi à distance , ajoutez l' -aoption .
(comme MichielB commente ci-dessous )

git branch -a --contains <commit>

MatrixFrog fait remarquer qu'elle ne montre que les branches qui contiennent cet engagement exact .
Si vous voulez savoir quelles branches contiennent un commit "équivalent" (c'est-à-dire quelles branches ont choisi ce commit) git cherry:

Parce que git cherry compare l'ensemble de modifications plutôt que l'ID de validation (sha1) , vous pouvez utiliser git cherrypour savoir si une validation que vous avez effectuée localement a été appliquée <upstream>sous un autre ID de validation.
Par exemple, cela se produira si vous alimentez des correctifs <upstream>par e-mail plutôt que de pousser ou de tirer directement les commits.

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Ici, les commits marqués ' -' n'apparaissent pas git cherry, ce qui signifie qu'ils sont déjà présents dans <upstream>.)

VonC
la source
3
testset master- masterest la branche actuelle, donc l'astérisque.
blueyed
54
Cela montre uniquement quelles branches contiennent ce commit exact . Si vous voulez savoir quelles branches contiennent un commit "équivalent" (c.-à-d. Quelles branches ont choisi par cerise ce commit) c'est git cherry: "Parce que git cherry compare le changeset plutôt que l'id de commit (sha1), vous pouvez utiliser git cherry pour le découvrir si une validation que vous avez effectuée localement a été appliquée <en amont> sous un ID de validation différent. Par exemple, cela se produira si vous alimentez les correctifs <en amont> par e-mail plutôt que de pousser ou de tirer directement les validations. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog
62
Ajoutez un -aparamètre pour vérifier également les branches distantes.
Raman
28
Vous pouvez aussi le faire git tag --contains <commit>. Voir Recherche de toutes les balises contenant un commit? .
Andrew Marshall
5
Pour la git cherrypartie @UpAndAdam a posé la question ici: stackoverflow.com/questions/16304574/… , hélas, la question n'a pas (encore) répondu.
adeelx
22

Vous pouvez exécuter:

git log <SHA1>..HEAD --ancestry-path --merges

À partir du commentaire du dernier commit dans la sortie, vous pouvez trouver le nom de la branche d'origine

Exemple:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master
Eugen Konkov
la source
6
Agréable! J'avais l'habitude git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1d'obtenir cela en une seule ligne
James EJ
1
Si vous souhaitez utiliser la commande pure git, vous pouvez utiliser:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz
Remarque: Lorsque votre commit sha est le commit le plus récent sur la branche master / foo (HEAD) ... vous ne pouvez pas faire de A..Brange de commit, mais n'utilisez pas de range comme so :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode
Si ce dépôt git est un sous-module et que vous essayez de résoudre le problème HEAD détaché ... alors vous avez une question difficile sur une branche préférée ... Dans mon exemple précédent, vous pourriez facilement dire que masterc'est toujours préféré s'il se trouve dans cette liste . De là, c'est moins clair. Vous pouvez essayer de lire la branche git du fichier .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Cela pourrait être une fourchette / pr de longue date. Vous pouvez cd pour repo root et exécuter git config submodule.src/foo/submodule.branch. Vous pouvez également utiliser la branche git actuelle des superprojets.
Devin G Rhode
En tant que petit côté: git config submodule.src/foo/submodule.branchpeut être influencé par n'importe quelle variété de configurations git, y compris un fichier .gitconfig repo-local. (nécessite l'exécution git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode