git 分支在树中的输出,如时尚

Posted

技术标签:

【中文标题】git 分支在树中的输出,如时尚【英文标题】:Output of git branch in tree like fashion 【发布时间】:2010-03-10 22:10:26 【问题描述】:

现在,当我输入“git branch”时

它以任意顺序列出我的分支。

如果“git 分支”将我的输出列在类似 fasion 的树中,我更愿意这样做:

master
|-- foo
  |-- foo1
  |-- foo2
|-- bar
  |-- bar4

这里,foo & bar 是从 master 分支出来的; foo1 & foo2 是从 foo 分支出来的; bar4 是从 bar 分支出来的。

这容易实现吗?

[仅限命令行实用程序。这需要适合我的 zsh/vim 工作流程。]

【问题讨论】:

这里的答案(包括我自己的)似乎都没有为我认为你真正想要的以及我知道我想要的提供足够的解决方案。当我有机会时,我将编写一个新的实用程序来解决这个问题。可能会称之为git_tree。它将在此处输出类似于arc flow 的内容:***.com/questions/54227968/…。也许有一天我什至可以将它合并到 git 本身。 这个人似乎也想要同样的东西:reddit.com/r/git/comments/282c1f/… git log --graph 我觉得就够了。 【参考方案1】:

answer below 使用git log

我在 2009 年用“Unable to show a Git tree in terminal”提到了类似的方法:

git log --graph --pretty=oneline --abbrev-commit

但我一直在使用的完整版本在“How to display the tag name and branch name using git log --graph”(2011):

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

git lgb

原始答案(2010 年)

git show-branch --list 接近您正在寻找的内容(使用拓扑顺序)

--topo-order

默认情况下,分支及其提交按时间倒序显示。 此选项使它们按拓扑顺序显示(即,后代提交显示在其父提交之前)。

但是工具git wtf 可以help too。示例:

$ git wtf
Local branch: master
[ ] NOT in sync with remote (needs push)
    - Add before-search hook, for shortcuts for custom search queries. [4430d1b] (edwardzyang@...; 7 days ago)
Remote branch: origin/master (git@gitorious.org:sup/mainline.git)
[x] in sync with local

Feature branches:
  origin/release-0.8.1 is NOT merged in (1 commit ahead)
    - bump to 0.8.1 [dab43fb] (wmorgan-sup@...; 2 days ago)
[ ] labels-before-subj is NOT merged in (1 commit ahead)
    - put labels before subject in thread index view [790b64d] (marka@...; 4 weeks ago)
x origin/enclosed-message-display-tweaks merged in
(x) experiment merged in (only locally)

NOTE: working directory contains modified files

git-wtf 向您展示:

如果是跟踪分支,您的分支与远程存储库的关系如何。 如果是功能分支,您的分支与非功能(“版本”)分支的关系如何。 如果是版本分支,您的分支与功能分支的关系如何

【讨论】:

一直在使用您的漂亮格式的变体,该格式也显示作者电子邮件,使用 %ae。另外我更喜欢用“sl”来调用别名,以类似于 hg 的 smartlog。 非常感谢git-wtf 工具的链接,它非常有用。似乎基本上打破了我盯着一棵花哨的git log 树得出的结论,但总结得很好。 我希望找到一种方法,以便结帐分支应该显示它是从哪个分支签出的 @ChangZhao 类似于“寻找父分支”,但不容易做到:***.com/a/3162929/6309,***.com/a/56452713/6309 @jarno 这是预期的:git-wtf 是一个可执行文件(ruby 脚本),您应该将其放入 $PATH 以便能够执行 git wtf【参考方案2】:

这不是你要求的,但是

git log --graph --simplify-by-decoration --pretty=format:'%d' --all

做得很好。它还显示标签和远程分支。这可能不是每个人都想要的,但我发现它很有用。 --simplifiy-by-decoration 是这里限制显示的参考的大技巧。

我使用类似的命令来查看我的日志。我已经能够用它完全替换我的 gitk 用法:

git log --graph --oneline --decorate --all

我通过在我的 ~/.gitconfig 文件中包含这些别名来使用它:

[alias]
    l = log --graph --oneline --decorate
    ll = log --graph --oneline --decorate --branches --tags
    lll = log --graph --oneline --decorate --all

编辑:更新了建议的日志命令/别名以使用更简单的选项标志。

【讨论】:

IMO 这是最好的答案,但我认为SourceTree 或 gitk 或类似的东西是解决这类问题的方法。 这会显示原点的分支。有什么办法可以让本地分支机构显示这个? @Jeff 将 --all 替换为 --branches --tags 可能会做到这一点。【参考方案3】:

TLDR;使用 git show-treegit lg 别名(我的首选)。

