Как определить в git, имеет ли новая ветвь фиксация? [Дубликат]

Общая команда сценариев для работы со ссылками - git for-each-ref.

Ссылки на ветви живут в refs/heads/ части пространства имен, поэтому используйте git for-each-ref refs/heads, чтобы получить их все.

По умолчанию git for-each-ref печатает три элемента: '%(objectname) %(objecttype) %(refname)', используйте другой --format, чтобы изменить это. В этом случае вы, вероятно, захотите:

git for-each-ref --format='%(refname:short)' refs/heads

, но см. документацию для всех доступных директив форматирования. (Обратите внимание также, что git for-each-ref получил довольно пристальное внимание в git 2.6 и 2.7: --contains, --merged, --no-merged и --points-at являются новыми. В более старых версиях git первые три доступны только через git branch.)

885
задан ThiefMaster 20 December 2012 в 16:49
поделиться

2 ответа

Из справочной страницы git-branch :

 git branch --contains <commit>

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


 git branch -r --contains <commit>

Также перечисляет ветви удаленной отслеживания (как указано в user3941992 's answer ниже), то есть «локальные ветви, которые имеют прямую связь с удаленной ветвью».


См. также статью git ready .

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

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

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

1191
ответ дан Gerold Broser 18 August 2018 в 19:06
поделиться
  • 1
    tests и master - master - текущая ветка, поэтому звездочка. – blueyed 25 March 2011 в 14:31
  • 2
    Это только показывает, в каких ветвях содержится точная фиксация . Если вы хотите знать, какие ветви содержат «эквивалент», commit (т. е. какие ветви выбрали вишню, которые фиксируют), это git cherry: «Поскольку git cherry сравнивает набор изменений, а не идентификатор commit (sha1), вы можете использовать git cherry, чтобы узнать, было ли сделанное вами совершение локально применяемый & lt; вверх по течению & gt; под другим идентификатором фиксации. Например, это произойдет, если вы загружаете патчи & lt; upstream & gt; по электронной почте, а не прямое нажатие или вытягивание. kernel.org/pub/software/scm/git/docs/git-cherry.html – MatrixFrog 14 April 2011 в 02:04
  • 3
    Добавьте параметр -a, чтобы проверить удаленные ветви. – Raman 26 January 2012 в 01:45
  • 4
    Вы также можете сделать git tag --contains <commit>. См. Поиск всех тегов, содержащих коммит? . – Andrew Marshall 18 January 2013 в 19:42
  • 5
    Для части git cherry @UpAndAdam задал вопрос здесь: stackoverflow.com/questions/16304574/… , увы, вопрос еще не ответил. – adeelx 6 August 2014 в 20:24

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

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
10
ответ дан Eugen Konkov 18 August 2018 в 19:06
поделиться
  • 1
    Ницца! Я использовал git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1, чтобы получить это в одной строке – James EJ 11 August 2017 в 19:59
  • 2
    Если вы хотите использовать команду pure git, вы можете использовать: git log <SHA1>..master --ancestry-path --merges --oneline -1 – Bartosz 23 March 2018 в 13:03
Другие вопросы по тегам:

Похожие вопросы: