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

1088

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

Эндрю Арнотт
источник
Связанный вопрос для эквивалентного коммита в комментариях: stackoverflow.com/questions/16304574/…
UpAndAdam

Ответы:

1471

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

 git branch --contains <commit>

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


 git branch -r --contains <commit>

Списки удаленного отслеживания филиалов , а также (как уже упоминалось в user3941992 «s ответ ниже) , то есть„местные отделения , которые имеют прямое отношение к удаленной ветви“.


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

--containsТег будет выяснить , если определенный коммит был внесен в еще в вашей отрасли. Возможно, вы получили коммит 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>.)

VonC
источник
3
testsи master- masterтекущая ветка, поэтому звездочка.
голубоглазый
54
Это только показывает, какие ветви содержат этот точный коммит . Если вы хотите узнать, какие ветви содержат «эквивалентный» коммит (то есть, какие ветви имеют вишню, выбранную для этого коммита) git cherry: «Поскольку git cherry сравнивает набор изменений, а не идентификатор фиксации (sha1), вы можете использовать git cherry, чтобы выяснить, если сделанный вами локальный коммит был применен <upstream> под другим идентификатором коммита. Например, это произойдет, если вы будете отправлять патчи <upstream> по электронной почте, а не отправлять или извлекать коммиты напрямую. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog,
62
Добавьте -aпараметр, чтобы также проверить удаленные ветви.
Раман
28
Вы также можете сделать git tag --contains <commit>. См. Поиск всех тегов, содержащих коммит? ,
Эндрю Маршалл
5
Для git cherryчасти @UpAndAdam задал вопрос здесь: stackoverflow.com/questions/16304574/… Увы, на этот вопрос (пока) не был дан ответ.
adeelx
22

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

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
Евгений Коньков
источник
6
Ницца! Раньше я git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1получал это в одну строку
Джеймс Э.Д.
1
Если вы хотите использовать чистую команду git, вы можете использовать:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz
Примечание: Когда ваш коммит sha является самым последним коммитом в ветке master / foo (HEAD) ... вы не можете делать A..Bдиапазон коммитов, просто не используйте диапазон, например, так :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Девин Г. Род
Если это git-репо является подмодулем, и вы пытаетесь решить проблему отсоединенного HEAD ... тогда у вас сложный вопрос о предпочтительной ветке ... В моем предыдущем примере вы могли бы легко сказать, что masterвсегда предпочтительнее, если он находится в этом списке , Оттуда это менее ясно. Вы могли бы попытаться прочитать GIT ветвь от .gitmodules файла: git config -f .gitmodules submodule.src/foo/submodule.branch. Это может быть долго стоящая вилка / пр. Вы можете CD, чтобы репо и запустить git config submodule.src/foo/submodule.branch. Вы также можете использовать текущую ветку git для суперпроектов.
Девин Г. Род
Небольшое отступление: git config submodule.src/foo/submodule.branchможет зависеть от любых конфигураций git, включая локальный репозиторий .gitconfig. (требует бега git config --local include.path ./path/to/your/.gitconfig)
Девин Дж Род