在每个`git log`行显示当前分支名称

时间:2015-09-08 22:36:47

标签: git

如果我使用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在每个日志行上显示(当前)分支名称?

2 个答案:

答案 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

显然,提交AC已“开启”branch1DE已“开启”branch2。但是,当我们访问git merge branch2时,让我们branch1

...--o--A--B--C     <-- branch1
      \        \
       D--E-----M   <-- branch2

现在提交AC也在branch2上。

现在让我们使用git branch -d branch1删除标签branch1,这是安全的,因为它已合并到branch2中:

...--o--A--B--C
      \        \
       D--E-----M   <-- branch2

没有任何变化,但现在AC仅在“branch2上”,因为branch1已消失。

提交图是固定的(因为提交,在相当深刻的意义上,它们的SHA-1:如果你改变任何东西,包括父ID,提交消息或时间戳,你会得到一个新的,不同的提交,即使附加到该提交的源树是相同的)。但是,分支标签是短暂的:它们在不改变图形的情况下移动,改变甚至完全消失。

在任何情况下,单个提交可以在“多个”分支上“打开”。任何给定的分支标签都指向单个提交,但该提交可以指回多个先前的提交。合并提交被定义为指向至少两个父项的提交,因此它会导致这些提交包含在分支中,即使在开发过程中是正常的 - 至少其中一些提交有另一个指向它们的标签,或指向指向他们的东西。

您甚至不需要合并来获得此效果:只需创建一个指向某个现有提交的新分支。例如,在删除branch1之前,甚至在合并之前,创建一个新标签branch3,同时指向提交C

...--o--A--B--C     <-- branch1, branch3
      \
       D--E         <-- branch2

现在提交AC位于两个分支上,当您将branch1合并到branch3时,它们将位于三个分支上