在命令行中显示分支层次结构?

95

我很好奇是否有一种方法可以在命令行上显示分支层次结构?例如,如果我使用git branch,而不是看到这样的输出:

* master
joes_work
refactoring
experiment
你会看到以下这样的输出:
* master
    joes_work
    refactoring
        experiment

那样很容易看出一个特定分支是从哪个分支分支出来的。即使没有特定的命令输出树形结构,是否有一种命令可以输出有关哪个分支来自哪个分支的信息?我可以使用Perl脚本格式化输出。


这个问题与提交之间的关系无关,只与分支有关。你可以有5个指向不相关提交的分支,但它们仍然形成一个上游分支的图形。我认为没有办法从git cli中得到答案。 - Todd Freed
7个回答

136

sehe的解决方案看起来很不错,这里有另一个看起来包含类似信息但格式不同的解决方案,它使用git log,因此还包含提交信息(忽略分支名称,我有点弄乱了!):

git log --all --graph --decorate --oneline --simplify-by-decoration

* ae038ad (HEAD, branch2-1) add content to tmp1
| * f5a0029 (branch2-1-1) Add another
|/  
* 3e56666 (branch1) Second wave of commits
| * 6c9af2a (branch1-2) add thing
|/  
* bfcf30a (master) commit 1

是的 - 我实际上更喜欢这种方式,因为它更加灵活,但是用手机打字会很麻烦 - 而且很可能对于OP来说有点过度设计。 - sehe
3
@sehe:你可以为它创建一个别名。我有一个类似的 Git 日志别名,非常好用,我将其别名为“lg”,这样就可以使用 git lg 了。 - Jorge Israel Peña
1
谢谢ctcherry,这真的很有用(我第二次需要它了)。如果可以的话,我会再给你一个赞。 - Rocky Sims
10
好的!我使用 git config --global alias.tree 'log --all --graph --decorate --oneline --simplify-by-decoration' 命令来创建别名 git tree - chetbox

35

我希望能够补充@ctcherry的回答。

我喜欢能够看到提交者和日期的信息,因此使用以下行:

git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

然而这是一行相当长的内容,难以记忆,因此您可以使用别名。您只需要在终端中使用以下命令:

git config --global alias.lg "这里放入我大量记录的命令行"


为了总结,在您的终端上复制并粘贴以下行:

git config --global alias.lg "log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

那么您只需使用git lg即可获取日志历史树。

示例: enter image description here

来源


4
感谢您为答案增添些许色彩! - dsz
2
实际上,使用自动着色来区分分支名称是非常方便的,这样你就可以更容易地区分删除和本地分支了:%C(auto)%d%Creset - Niko Föhr
使用自动着色分支名称实际上很好,因为这样可以更轻松地区分删除和本地分支:%C(auto)%d%Creset - Niko Pasanen

32

尝试

git show-branch
git show-branch --all

输出示例:

bash$ git show-branch --all
! [branchA] commitA only in branchA
 * [branchB] commitB
  ! [branchC] commitC only in branchC
---------------------
+   [branchA] commitA only in branchA 
 *  [branchB] commitB
  + [branchC] commitC only in branchC
 *+ [branchC~1] commitB-1 also in branchC
 *+ [branchC~2] commitB-2 also in branchC
+++ [branchC~3] common ancestor
+++ [branchC~4] more common ancestors

5
git show-branch 显示分支中的 提交记录,而不仅仅是分支列表。 - svick
2
我不确定这是否是我正在寻找的内容。它似乎显示分支中的提交,但我正在寻找的是查看所有分支的树形视图的方法。 - mellowsoon
1
树是从下往上绘制的,而不是从左到右,但它确实存在。 如果看起来树枝断了,那就意味着该树枝缺少一次提交。 还要注意的是,即使一个分支与另一个分支完全相同,也可能缺少一个提交,因此仅显示分支名称往往会过于简化。 - tripleee

16

只需输入gitk命令并按回车键即可。

对我来说,gitk是最简单的解决方案。虽然它不会显示命令模式,但它会自动填充一个漂亮的UI,如下所示:

输入图像描述


1
在我看来,如果你像我一样是一个视觉型人才,这是最方便的答案。谢谢! - Fabien Teulieres

5

从Git的角度来看,分支并不是这样工作的。如果我在分支a上进行一些提交,然后从它创建分支b,在那里工作,然后回到a上做其他工作:

A -- B -- D <-- a
       \
        \
          C <-- b

如果你反过来做,这是无法区分的。
A -- B -- C <-- b
       \
        \
          D <-- a

我唯一能想到的找出某个分支来源的方法是使用reflog,但这不可靠(90天以前的记录通常会被删除)。

你知道这是否适用于.git/logs/refs/heads中的文件吗?那里面有每个分支的一个文件,分支的第一行显示该分支来自哪个分支。 - mellowsoon

0

-3
这个别名怎么样,可以加到你的.gitconfig文件中:
[alias]
branch-tree = !cd "$(git rev-parse --git-dir)/refs/heads" && tree

您还可以根据您的tree命令支持的选项进行选择,例如-D用于时间戳。


2
这只是一个糟糕的 git branch 版本。问题需要展示分支层次结构 - 显示一个分支从哪些分支派生出来,等等... - Duncan Lock

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