Найдите все ветки, которые содержат изменение FILENAME (даже если до (незаписанной) точки ветвления)
FILENAME="<filename>"
git log --all --format=%H $FILENAME | while read f; do git branch --contains $f; done | sort -u
Вручную проверьте:
gitk --all --date-order -- $FILENAME
Найдите все изменения в FILENAME, которые не были объединены в главный:
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 …
илиgit log --grep LOGMESSAGE …
(с… представляющими остальную часть упомянутой мной команды).gitk --all -- filename
который графически покажет вам все изменения в этом файле. Если вы можете идентифицировать рассматриваемый коммит, вы можете использовать его,git branch --contains
чтобы увидеть, в какие ветви он перешел. Если вы хотите увидеть, в какой ветке изначально был создан рассматриваемый коммит , тогда используйте google git-what-branch, но имейте в виду, что слияния с быстрой перемоткой вперед могут скрыть эту информацию.git log --all --format='--contains %H' "$file" | xargs git branch
Все, что тебе нужно
Если вы хотите сразу узнать ветку, вы также можете использовать:
Кроме того, если у вас были какие-либо переименования, вы можете включить их
--follow
в команду Git log.источник
--source
туда, и вы золотой.Похоже, это проблема без соответствующего решения. У меня недостаточно кредитов для комментариев, так что вот мой небольшой вклад.
1-е решение Сета Робертсона вроде сработало для меня, но дало мне только локальные ветки, среди которых было много ложных срабатываний, вероятно, из-за слияний из стабильной ветки.
Второе решение Адама Димитрука у меня вообще не сработало. Для начала, что --format =% 5? Он не распознается git, я ничего не мог найти об этом и не мог заставить его работать с другими параметрами формата.
Но его 1-е решение в сочетании с параметром --source и простым grep оказалось полезным:
Это дает мне несколько удаленных тегов и веток и одну локальную ветку, в которой я внес последние изменения в файл. Не уверен, насколько это полно.
ОБНОВЛЕНИЕ согласно запросу @nealmcb, сортировка веток по последнему изменению:
Во-первых, вы можете изменить grep на «refs / Heads /.*», что даст вам только локальные ветки. Если веток всего несколько, вы можете проверить последнюю фиксацию каждой из них следующим образом:
Если веток больше, и вы действительно хотите автоматизировать это, вы можете объединить две команды, используя xargs, форматирование журнала git и другую сортировку, в этот однострочник:
Это приведет к следующему выводу:
источник
Я знаю, что это древний вопрос, но я постоянно возвращался к нему, прежде чем разработать собственное решение. Я считаю, что это более элегантно и благодаря использованию базы слияния отфильтровывает нежелательные ветви.
Если вы поместите его в PATH как
git-find-changes
(с исполняемыми разрешениями), вы можете вызвать его с помощьюgit find-changes /path
Пример вывода для
git find-changes app/models/
источник
Ниже приводится неэлегантный метод грубой силы, но я думаю, он должен работать. Сначала убедитесь, что вы сохранили все незафиксированные изменения, так как это переключит ветку, в которой вы сейчас находитесь.
источник
git log -S
for-each-ref
до сих пор уважает этотshort
флаг. Тем не менее, игнорируйте мой ответ; другие ответы лучше.