如果我使用Git创建提交,它会提供一个简单的日志消息,其中包含分支名称,短SHA和一行描述:
[branchname 481f23b] Fixes from code review
但如果我使用git log --oneline
,我只会得到简短的SHA和主题:
481f23b Fixes from code review
bb4070e Merge branch 'update-docs' into 'master'
e0095b2 Merge remote-tracking branch 'origin/master' into HEAD
我无法以任何方式使用git log --format="format:..."
打印出每一行的当前分支名称。
例如,如果我使用--format="format:[%D %h] %s"
:
[HEAD -> branchname, origin/branchname 481f23b] Fixes from code review
[ bb4070e] Merge branch 'update-docs' into 'master'
[ e0095b2] Merge remote-tracking branch 'origin/master' into HEAD
有没有办法配置git log
在每个日志行上显示(当前)分支名称?
答案 0 :(得分:1)
有了一些shell hackery,似乎我可以用sed
和bash替换来模仿它:
git log -200 --format="format:%Cgreen[BRANCHNAME %h]%Creset %s" | (sed "s/BRANCHNAME/$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match)/")
当然,这将显示每个提交现在都是此分支的“部分”,即使它不是最初的。
答案 1 :(得分:1)
你的shell技巧会起作用,虽然我只是先获取分支名称(转换为shell变量),然后直接在--format
行中使用它。
有一个很好的理由git不会这样做:提交不是“在 a 分支上”,而是“包含在某些 set 分支中”。例如:
...--o--A--B--C <-- branch1
\
D--E <-- branch2
显然,提交A
到C
已“开启”branch1
且D
和E
已“开启”branch2
。但是,当我们访问git merge branch2
时,让我们branch1
:
...--o--A--B--C <-- branch1
\ \
D--E-----M <-- branch2
现在提交A
到C
也在branch2上。
现在让我们使用git branch -d branch1
删除标签branch1
,这是安全的,因为它已合并到branch2
中:
...--o--A--B--C
\ \
D--E-----M <-- branch2
没有任何变化,但现在A
到C
仅在“branch2
上”,因为branch1
已消失。
提交图是固定的(因为提交是,在相当深刻的意义上,它们的SHA-1:如果你改变任何东西,包括父ID,提交消息或时间戳,你会得到一个新的,不同的提交,即使附加到该提交的源树是相同的)。但是,分支标签是短暂的:它们在不改变图形的情况下移动,改变甚至完全消失。
在任何情况下,单个提交可以在“多个”分支上“打开”。任何给定的分支标签都指向单个提交,但该提交可以指回多个先前的提交。合并提交被定义为指向至少两个父项的提交,因此它会导致这些提交包含在分支中,即使在开发过程中是正常的 - 至少其中一些提交有另一个指向它们的标签,或指向指向他们的东西。
您甚至不需要合并来获得此效果:只需创建一个指向某个现有提交的新分支。例如,在删除branch1
之前,甚至在合并之前,创建一个新标签branch3
,同时指向提交C
:
...--o--A--B--C <-- branch1, branch3
\
D--E <-- branch2
现在提交A
到C
位于两个分支上,当您将branch1合并到branch3时,它们将位于三个分支上