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


79

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

* master
joes_work
refactoring
experiment

您会看到如下输出:

* master
    joes_work
    refactoring
        experiment

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


该问题与提交(仅分支)之间的关系无关。您可以有5个分支指向不相关的提交,这些分支仍然按照它们的上游分支形成图。我认为没有任何办法可以从git cli中获得答案。
托德(Todd)

Answers:


114

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有点
矫over

2
@sehe:您可以为其别名。我有一个类似的git log别名,它非常好,我将其别名为lg,所以git lg。
乔治·佩尼亚

感谢ctcherry,这真的很有用(第二次我需要它)。如果可以的话,我再给你投票。
Rocky Sims

5
真好!我用git config --global alias.tree 'log --all --graph --decorate --oneline --simplify-by-decoration'它给我git tree
chetbox's

27

尝试

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

4
git show-branch显示分支中的提交,而不仅仅是分支列表。
审核

1
我不确定这是我要找的东西。它似乎显示了分支中的提交,但是我正在寻找的是一种查看所有分支的树视图的方法。
mellowsoon 2011年

这棵树是从下往上画的,不是从左到右,而是在那儿。树枝似乎断了的地方,那是那个树枝缺少提交的地方。还请注意,即使一个分支与另一个分支相同,也可能会丢失一个分支的提交,因此仅显示分支名称往往会过于简化。
三人

25

我想完成@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 "HERE GOES MY BIG LOG COMMAND LINE"


要进行总结,请在您的终端上复制并粘贴以下行:

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来获取日志历史记录树。

例: 在此处输入图片说明

src


1
感谢您为答案添加颜色
dsz

13

只需键入gitk命令,然后按Enter。

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

在此处输入图片说明


5

从git的角度来看,分支不是这样工作的。如果我对branch进行了一些提交ab从中创建了branch ,在那儿工作,然后再做其他工作a

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

如果您以其他方式做到这一点,则无法区分:

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

我可以想到的唯一方法是确定某个分支源自哪个分支是reflog,但这是不可靠的(通常会删除90天以上的条目)。


您知道这是否适用于.git / logs / refs / heads中的文件吗?每个分支都有一个文件,分支的第一行说明该分支来自哪个分支。
mellowsoon

-2

这个别名为您如何.gitconfig

[alias]
branch-tree = !cd "$(git rev-parse --git-dir)/refs/heads" && tree

您还可以根据tree命令支持的内容(例如-D时间戳)提供选项。


1
这只是的a脚版本git branch。这个问题想要显示分支层次结构的东西-从哪个分支分支分支,等等...
Duncan Lock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.