Подтвердить что ты не робот

Найдите ветвь Git, содержащую изменения в заданном файле

У меня 57 веток. Я знаю, что я внес изменения в определенный файл в один из них, но я не уверен, какой из них. Есть ли какая-то команда, которую я могу запустить, чтобы найти, какие ветки содержат изменения в определенном файле?

4b9b3361

Ответ 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