Как показать журнал git с именем ветки

Я пробую git log с вариантами --decorate и --source. Но до сих пор не могу получить имя ветки фиксации 2f3cb60 и d7e7776, почему?

#git log 2f3cb60 --graph  --decorate --source --all --oneline
...
* | | | 1920ad5 refs/heads/gpio support gpio lib
| |/ /
|/| |
* | | 2f3cb60   2f3cb60 fix
* | | d7e7776   2f3cb60 fix
| |/
|/|
* | aa4dcfb     refs/remotes/origin/httpd support
* | cfc839d     refs/remotes/origin/httpd add folder

Как показать журнал git с именем ветки?


person Robber Pen    schedule 19.12.2012    source источник
comment
... выше показывает ветку, на которой находятся эти два коммита «исправления», если вы будете следовать графику вверх.   -  person TamaMcGlinn    schedule 02.03.2021
comment
Вы можете попробовать --branches вместо --all   -  person Cole    schedule 26.04.2021


Ответы (1)


$ git log --graph --decorate --oneline
* 1f3e836 (HEAD, origin/v2, v2) Change scripts to new format.
*   34d458f (origin/master, master) Merge branch 'new-shell'
|\  
| * 995ece7 (origin/new-shell) Fix index.html and add script pushing.
| * fe0615f New shell hello-world.
|/  
* fe1b1c0 Progress.
...

git log --graph --decorate --oneline должен показать вам имена коммитов, у которых есть имена. Не каждая фиксация связана с именем ветки.

Помните, что имя ветки — это просто указатель на конкретный коммит. У каждого коммита есть родитель, поэтому один коммит может быть частью истории дюжины отдельных веток.

  • Вы можете увидеть, какие ветки содержат коммит через git branch --contains <ref>.
  • Если вам просто нужно какое-то символическое имя для отслеживания коммита, используйте git name-rev <ref>.
  • Если вам нужен скриптовый ("сантехника") список всех ветвей, коммит, попробуйте это:

    commit=$(git rev-parse <ref>) # expands hash if needed
    for branch in $(git for-each-ref --format "%(refname)" refs/heads); do
      if git rev-list "$branch" | fgrep -q "$commit"; then
        echo "$branch"
      fi
    done
    

См. также: ТАК: Поиск ветки, из которой поступила фиксация

person Jeff Bowman    schedule 19.12.2012
comment
А как насчет просто git branch --contains <ref>? Что делает сценарий оболочки COMMIT= ... for ... done, чего не делает git branch --contains? - person Colin D Bennett; 23.10.2013
comment
@Колин git branch --contains великолепен! Вот почему это первая пуля из трех моих перечисленных вариантов. :) Дело в том, что git branch не имеет гарантированного вывода — он может изменить формат в будущих версиях — поэтому вы можете не захотеть использовать его в долгоживущих скриптах. Это часть раздела сантехника и фарфор: если вы человек читая вывод, вы можете использовать фарфоровые команды, такие как git branch, но если вы пишете инструмент, вы захотите использовать команды сантехники, такие как for-each-ref и rev-list, которые гарантируют их формат вывода. - person Jeff Bowman; 23.10.2013
comment
@JeffBowman Спасибо, что указали на это, я пропустил ваш комментарий. Если вам нужен сценарий оболочки .... Было бы здорово иметь параметр --porcelain для git branch, чтобы упростить это, но спасибо за фрагмент сценария! - person Colin D Bennett; 24.10.2013
comment
@JeffBowman, почему Not every commit is associated with a branch name? Насколько я понимаю, когда мы фиксируем, мы фиксируем определенную ветку, и эта ветвь должна быть связана с коммитом, верно? - person Qi Zhang; 06.03.2019
comment
@QiZhang Ветка — это автоматически перемещающийся указатель на коммит: когда вы фиксируете, он может перейти на ветку, да, но это временно. Вы можете сбросить ветку, чтобы она указывала на любую фиксацию, которую вы хотите, и ветвь, в которой вы находились, когда вы совершали коммит, не является постоянной частью коммита, если вы сами не запишете ее в журнал фиксации. Коммит может быть связан сразу с несколькими ветвями или вообще ни с одним, и для большинства коммитов, которые вас интересуют, он, вероятно, является родителем или предком одной или нескольких ветвей, поэтому у вас есть можно использовать несколько имен. - person Jeff Bowman; 06.03.2019