如何在`git log`中显示分支名称?

248

我怎样才能在git log的输出中显示分支名称?

例如,使用git log --graph --all,我可以获得一个漂亮的提交概述,但我很困惑哪条线是主分支,哪条是我的分支。


1
方便地,显示链接头或标签的名称似乎已经默认完成自从最近的 git 更新。 - underscore_d
5个回答

367

尝试使用decorate选项。

git log --graph --all --decorate

它会注释那些被标签或分支所指向的提交。


46
使用 --pretty 参数时,您可以在想要“装饰”的地方使用 %d - CB Bailey
5
你希望它展示什么?并不是所有的提交都是分支末端。 - CB Bailey
12
Git只在分支的最新提交(tip)处存储分支名称。历史记录中的所有提交都是平等和匿名的。如果您想要具有命名分支的版本控制系统,使每个提交都带有分支名称,则可以使用Mercurial。 - Sampo Smolander
8
@CharlesBailey: 我喜欢使用git log --graph --all --oneline --decorate命令显示的参考颜色。我有一个别名git graph,它使用了--pretty选项(为了显示其他信息,比如作者和日期),但是在%d选项中没有显示出--decorate的颜色。目前我将所有的参考都显示为黄色,你知道怎样让--pretty%d字符串继承--decorate的颜色吗? - Gauthier
4
如果您希望在“--pretty”格式中使用默认颜色,请在需要着色的元素之前添加“%C(auto)”。例如,git log --pretty=format:"%cd %h %cn %s %C(auto)%d" - Radon8472
显示剩余10条评论

16

我正在寻找类似的东西 - 但是想知道更改是在哪个分支上进行的。希望这个答案对其他人也有用。

我正在调查使用 blackbox 加密时的风险,当足够多的用户离开一个项目并且 keyrings 目录没有以 master 为基础进行更新时,该仓库及其分支/标签可能会对当前的管理员不可用。

我发现下面的答案很有帮助,当 keyrings 目录未从 master 进行更新时...

基本上,添加 --source 是我需要显示分支/标签的内容。添加 --name-only 还将显示实际更改的文件。

cd /path/to/repo-that-uses-blackbox-encryption
git log --graph --all --decorate --source --name-only keyrings

另一个有用的答案:如何显示带有分支名称的 Git 日志


对我来说,--source 单独给出所有提交的 HEAD。与 --all 结合使用,似乎可以区分不同的分支,但显示的信息并不是我期望的:对于我在 master 中进行的提交,我得到的不是 refs/heads/master,而是一些私有分支(refs/remotes/origin/…)。我怀疑合并和/或新分支使 Git 丢失了历史信息。 - vinc17
我可以使用 --branches --remotes=<pattern> 来过滤分支,而不是使用 --all。但是,一旦两个分支合并在一起,Git 就不再具有提交时的信息。 - vinc17
"--source" 是我在寻找的。 - matt

7
如果您正在使用oh-my-zsh作为您的终端,那么一些git别名是可用的。所有别名都可以在他们的repo oh-my-zsh/plugins/git 中看到。如果您不使用这个终端,那么您只需获取这些别名,并将您喜欢的别名粘贴到您自己的环境中即可。
接受的答案介绍了git log --graph --all --decorate命令,它作为glgga别名在oh-my-zsh中可用。
就我个人而言,我更喜欢glods别名,它的含义如下:
git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short

2

这是一篇旧文章,但发布的答案实际上并没有显示每个提交的分支名称 - 它们只显示最近提交的分支名称。要列出每个提交的分支名称,请使用git show-branch命令。例如:

$ git show-branch --all --more
! [Branch_Feature_1] Commit Msg: Feature_1, Commit #1
 ! [Branch_Feature_2] Commit Msg: Feature_2, Commit #2
  ! [Branch_Feature_3] Commit Msg: Feature_3, Commit #1
   * [master] Merge branch 'Branch_Feature_3' Commit Msg: Merge Master Commit #2 + Feature_3
----
   - [master] Merge branch 'Branch_Feature_3' Commit Msg: Merge Master Commit #2 + Feature_3
  +* [Branch_Feature_3] Commit Msg: Feature_3, Commit #1
   * [master^] Commit Msg: Master, Commit #2
 ++* [Branch_Feature_2] Commit Msg: Feature_2, Commit #2
 ++* [Branch_Feature_2^] Commit Msg: Feature_2, Commit #1
+++* [Branch_Feature_1] Commit Msg: Feature_1, Commit #1
+++* [Branch_Feature_1^] Master_Commit_Msg: Original file

为了清晰地展示每个工具的内容,我使用“Branch_”前缀命名了所有分支,并使用“Commit Msg”标记了所有提交消息。
在这个例子中,有四个分支,Master和Branch_Feature_1到Branch_Feature_3。Branch_Feature_1有1个提交,Branch_Feature_2有两个提交。两者都通过快进合并进行了合并。Feature_3有一个提交,并通过非快进合并进行了合并,因为在Feature_3分支后有一个提交到master。
“----”上面的行显示了每个分支以及主分支的最新提交,即每个分支的末端。在master之前加上“*”表示它是当前活动分支。其他所有分支的“!”前缀表示它们不是活动分支。
“----”下面的行显示了每个分支的所有提交。“-”前缀表示合并。“+”和“*”前缀显示哪些提交存在于上面“----”中显示的哪些分支上。注意列如何对齐。再次比较“*”与“+”,只是显示哪个是活动分支,哪个不是。
将此与同一存储库的git log输出进行比较:
git log --oneline --graph --all --parents
*   2d142e7 fd4f402 9eb9513 (master) Merge branch 'Branch_Feature_3' Commit Msg: Merge Master Commit #2 + Feature_3
|\
| * 9eb9513 c9bb4db (HEAD -> Branch_Feature_3) Commit Msg: Feature_3, Commit #1
* | fd4f402 c9bb4db Commit Msg: Master, Commit #2
|/
* c9bb4db a470d38 (Branch_Feature_2) Commit Msg: Feature_2, Commit #2
* a470d38 f3fde4d Commit Msg: Feature_2, Commit #1
* f3fde4d 81753a3 (Branch_Feature_1) Commit Msg: Feature_1, Commit #1
* 81753a3 Master_Commit_Msg: Original file

请注意,git log仅显示每个分支当前HEAD上的提交的分支名称。树形符号用于指示哪些提交在哪些分支上,但我发现git show-branch输出更好地显示了它们之间的关系。
请注意,如果您希望查看SHA-1值而不是简写引用,请添加--sha1-name
! [Branch_Feature_1] Commit Msg: Feature_1, Commit #1
 ! [Branch_Feature_2] Commit Msg: Feature_2, Commit #2
  * [Branch_Feature_3] Commit Msg: Feature_3, Commit #1
   ! [master] Merge branch 'Branch_Feature_3' Commit Msg: Merge Master Commit #2 + Feature_3
----
   - [2d142e7] Merge branch 'Branch_Feature_3' Commit Msg: Merge Master Commit #2 + Feature_3
  *+ [9eb9513] Commit Msg: Feature_3, Commit #1
   + [fd4f402] Commit Msg: Master, Commit #2
 +*+ [c9bb4db] Commit Msg: Feature_2, Commit #2
 +*+ [a470d38] Commit Msg: Feature_2, Commit #1
++*+ [f3fde4d] Commit Msg: Feature_1, Commit #1

0
你可以像这样做:
git log --decorate --oneline --pretty='%h refs: %d message:%s'

请注意,并非所有提交都具有分支或标签的参考。为此,您需要使用更复杂的“管道”方法。

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