在树视图中显示所有分支(包括远程分支):

使用git show-tree:

在 Ubuntu 上测试:

# Install it
sudo apt install git-extras

# Run it:
git-show-tree
# OR (same thing)
git show-tree

这会产生类似于此处 2 个最受好评的答案的效果。

来源:http://manpages.ubuntu.com/manpages/bionic/man1/git-show-tree.1.html

示例:

man git show-tree 显示以下示例:

示例

将所有分支的提交历史日志输出为树形视图:

*   4b57684 (HEAD, develop) Merge branch upstream master.
|\
| *   515e94a Merge pull request #128 from nickl-/git-extras-html-hyperlinks
| |\
| | * 815db8b (nickl/git-extras-html-hyperlinks, git-extras-html-hyperlinks) help ronn make hyperlinks.
| * | 7398d10 (nickl/develop) Fix #127 git-ignore won´t add duplicates.
| |/
| | * ab72c1e (refs/stash) WIP on develop: 5e943f5 Fix #127 git-ignore won´t add duplicates.
| |/
|/|
* | 730ca89 (bolshakov) Rebase bolshakov with master
|/
* 60f8371 (origin/master, origin/HEAD, master) Merge pull request #126 from agrimaldi/fix-changelog-last-tag
* 9627780 (tag: 1.7.0) Release 1.7.0
* 2e53ff6 (tag: 1.6.0) Release 1.6.0
* bbd32d8 (tag: 1.5.1) Release 1.5.1
| * 6b6b758 (nickl/gh-pages, gh-pages) add example git-extras to gh-pages
| * 19cfd11 (origin/gh-pages) Index page
| | * 881a70e (tag: 1.5.0) Release 1.5.0
| |/
|/|
* | 4db5ee0 (tag: 1.4.0) Release 1.4.0
* | 9b0bc89 (tag: 1.3.0) Release 1.3.0
* | be49961 (tag: 1.2.0) Release 1.2.0
* | c1d2dfc (tag: 1.1.0) Release 1.1.0
* | 4a56adb (tag: 1.0.0) Release 1.0.0
* | 948308b (tag: 0.9.0) Release 0.9.0
* | 40b131d (tag: 0.8.1) Release 0.8.1
* | 391431d (tag: 0.8.0) Release 0.8.0

这是git show-tree 在ardupilot repo 上的示例输出:


另外,如果你安装了 arcanist(更正:Uber's fork of arcanist 已安装——请参阅the bottom of my answer here 以获取安装说明),arc flow 会显示一个漂亮的上游依赖关系树(即:之前通过arc flow new_branch 或通过git branch --set-upstream-to=upstream_branch 手动设置)。 arc flow 的示例输出:

master                              
└──graft-D999
   └──new_feature_1
      └──new_feature_2 

我真的觉得arc flow 视图既漂亮又有用,所以我有这个(非活动的,还没有功能的)git tree 开源项目,我计划在其中复制它的行为:https://github.com/ElectricRCAircraftGuy/git-tree。

以“树状”的方式显示一个分支

# Show the currently-checked-out branch
git lg

# OR: show branch_name
git lg branch_name

您可以添加-p--patch 以显示更改的行:

git lg -p
# OR
git lg --patch

安装git lg 别名(来源:https://coderwall.com/p/euwpig/a-better-git-log):

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

显示sshfs repo 上的分叉和合并等内容的示例输出:

奖励 git 技巧:

How do I know if I'm running a nested shell? - 请参阅此处标题为“奖励:始终在您的终端中显示您当前的git branch,您也在使用!”

相关:

    What's the difference between `arc graft` and `arc patch`?

【讨论】:

【参考方案4】:

以下示例也显示了提交父项:

git log --graph --all \
--format='%C(cyan dim) %p %Cred %h %C(white dim) %s %Cgreen(%cr)%C(cyan dim) <%an>%C(bold yellow)%d%Creset'

【讨论】:

【参考方案5】:

您可以使用名为gitk 的工具。

【讨论】:

我喜欢 gitk,但我没有在 Mac 中找到 gitk。如果您有任何建议,请告诉我。我开始使用Github Desktop,但喜欢在命令行上工作。【参考方案6】:

对于那些使用 Github 的人来说,他们有一个分支 network viewer 似乎更容易阅读

【讨论】:

以上是关于git 分支在树中的输出,如时尚的主要内容,如果未能解决你的问题,请参考以下文章

数据结构二叉树的遍历

如何用子目录美化 git 分支?

致命:此操作必须在工作树中运行[重复]

在树中的递归查找

如何使用 python 中的 treelib 库在树中插入节点?

如果在树中嵌套其他值,则获取文本文件(yaml)中的键值[重复]