У меня 57 веток. Я знаю, что я внес изменения в определенный файл в один из них, но я не уверен, какой из них. Есть ли какая-то команда, которую я могу запустить, чтобы найти, какие ветки содержат изменения в определенном файле?
Найдите ветвь Git, содержащую изменения в заданном файле
Ответ 1
Найти все ветки, которые содержат изменение в 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
Ответ 2
Все, что вам нужно, это
git log --all -- path/to/file/filename
Если вы хотите узнать ветку сразу, вы также можете использовать:
git log --all --format=%5 -- path/to/file/filename | xargs -I{} -n 1 echo {} found in && git branch --contains {}
Кроме того, если у вас есть какие-либо переименования, вы можете включить --follow
в команду Git log.
Ответ 3
Похоже, что это все еще проблема без соответствующего решения. У меня недостаточно кредитов, чтобы комментировать, поэтому здесь мой маленький вклад.
Сет Робертсон 1-е решение вроде как работало для меня, но дало мне только локальные ветки, среди которых много ложных срабатываний, вероятно, из-за слияний из стабильной ветки.
Второе решение Адама Димитрука у меня совсем не сработало. Для начала, что --format =% 5? Это не распознается Git, я не мог найти что-нибудь об этом, и я не мог заставить его работать с другими параметрами формата.
Но его первое решение в сочетании с опцией --source и простым grep оказалось полезным:
git log --all --source -- <filename> | grep -o "refs/.*" | sort -u
Это дает мне несколько удаленных тегов и веток и одну локальную ветвь, где я внес последние изменения в файл. Не уверен, насколько это завершено.
Ответ 4
Ниже приведен неумелый метод грубой силы, но я ожидаю, что он должен работать. Сначала убедитесь, что вы спрятали все незафиксированные изменения, поскольку это переключит, в какой ветке вы находитесь.
for branch in $(git for-each-ref --format="%(refname:short)" refs/heads); do
git checkout $branch && git grep SOMETHING
done