在git中可视化分支拓扑

我在自己的机器上孤立地玩git,我发现很难保持所有分支和提交的心智模式。 我知道我可以做一个git log来查看我所在的提交历史logging,但是有没有办法看到整个分支地形,就像这些ascii地图似乎在任何地方用来解释分支?

  .-A---M---N---O---P / / / / / IBCDE \ / / / / `-------------' 

它只是觉得有人来,并试图拿起我的存储库将难以确切地发生了什么事情。

我想我受到AccuRev的stream浏览器的影响 …

git log --graphgitk 。 (两者都接受 – 所有,这将显示所有分支,而不是只是当前的。)

编辑:对于分支名称和紧凑视图,请尝试: git log --graph --decorate --oneline

我通常使用

 git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s" 

用颜色(如果你的shell是Bash):

 git log --graph --full-history --all --color \ --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s" 

这将打印这样的基于文本的表示forms:

 * 040cc7c (HEAD, master) Mannual is NOT built by default * a29ceb7 Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines. | * 901c7dd (cvc3) cvc3 now configured before building | * d9e8b5e More sane Yices SMT solver caller | | * 5b98a10 (nullvars) All uninitialized variables get zero inits | |/ | * 1cad874 CFLAGS for cvc3 to work succesfully | * 1579581 Merge branch 'llvm-inv' into cvc3 | |\ | | * a9a246b nostaticalias option | | * 73b91cc Comment about aliases. | | * 001b20a Prints number of iteration and node. | |/ |/| | * 39d2638 Included header files to cvc3 sources | * 266023b Added cvc3 to blast infrastructure. | * ac9eb10 Initial sources of cvc3-1.5 |/ * d642f88 Option -aliasstat, by default stats are suppressed 

(你可以只使用git log --format=oneline ,但是它会将提交消息绑定到数字,这看起来不太漂亮)。

要创build这个命令的快捷方式,你可能需要编辑你的~/.gitconfig文件:

 [alias] gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m" 

然而,正如Sodel在评论中的Vociferous笔记,这样长的格式命令很难记住。 通常情况下,这不是问题,因为你可能会把它放到~/.gitconfig文件中。 但是,如果您有时必须login到无法修改configuration文件的远程计算机,则可以使用更简单但更快速的键入版本:

 git log --graph --oneline 

:我有3个别名(和4个别名别名用于快速使用) ,我通常在我的~/.gitconfig文件中:

 [alias] lg = !"git lg1" lg1 = !"git lg1-specific --all" lg2 = !"git lg2-specific --all" lg3 = !"git lg3-specific --all" lg1-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' lg2-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' lg3-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset) %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n'' %C(white)%s%C(reset)%n'' %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)' 

git lg / git lg1看起来像这样:

git lg1

git lg2看起来像这样:

git lg2

git lg3看起来像这样:

git lg3

注意:从stackoverflow.com/questions/1057564/pretty-git-branch-graphs复制并改进了答案,因为这里比在那里更合适。 由于历史的原因,在另一个问题上留下副本 – 现在已经closures了,答案被其他一些答案所引用。

对于任何这些食谱(基于git log或gitk),你可以添加--simplify-by-decoration来折叠历史的无趣的线性部分。 这使得更多的拓扑一次可见。 我现在可以理解,如果没有这个选项,大的历史将是不可理解的!

我觉得有必要张贴这个,因为它似乎不像应该那样广为人知。 它没有出现在关于可视化历史的堆栈溢出问题的大部分,我花了很多searchfind – 即使我知道我想要它! 我终于在这个Debian的bug报告中find了它。 Stack Overflow的第一个提到似乎是Antoine Pelisse的这个答案 。

Gitk有时候让我感到痛苦。

在这里输入图像描述

激励我写GitVersionTree 。

在这里输入图像描述

“99.999%的时间是通过git lg查看历史logging,0.001%是通过git log

只是想分享2个可能有用的日志别名。 (从.gitconfigconfiguration)

 [Alias] lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short 
  • git lg会看到当前的分支历史logging。
  • git hist会看到整个分支的历史。

我喜欢用git log来做:

  git log --graph --oneline --branches 

(也可以用于查看远程分支)

适用于最近的Git版本: 自1.6.3 ( 2009年5月7日,星期四 )

  • 现在可以将日志系列命令的“ --pretty=<style> ”选项拼写为“ --format=<style> ”。
    另外,– --format=%formatstring--pretty=tformat:%formatstring

  • --oneline ”是“ --pretty=oneline --abbrev-commit ”的同义词。

 PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all * 4919b68 a second bug10 fix * 3469e13 a first bug10 fix * dbcc7aa a first legacy evolution | * 55aac85 another main evol | | * 47e6ee1 a second bug10 fix | | * 8183707 a first bug10 fix | |/ | * e727105 a second evol for 2.0 | * 473d44e a main evol |/ * b68c1f5 first evol, for making 1.0 

您还可以限制日志显示的范围(提交数量):

 PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5 * 4919b68 a second bug10 fix * 3469e13 a first bug10 fix * dbcc7aa a first legacy evolution | * 55aac85 another main evol | | * 47e6ee1 a second bug10 fix 

(只显示最后5次提交)


我不喜欢目前select的解决scheme是:

  git log --graph 

它显示了太多的信息(当我只想看一个快速的总结):

 PS D:\git\tests\finalRepo> git log --graph * commit 4919b681db93df82ead7ba6190eca6a49a9d82e7 | Author: VonC <vonc@laposte.net> | Date: Sat Nov 14 13:42:20 2009 +0100 | | a second bug10 fix | * commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9 | Author: VonC <vonc@laposte.net> | Date: Sat Nov 14 13:41:50 2009 +0100 | | a first bug10 fix | 

gitk很棒,但是强迫我离开shell会话到另一个窗口,而显示最后n个提交很快就足够了。

看一下Gitkraken – 一个以清晰的方式显示拓扑结构的跨平台GUI。

拓扑

以下是一些高级function的快速video教程 。

Gitg对于Linux 来说是一个很好的工具,类似于OS X的Gitx。只需要在你的版本库树结构的某个地方的命令行上运行'gitg'(和gitx一样)。

我发现“git-big-picture”相当有用: https : //github.com/esc/git-big-picture

它使用dot / graphviz创build漂亮的2Dgraphics,而不是相当线性的,“一维”的视图gitk和朋友产生。 使用-i选项,它显示分支点和合并提交,但是留下了所有的内容。

一个很好的基于Web的工具是ungit 。 它运行在node.js&git支持的任何平台上。 有一个video说明如何find比阅读更容易的事情

在这里输入图像描述

看看BranchMaster 。

我把它写成可视化复杂的分支结构,把它们之间的所有提交合并成一行。 数字表示提交的数量。

在这里输入图像描述

Giggle绘制漂亮的图表

我使用以下别名。

 [alias] lol = log --graph --decorate --pretty=oneline --abbrev-commit lola = log --graph --decorate --pretty=oneline --abbrev-commit --all 

它在配色scheme中比上面我看到的别名有更多的信息。 它也似乎是相当普遍的,所以你可能有机会在其他环境中存在,或者能够在谈话中提及它,而不必解释它。

截图和完整的描述在这里: http : //blog.kfish.org/2010/04/git-lola.html

龟Git有一个名为“修正图”的工具。 如果你在Windows上,就像右键单击你的repo – > Tortoise Git – >修改图一样简单。

我发现这个博客文章显示了一个简洁的方式:

 git log --oneline --abbrev-commit --all --graph --decorate --color 

我通常为上面的命令创build一个别名:

 alias gg='git log --oneline --abbrev-commit --all --graph --decorate --color' 

简单的使用gg

我个人最喜欢的别名,通过.gitconfig,是:

 graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n" 

旧post,但检查SmartGit 。 它非常让人想起龟HG分支可视化,它是免费的非商业用途。

我在~/.gitconfig有这个git log别名来查看图表历史logging:

 [alias] l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)' 

有了别名, git l会显示如下的内容:

在这里输入图像描述

在Git 2.12 +中,您甚至可以使用log.graphColorsconfiguration选项自定义graphics的线条颜色。

至于日志的格式,它类似于--oneline ,增加了作者的名字 (尊重.mailmap )和相对作者的date 。 请注意,Git> = 1.8.3支持%C(auto)语法,它告诉Git使用默认的提交散列颜色等。

如果你碰巧在OS X上,Gitx也是一个很棒的可视化工具。

另一个git log命令。 这一个固定宽度的列

 git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short 

没有人提到tig ? 它不会像“BranchMaster”一样折叠分支,但…

它很快,在terminal运行。

因为它很快(+键盘控制),你会得到一个伟大的用户体验,它几乎就像我的“ ls ”包含git仓库的目录。

https://jonas.github.io/tig/

它有通常的快捷方式,search等

修订图表

(ps。它是这个截图后台的terminal,现在看起来好多了,但是我的电脑拒绝截图了,对不起)

(pps。我也使用gitkraken,并且具有非常清晰的可视化效果,但比tig要重得多)

在Windows上,您可以使用一个非常有用的工具:git扩展。 这是一个GUI工具,使得git操作非常简单。

它也是开源的。

http://gitextensions.github.io

我已经尝试过 – --simplify-by-decoration但我所有的合并都没有显示。 所以我只是剪掉标题中没有“\”和“/”符号的行,而总是保留“(”表示分支之后立即显示分支历史logging,我一般对提交注释不感兴趣,所以我也删除它们,最后我得到了下面的shell别名。

 gbh () { git log --graph --oneline --decorate "$@" | grep '^[^0-9a-f]*[\\/][^0-9a-f]*\( [0-9a-f]\|$\)\|^[^0-9a-f]*[0-9a-f]*\ (' | sed -e 's/).*/)/' } 

对于Mac用户,免费开源工具GitUp(无双关语): http ://gitup.co/

我喜欢图表的显示方式,比我见过的其他工具更清晰。

该项目在这里: https : //github.com/git-up/GitUp

GitUp截图