Как составить список веток, содержащих данный коммит?

Как я могу запросить git, чтобы узнать, какие ветви содержат данный коммит? gitk обычно перечисляет ветви, если их не слишком много, и в этом случае он просто говорит "многие (38)" или что-то в этом роде. Мне нужно знать полный список или, по крайней мере, содержат ли определенные ветви коммит.

2 ответа

Решение

Со страницы руководства git-branch:

 git branch --contains <commit>

Только те ветви списка, которые содержат указанный коммит (HEAD, если не указан). Подразумевает --list,


 git branch -r --contains <commit>

Также перечислены удаленные ветви отслеживания (как указано в ответе пользователя 3941992 ниже), то есть "локальные ветви, имеющие прямое отношение к удаленной ветви".


Смотрите также эту git готовую статью.

--contains tag будет выяснять, был ли определенный коммит уже введен в вашу ветку. Возможно, вы получили коммит SHA из патча, который, как вы думали, вы применили, или вы просто хотите проверить, есть ли коммит для вашего любимого проекта с открытым исходным кодом, который сокращает использование памяти на 75%.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Примечание. Если коммит находится в удаленной ветви отслеживания, добавьте -a вариант.
(как комментарии MichielB ниже)

git branch -a --contains <commit>

MatrixFrog комментирует, что показывает, какие ветви содержат именно этот коммит.
Если вы хотите знать, какие ветви содержат "эквивалентный" коммит (т. Е. Какие ветви имеют вишню, выбранную для этого коммита), это git cherry:

Так как git cherry сравнивает набор изменений, а не идентификатор фиксации (sha1), вы можете использовать git cherry чтобы узнать, был ли применен сделанный вами коммит локально <upstream> под другим идентификатором коммита.
Например, это произойдет, если вы кормите патчи <upstream> по электронной почте, а не с помощью нажатия или извлечения коммитов напрямую.

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Здесь коммиты отмечены - не будет появляться с git cherry это означает, что они уже присутствуют в <upstream>.)

Вы можете запустить:

git log <SHA1>..HEAD --ancestry-path --merges

Из комментария последнего коммита в выводе вы можете найти оригинальное имя ветки

Пример:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

Ответ на git branch -r --contains <commit> хорошо работает для обычных удаленных веток, но если фиксация выполняется только в скрытых headпространство имен, которое GitHub создает для PR, вам потребуется еще несколько шагов.

Скажем, если PR #42 был из удаленной ветки и этот PR-поток имеет единственную ссылку на фиксацию в репо, git branch -r не знает о PR #42, потому что рефери любят refs/pull/42/head по умолчанию не указаны как удаленная ветка.

В .git/config для [remote "origin"] раздел добавить новую строку:

fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

( Эта суть имеет больше контекста.)

Тогда когда ты git fetch вы получите все отделения PR, и когда вы запустите git branch -r --contains <commit> вот увидишь origin/pr/42 содержит фиксацию.

Другие вопросы по тегам