【问题标题】:Showing branch hierarchy at the command line?在命令行显示分支层次结构?
【发布时间】:2011-11-29 05:05:26
【问题描述】:

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

* master
joes_work
refactoring
experiment

你会看到这样的输出:

* master
    joes_work
    refactoring
        experiment

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

【问题讨论】:

  • 该问题与提交之间的关系无关,仅分支。您可以有 5 个分支指向不相关的提交,但它们仍然根据其上游分支形成图表。我认为没有任何方法可以从 git cli 中获得答案。

标签: git


【解决方案1】:

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:你可以给它起一个别名。我有一个类似的 git log 别名,它非常好,我将其别名为 lg,所以 git lg。
  • 感谢 ctcherry,这真的很有用(我第二次需要它)。如果可以的话,我会给你另一个投票。
  • 不错!我使用git config --global alias.tree 'log --all --graph --decorate --oneline --simplify-by-decoration',它给了我git tree
【解决方案2】:

试试

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

【讨论】:

  • git show-branch 在分支中显示 commits,而不仅仅是分支列表。
  • 我不确定这就是我要找的东西。它似乎在分支中显示提交,但我正在寻找的是一种查看所有分支的树视图的方法。
  • 树是自下而上绘制的,不是从左到右,但它就在那里。树枝似乎被折断的地方,就是那个树枝缺少提交的地方。还要注意一个提交是如何从一个分支中丢失的,即使它在其他方面与另一个分支相同,所以只显示分支名称往往过于简单。
【解决方案3】:

我想完成@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

【讨论】:

  • 感谢您为回答提供一些color
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

    如果你反其道而行之,那就无法区分了:

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

    我能想到找出某个分支源自哪个分支的唯一方法是 reflog,但这是不可靠的(通常会删除超过 90 天的条目)。

    【讨论】:

    • 你知道这是否适用于 .git/logs/refs/heads 中的文件吗?每个分支都有一个文件,分支的第一行说明该分支来自哪个分支。
    【解决方案6】:

    你的.gitconfig 的别名怎么样:

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

    您还可以提供选项,具体取决于您的 tree 命令支持的内容,例如 -D 用于时间戳。

    【讨论】:

    • 这只是git branch 的蹩脚版本。问题想要显示分支层次结构的东西 - 从分支分支等等......
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 2017-07-15
    • 2018-08-21
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多