Як перелічити гілки, які містять певну комісію?


1087

Як я можу запитати git, щоб дізнатися, які гілки містять заданий коміт? gitkзазвичай перелічують гілки, якщо їх не надто багато, і в цьому випадку це просто говорить "багато (38)" або щось подібне. Мені потрібно знати повний список, або принаймні, чи певні гілки містять коміти.



Пов'язаний питання еквівалента фіксації на коментар: stackoverflow.com/questions/16304574 / ...
UpAndAdam

Відповіді:


1470

На сторінці посібника з 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>.)


3
testsі master- masterце поточна галузь, тому зірочка.
синюватий

54
Це свідчить лише про те, які гілки містять цю точну фіксацію . Якщо ви хочете дізнатись, які гілки містять "еквівалентний" коміт (тобто, у яких гілках є вишня, яку вибрали), це git cherry: "Оскільки git cherry порівнює зміну, а не id (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до цього в одному рядку
James EJ

1
Якщо ви хочете використовувати команду pure git, ви можете використовувати:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

Примітка. Коли ваша фіксація ша є останньою коміткою у ведучій / 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 repo є підмодулем, і ви намагаєтеся вирішити відокремлену проблему HEAD ... тоді у вас є складне запитання про бажану гілку ... У моєму попередньому прикладі ви могли легко сказати, що masterзавжди бажано, якщо воно є в цьому списку . Звідти це менш зрозуміло. Ви можете спробувати і прочитати гілку гіта з файлу .gitmodules : git config -f .gitmodules submodule.src/foo/submodule.branch. Це може бути довго стоячи вилка / пр. Ви можете cd репонувати root і запустити git config submodule.src/foo/submodule.branch. Ви також можете використовувати поточну гілку суперпроектів.
Девін Г Род

Як невеликий бік: На них git config submodule.src/foo/submodule.branchможуть впливати будь-які різні конфігурації git, включаючи репо-локальний .gitconfig файл. (вимагає запуску git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.