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

3
如果我在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个回答

1

通过一些 shell 技巧,似乎我可以使用 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)/")

当然,这将显示每个提交现在都“属于”该分支,即使它最初并不是。

请参考torek的启发性答案。 - jub0bs

1
你的Shell技巧可以实现,不过我会先获取分支名称(存入Shell变量),然后直接在--format行中使用它。
但是Git没有这样做的好理由:提交并不仅仅“在一个分支上”,而是“包含在一些分支的集合中”。例如:
...--o--A--B--C     <-- branch1
      \
       D--E         <-- branch2

显然,提交 AC 在分支 branch1 上,“位于”该分支,DE 位于分支 branch2。但是,当我们在分支 branch1 上执行 git merge branch2 命令时:
...--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 上 "on",因为 branch1 已经消失了。

提交图已经固定(因为提交本身就是它们的SHA-1,在相当深的意义上来说:如果您更改任何内容,包括父ID、提交消息或时间戳,您将获得一个新的、不同的提交,即使附加到该提交的源代码树是相同的)。但是,分支标签是短暂的:它们移动、改变或甚至完全消失,而不会改变图形。

无论如何,单个提交可以在多个分支上 "on"。任何给定的分支标签都指向一个提交,但是该提交可以指向多个先前的提交。合并提交被定义为指向至少两个父提交的提交,因此它导致这些提交包含在分支中,即使在开发过程中,其中至少一些提交具有另一个标签指向它们,或者指向指向它们的东西。

你甚至不需要合并就能获得这种效果:只需创建一个指向某个现有提交的新分支。例如,在删除branch1之前,甚至在合并之前,创建一个新的标签branch3,也指向提交C
...--o--A--B--C     <-- branch1, branch3
      \
       D--E         <-- branch2

现在提交的代码 AC 存在于两个分支上,当你将 branch1 合并到 branch3 时,它们将存在于三个分支上。

“branch”:最具误导性的Git术语。 - jub0bs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接