Как составить список веток, содержащих данный коммит?
Как я могу запросить 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
содержит фиксацию.