Encontre todos os ramos que contêm uma alteração para FILENAME (mesmo se antes do ponto de ramificação (não registrado))
FILENAME="<filename>"
git log --all --format=%H $FILENAME | while read f; do git branch --contains $f; done | sort -u
Inspecione manualmente:
gitk --all --date-order -- $FILENAME
Encontre todas as alterações em FILENAME não mescladas com o mestre:
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 …
(com ... representando o resto do comando que mencionei).gitk --all -- filename
que mostrará graficamente todas as mudanças nesse arquivo. Se você pode identificar o commit em questão, então você pode usargit branch --contains
para ver para quais branches o commit foi migrado. Se você quiser ver em qual branch o commit em questão foi originalmente criado, google git-what-branch, mas esteja ciente de que as mesclagens de avanço rápido podem obscurecer essas informações.git log --all --format='--contains %H' "$file" | xargs git branch
Tudo o que você precisa é
Se você quiser saber a filial imediatamente, também pode usar:
Além disso, se você teve qualquer renomeação, você pode querer incluir
--follow
para o comando Git log.fonte
--source
aí e você está dourado.Parece que ainda é um problema sem uma solução adequada. Não tenho créditos suficientes para comentar, então aqui está minha pequena contribuição.
A primeira solução de Seth Robertson meio que funcionou para mim, mas só me deu branches locais, entre os quais havia muitos falsos positivos, provavelmente por causa de mesclagens do branch estável.
A segunda solução de Adam Dymitruk não funcionou para mim. Para começar, o que é --format =% 5? Não é reconhecido pelo git, não consegui encontrar nada sobre ele e não consegui fazê-lo funcionar com outras opções de formato.
Mas sua primeira solução combinada com a opção --source e com um grep simples provou ser útil:
Isso me dá uma série de tags e branches remotos e um branch local, onde fiz as alterações mais recentes no arquivo. Não tenho certeza de como isso é completo.
ATUALIZE conforme a solicitação de @nealmcb, classificando os ramos pela mudança mais recente:
Primeiro, você pode alterar o grep para "refs / heads /.*", que fornecerá apenas os branches locais. Se houver apenas alguns branches, você pode examinar o commit mais recente de cada um assim:
Se houver mais branches e você realmente quiser automatizar isso, você pode combinar os dois comandos usando xargs, git log formatting e outra classificação neste one-liner:
Isso resultará em uma saída como esta:
fonte
Sei que essa pergunta é antiga, mas continuei voltando a ela antes de desenvolver minha própria solução. Eu sinto que é mais elegante e graças ao uso de filtros de base de mesclagem de ramos indesejados.
Se você colocá-lo em PATH como
git-find-changes
(com permissões de executável) - você pode chamá-lo comgit find-changes /path
Saída de exemplo para
git find-changes app/models/
fonte
O que segue é um método de força bruta deselegante, mas espero que funcione. Certifique-se de que você armazenou todas as alterações não confirmadas primeiro, pois isso mudará o branch em que você está.
fonte
git log -S
for-each-ref
ainda respeita essashort
bandeira. Dito isso, ignore minha resposta; as outras respostas são melhores.