Trouvez toutes les branches qui contiennent un changement de FILENAME (même si avant le point de branchement (non enregistré))
FILENAME="<filename>"
git log --all --format=%H $FILENAME | while read f; do git branch --contains $f; done | sort -u
Inspectez manuellement:
gitk --all --date-order -- $FILENAME
Rechercher toutes les modifications apportées à FILENAME non fusionnées avec le masque:
git for-each-ref --format="%(refname:short)" refs/heads | grep -v master | while read br; do git cherry master $br | while read x h; do if [ "`git log -n 1 --format=%H $h -- $FILENAME`" = "$h" ]; then echo $br; fi; done; done | sort -u
git log -Schange …
ougit log --grep LOGMESSAGE …
(avec… représentant le reste de la commande que j'ai mentionnée).gitk --all -- filename
ce qui vous montrera graphiquement toutes les modifications apportées à ce fichier. Si vous pouvez identifier le commit en question, vous pouvez utilisergit branch --contains
pour voir vers quelles branches le commit a migré. Si vous voulez voir sur quelle branche le commit en question a été créé à l'origine, alors google git-what-branch, mais sachez que les fusions à avance rapide peuvent masquer ces informations.git log --all --format='--contains %H' "$file" | xargs git branch
Tout ce dont tu as besoin c'est
Si vous souhaitez connaître la branche tout de suite, vous pouvez également utiliser:
De plus, si vous avez renommé, vous souhaiterez peut-être l'inclure
--follow
pour la commande Git log.la source
--source
et vous êtes en or.On dirait que c'est toujours un problème sans solution appropriée. Je n'ai pas assez de crédits pour commenter, alors voici ma petite contribution.
La première solution de Seth Robertson a un peu fonctionné pour moi, mais ne m'a donné que des branches locales, parmi lesquelles de nombreux faux positifs, probablement à cause de fusions de la branche stable.
La deuxième solution d'Adam Dymitruk n'a pas du tout fonctionné pour moi. Pour commencer, qu'est-ce que --format =% 5? Il n'est pas reconnu par git, je n'ai rien trouvé à ce sujet et je n'ai pas pu le faire fonctionner avec d'autres options de format.
Mais sa 1ère solution combinée avec l'option --source et avec un simple grep s'est avérée utile:
Cela me donne un certain nombre de balises et de branches distantes et une branche locale, où j'ai apporté les dernières modifications au fichier. Je ne sais pas à quel point c'est complet.
MISE À JOUR selon la demande de @nealmcb, en triant les branches par modification la plus récente:
Tout d'abord, vous pouvez changer le grep en "refs / heads /.*", ce qui vous donnera uniquement les branches locales. S'il n'y a que quelques branches, vous pouvez examiner le dernier commit de chacune comme ceci:
S'il y a plus de branches et que vous voulez vraiment automatiser cela, vous pouvez combiner les deux commandes en utilisant xargs, le formatage git log et un autre tri dans ce one-liner:
Cela se traduira par une sortie comme celle-ci:
la source
Je sais que cette question est ancienne, mais j'y revenais sans cesse avant de développer ma propre solution. Je pense que c'est plus élégant et grâce à l'utilisation de la base de fusion filtre les branches indésirables.
Si vous le mettez dans PATH comme
git-find-changes
(avec des autorisations exécutables), vous pouvez alors l'appeler avecgit find-changes /path
Exemple de sortie pour
git find-changes app/models/
la source
Ce qui suit est une méthode de force brute inélégante, mais je pense que cela devrait fonctionner. Assurez-vous que vous avez d'abord caché toutes les modifications non validées, car cela changera la branche sur laquelle vous vous trouvez actuellement.
la source
git log -S
for-each-ref
respecte toujours ceshort
drapeau. Cela dit, ignorez ma réponse; les autres réponses sont meilleures.