920 votes

Trouver quelle branche un commit sont venus

Je suis sûr que ce n’est pas possible, mais y at-il aucun moyen de savoir quelle branche un commit vient du compte tenu de ses sha1 ?

Les points de bonus si vous pouvez me dire comment procéder à l’aide de grain.

1200voto

Jefromi Points 127932

Alors que Dav est exact que l'information n'est pas directement stockées, cela ne veut pas dire que vous ne pouvez jamais savoir. Voici quelques choses que vous pouvez faire.

Trouver des branches de la validation est sur

git branch --contains <commit>

Cela vous indiquera toutes les branches qui ont donné engagent dans leur histoire. Évidemment, c'est moins utile si la validation a déjà été fusionnés.

La recherche de la reflogs

Si vous travaillez dans le référentiel dans lequel la validation a été faite, vous pouvez rechercher le reflogs pour la ligne de la commettre. Reflogs de plus de 90 jours sont taillés par git-gc, donc si la validation est trop vieille, vous ne le trouverez pas. Cela dit, vous pouvez faire ceci:

git reflog show --all | grep a871742

pour trouver commettre a871742. La sortie doit être quelque chose comme ceci:

a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite

indiquant que la livraison a été faite sur la branche "achèvement". La sortie par défaut montre abrégé de commettre des tables de hachage, alors assurez-vous de ne pas rechercher le plein de hachage ou vous ne trouverez rien.

git reflog show est en fait juste un alias pour git log -g --abbrev-commit --pretty=oneline, donc si vous voulez jouer avec le format de sortie pour faire différentes choses à la disposition grep, c'est votre point de départ!

Si vous ne travaillez pas dans le référentiel où la livraison a été faite, le meilleur que vous pouvez faire dans ce cas est d'examiner le reflogs et trouver lors de la validation a d'abord été présenté à votre repo; avec un peu de chance, vous avez récupéré la branche, il a été commise. C'est un peu plus complexe, parce que vous ne pouvez pas marcher à la fois la validation de l'arbre et reflogs simultanément. Vous voulez analyser le reflog de sortie, l'examen de chaque hachage pour voir si elle contient de l'souhaité s'engager ou pas.

Trouver un subséquente de fusion s'engager

Ce flux de travail est dépendant, mais avec un bon flux de travail, les validations sont faites sur le développement des branches qui sont ensuite fusionnés. Vous pouvez faire ceci:

git log --merges <commit>..

pour voir de fusion s'engage à ce que le commit comme un ancêtre. (Si la validation a été seulement une fois fusionné, le premier devrait être la fusion que vous êtes après, vous aurez à examiner un peu, je suppose.) La fusion s'engager message doit contenir le nom de la branche qui a été fusionnée.

Si vous voulez être en mesure de compter sur de cela, vous souhaiterez peut-être utiliser l' --no-ff option d' git merge de la force de fusion s'engager création, même dans les fast-forward cas. (Ne soyez pas trop impatients, cependant, que pourrait devenir le brouillage si galvaudé.) VonC de répondre à une question connexe utilement donne des précisions sur ce sujet.

50voto

VonC Points 414372

Mise À Jour De Décembre 2013:

sschuberth commentaires

git-what-branch (Script Perl, voir ci-dessous) ne semble plus être maintenu.
git-when-merged est une alternative écrit en Python qui marche très bien pour moi.

Il est basé sur "Trouver de fusion s'engager incluent un spécifique de commettre".

git when-merged [OPTIONS] COMMIT [BRANCH...]

Trouver, lorsqu'un commit a été fusionnées en une ou plusieurs branches.
Trouver le commit de fusion qui a amené COMMIT dans la BRANCHE(es).

Specificially, regardez pour les plus anciens s'engager sur le premier parent de l'histoire de l' BRANCH qui contient l' COMMIT comme un ancêtre.


Réponse originale à cette question en septembre 2010:

Sébastien Douche juste twitté (16 minutes avant que cette SORTE de réponse):

git-ce-branche: Découvrez ce que la direction générale de la validation est sur, ou comment on en est arrivé à une branche nommée

C'est un script Perl à partir de Seth Robertson qui semble très intéressant:

SYNOPSIS

git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...

Vue d'ensemble

Dites-nous (par défaut) la première de causalité chemin d'accès s'engage et se confond à cause de la demande s'engager a reçu sur une branche nommée.
Si un commit a été faite directement sur un nom de branche, qui est évidemment le plus tôt chemin.

Par premiers de causalité chemin, nous entendons le chemin qui a fusionné avec une branche nommée la première, par moment de la validation (à moins d' --topo-order est spécifié).

PERFORMANCE

Si de nombreuses branches (par exemple, des centaines) contiennent de la validation, le système peut prendre un certain temps (pour un particulier de s'engager dans le linux arbre, il a pris 8 seconde pour explorer une branche, mais il n'y avait plus de 200 candidats branches) pour retrouver le chemin d'accès à chaque commit.
La sélection d'un particulier --reference-branch --reference tag d'examiner aura des centaines de fois plus rapide (si vous avez des centaines de candidats branches).

EXEMPLES

 # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
   v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May  5 08:59:37 2005)
   v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May  3 18:27:24 2005)
   v2.6.12-rc3-461-g84e48b6 is on master
   v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
   [...]

Ce programme ne prend pas en compte les effets de cherry-picking de la validation d'intérêt, seules les opérations de fusion.

12voto

Jeff Bowman Points 9712

``est la commande de « porcelaine » plus évidente pour ce faire. Si vous voulez faire quelque chose de similaire avec seulement des commandes de « plomberie » :

(crosspost de cela donc répondre)

3voto

user1338062 Points 1553

Option du pauvre est d’utiliser sur , recherche pour la validation et visuellement suivez la ligne de ce commit retour jusqu'à ce qu’un commit de fusion est perçue. Le message de fusion par défaut devrait spécifier quelle branche est se fusionne à l’endroit où  :)

2voto

pajp Points 476

Comme une expérience, j’ai fait un crochet après validation qui stocke des informations sur la branche actuellement retirée dans les métadonnées de validation. J’ai aussi légèrement modifié gitk pour afficher ces informations.

Vous pouvez le vérifier ici : https://github.com/pajp/branch-info-commits

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