在git中可视化分支拓扑

Ben*_*jol 839 git

我在自己的机器上独立玩git,我发现很难维护我所有分支和提交的心理模型.我知道我可以做一个git log从我所在的地方查看提交历史,但有没有办法看到整个分支地形,像这些ascii地图似乎在任何地方用来解释分支?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'
Run Code Online (Sandbox Code Playgroud)

只是觉得有人出现并试图拿起我的存储库会很难确定正在发生的事情.

我想我受AccuRev 流媒体浏览器的影响 ......

jro*_*way 1022

git log --graphgitk.(两者都接受--all,它将显示所有分支而不仅仅是当前分支.)

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

  • 我建议`git log --graph --decorate --oneline` - 每行显示一次提交,并用分支名称装饰. (196认同)
  • 这甚至没有用分支标记提交.我不认为这是一个很好的可视化. (44认同)
  • [tig](https://github.com/jonas/tig)(一个ncurse git客户端)也提供``--all``选项.相当方便! (8认同)
  • 谢谢!gitg也有`--all`选项,也标记了提交.我也从未在下拉列表中看到你可以选择那里的所有分支. (7认同)
  • 另请参阅[安德鲁的回答](// stackoverflow.com/questions/1838873/visualizing-branch-topology-in-git#answer-7509303)关于`--simplify-by-decoration`选项. (3认同)
  • --pretty = oneline也很方便 (2认同)
  • 还加上一个“-n”。其中“n”是您想要限制日志的提交次数 (2认同)

P S*_*ved 473

我经常使用

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"
Run Code Online (Sandbox Code Playgroud)

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

git log --graph --full-history --all --color \
        --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
Run Code Online (Sandbox Code Playgroud)

这将打印基于文本的表示,如下所示:

* 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
Run Code Online (Sandbox Code Playgroud)

(你可以使用git log --format=oneline,但它会将提交消息绑定到数字,这看起来不那么漂亮恕我直言).

要为此命令创建快捷方式,您可能需要编辑~/.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"
Run Code Online (Sandbox Code Playgroud)

然而,正如Vociferous在评论中所说的那样,这种长格式化命令难以记忆.通常,这不是问题,因为您可以将其放入~/.gitconfig文件中.但是,如果您有时必须登录到无法修改配置文件的远程计算机,则可以使用更简单但更快的类型版本:

git log --graph --oneline
Run Code Online (Sandbox Code Playgroud)

  • 如果你喜欢约会:git log --graph --full-history --all --color --date = short --pretty = format:"%x1b [31m%h%x09%x1b [32m%d%x1b [ 0m%x20%ad%s" (10认同)
  • --onon是一个更令人难忘的替代所有那种相当格式化的深魔术. (7认同)
  • 注意:`--full-history`仅在使用`--simplify-by-decoration`或指定文件路径时才有意义. (2认同)
  • 我可能会问您从哪里获得格式字符串?或者,您到底是如何炮制那件事的? (2认同)

Sli*_*son 413

我有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)'
Run Code Online (Sandbox Code Playgroud)

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

git lg1

git lg2 看起来像这样:

git lg2

并且git lg3看起来是这样的:

git lg3

注意:答案在stackoverflow.com/questions/1057564/pretty-git-branch-graphs上复制并改进了答案,因为它在这里比在那里更合适.由于历史原因,将副本留在另一个问题上 - 它现在已关闭,答案由一堆其他答案引用.

  • 建议:将`%C(粗体黄色)`替换为'%C(自动)`,以便为`HEAD`,*local*和*remote branches*([ref](http://stackoverflow.com/q)提供不同的颜色/二百二十四万七千零三十九分之一千二百六十九万四千五百十)). (8认同)
  • @PedroGarcíaMedina 我的意思是“将引用的文本作为 shell 命令运行,而不是调用另一个 git 命令”,其设计主要是为了将其他工具与 git _ 集成(例如,您可以编写类似 `syncup = !"git pull &amp;&amp; 的内容)使所有“`)_。我在这里使用它是因为我无法在别名中调用另一个别名(我只能调用 git 命令),但也许在较新版本的 git 中这已经改变了。我将仔细检查并简化是否现在可以仅使用“lg = lg1”来完成。 (3认同)
  • 注意,可以避免使用%w()在格式字符串中手动添加缩进。这样,您还可以正确地换行较长或多行的提交消息,而不会弄乱图表。 (2认同)
  • @mbadawi23 为了跨平台和 Git 安装的一致性,它们是多余的。`--abbrev-commit` 在那里,因为第 2-3 行是用空格手工缩进的,我想绝对确保它会使用短 SHA——所以比抱歉更安全。`--decorate` 也在那里,因为虽然 Git 的默认设置做同样的事情,但在不同的 Git 版本中可能会有所不同或不同的配置——对于这些,我绝对想要装饰。最终,额外/冗余标志在这里也不错——这在一个文件中;这不是你一直输入的东西。 (2认同)
  • @TimothyPulliam 要了解提交是“每个分支的一部分”,您必须直观地跟踪彩色线。几乎所有工具在这方面都帮不了你多少,因为 Git 提交本质上并不属于任何分支——它们被暗示(在图形可视化时间)属于任何在其父祖先中包含它们的分支或标签. 如果没有分支/标记引用提交并且它消失了(但在大约 2 周内没有被垃圾收集);添加引用以前未引用的提交的分支/标签,它会重新出现。我希望这一切都有意义。 (2认同)

And*_*rew 226

对于这些配方中的任何一个(基于git log或gitk),您可以添加--simplify-by-decoration以折叠历史记录中不感兴趣的线性部分.这样可以立即显示更多的拓扑.我现在可以理解没有这个选项会难以理解的大历史!

我觉得有必要发布这个,因为它似乎并不像它应该的那样众所周知.它没有出现在关于可视化历史的大多数Stack Overflow问题中,并且我花了很多时间寻找 - 即使在我知道我想要它之后!我终于在这个Debian错误报告中找到了它.关于Stack Overflow的第一次提及似乎是Antoine Pelisse的回答.

  • 这应该是答案.`git log --graph --all --simplify-by-decoration`也适用. (9认同)
  • 也适用于`tig`,imho是大型回购的最佳选择. (6认同)
  • 这正是我所需要的,太棒了.在所有答案中,这是唯一帮助我的东西.`--simplify-by-decoration`清楚地说明了发生了什么. (4认同)
  • 完美 - 正是我想要的!它应该得到更多的赞成; 几乎每个人都已经知道gitk/gitg/git log --graph,但是如果你想要显示分支拓扑并且不关心单个提交,那么它们根本不是很有用. (3认同)

che*_*sum 72

Gitk 有时我很难读.

在此输入图像描述

激励我写GitVersionTree.

在此输入图像描述

  • @exhuma我与作者一起支持Mono(在Ubuntu 13.10上针对Mono 2.10测试) (3认同)
  • 刚刚偶然发现了这一点。看起来真的很酷;我等不及要去看看了。一个建议(也许您已经有了),但是折叠不分叉点的多个提交可能会更好。这将使查看分支拓扑变得更加容易。 (2认同)

Yeo*_*Yeo 48

"我99.999%的时间都在寻找历史,git lg而0.001%是由git log"

只想分享2个可能有用的日志别名.(从.gitconfig配置)

[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
Run Code Online (Sandbox Code Playgroud)
  • git lg 将看到当前的分支历史.
  • git hist 将看到整个分支历史.


Von*_*onC 43

我喜欢,git log做,做:

 git log --graph --oneline --branches
Run Code Online (Sandbox Code Playgroud)

(也用--all,用于查看远程分支)

适用于最近的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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

(仅显示最近5次提交)


我不喜欢当前选择的解决方案是:

 git log --graph
Run Code Online (Sandbox Code Playgroud)

它显示了太多信息(当我只想查看快速摘要时):

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
|
Run Code Online (Sandbox Code Playgroud)

gitk 很棒,但强迫我将shell会话留给另一个窗口,而快速显示最后n个提交通常就足够了.


pyl*_*ang 42

看看Gitkraken--一个跨平台的GUI,以清晰的方式显示拓扑.

拓扑

这是一些关于一些高级功能的快速视频教程.

  • 这个帖子怎么有GitKraken,但它没有旧的和免费的SourceTree?(我知道,我知道,Atlassian并不总能把一切都搞定.但SourceTree是一个非常棒的可视化工具.) (5认同)

Jac*_*hal 35

Gitg是Linux的一个很棒的工具,类似于Gitx for OS X.只需在命令行中从存储库的树结构中的某个位置运行'gitg'(与gitx相同).

  • 用这么多的话说:gitg有一个下拉菜单,可以选择哪个分支可视化.此下拉列表还具有"全部"选项. (3认同)

Fra*_*eld 24

我发现"git-big-picture"非常有用:https://github.com/esc/git-big-picture

它使用dot/graphviz创建漂亮的2D图形,而不是gitk和朋友生成的相当线性的"一维"视图.使用-i选项,它显示分支点和合并提交,但不包括中间的所有内容.


Sar*_*ica 24

一个很好的基于Web的工具是ungit.它运行在node.js和git支持的任何平台上.有一个视频说明它如何适用于那些比阅读更容易找到的东西......

在此输入图像描述


str*_*yer 21

看看BranchMaster吧.

我把它写成可视化复杂的分支结构,通过将它们之间的所有提交折叠成一行.数字表示提交的数量.

在此输入图像描述

  • @AalexGabi把它放到你的gitconfig中,它做同样的事情,但在命令行中gbranch = log --graph --simplify-by-decoration --pretty = format:'%C(黄色)%h%C(白色)% d%C(粗体黑色)%ar%C(重置)%n' - 所有 (3认同)
  • 这就是我要找的。是否有替代命令/工具来执行此操作? (2认同)

klm*_*123 20

我正在使用Visual Studio Code编辑器,我发现自己对mhutchie 制作的Git Graph扩展非常满意。(而且我并不孤单,该扩展程序有 100 万用户!)。

在此输入图像描述

如果您碰巧喜欢该编辑器,则只需转到扩展选项卡(左侧中间的小隔间)并输入“Git Graph”并安装

在此输入图像描述

要使用它,请转到 Git 控制选项卡并按查看 Git 图表按钮

在此输入图像描述


Ren*_*nat 15

Giggle绘制了漂亮的图表


Chr*_*dam 15

Tortoise Git有一个名为"Revision Graph"的工具.如果您使用的是Windows,只需右键单击您的仓库 - > Tortoise Git - > Revision Graph即可.


wir*_*res 14

没有人提到过tig?它不像"BranchMaster"那样折叠分支,但是......

它很快,在终端运行.

因为它是如此快速(+键盘控制)你获得了一个很好的用户体验,它几乎像我的" ls"包含git存储库的目录.

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

它有通常的快捷方式,/搜索等.

修订图

(ps.它是这个截图背景中的终端,现在看起来更好,但是我的电脑拒绝截取屏幕截图,抱歉)

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


Lok*_*ist 12

我使用以下别名.

[alias]
    lol = log --graph --decorate --pretty=oneline --abbrev-commit
    lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
Run Code Online (Sandbox Code Playgroud)

它在配色方案中的信息多于我在上面看到的别名.它似乎也很常见,因此您可能有机会将其存在于其他环境中,或者能够在对话中提及它而无需解释它.

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


Sad*_*egh 11

我发现这篇博文显示了一个简洁的方法:

git log --oneline --abbrev-commit --all --graph --decorate --color
Run Code Online (Sandbox Code Playgroud)

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

alias gl='git log --oneline --abbrev-commit --all --graph --decorate --color'
Run Code Online (Sandbox Code Playgroud)

而且只需使用gl.


Eug*_*ash 11

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

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

使用别名,git l将显示如下内容:

在此输入图像描述

在Git 2.12 +中,您甚至可以使用log.graphColors配置选项自定义图形的线条颜色.

至于日志的格式,它--oneline与添加作者姓名(尊重.mailmap)和相对作者日期类似.请注意,%C(auto)Git> = 1.8.3支持语法,该语法告诉Git使用提交哈希的默认颜色等.


Edw*_*Tan 11

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

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

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

GitUp截图


xer*_*ero 8

我个人最喜欢的别名是.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"
Run Code Online (Sandbox Code Playgroud)

  • 稍微解释什么命令看起来会很棒. (5认同)

pyl*_*ang 8

对于那些使用VSCode文本编辑器的人,请考虑D. Jayamanne 的Git History Extension:

在此输入图像描述

  • Visual Studio Code的另一个扩展是mhutchie的[Git Graph](https://github.com/mhutchie/vscode-git-graph)。我将它与GitLens一起使用。 (2认同)

kEN*_*END 7

如果您碰巧使用OS X,Gitx也是一款出色的可视化工具.

  • gitk(适合所有​​人)非常相似.不完全相同,但非常相似. (3认同)

Dav*_*vid 7

另一个git log命令.这个有固定宽度的列:

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


Nic*_*ola 7

我发现令人难以置信的是,在许多答案中没有提到Gitviz,可用于 Window/Linux/Mac
除了提供分支和提交的 2-D 视图之外,它还会监听您的 git 命令并自行修改图表。

在此输入图像描述


Fre*_*ing 6

老帖子,但退房SmartGit.它非常提醒Tortoise HG分支可视化,它可以免费用于非商业用途.


Evg*_*423 5

我想分享我的命令compact预设git log:(
绿色是我的默认控制台颜色)
预设预览

它被设计得尽可能紧凑和像表格一样(不添加任何多余的空间),同时仍然提供丰富的信息且易于阅读。medium这基本上是Git 默认使用的格式的紧凑版本。

特征:

  • 固定物品位置;
  • 提交哈希和引用名称的默认颜色;
  • 提交作者日期为本地时区;
  • 提交消息包含 128 个字符并缩进;
  • 还会显示扩展提交消息(如果有),并删除任何尾随换行符。

您可以使用以下命令将其添加到您的配置文件中:(请注意,它们将更改所有
格式的日期格式!) git log

$ git config --global log.date 'format-local:%d %b %Y %H:%M'
$ git config --global pretty.compact '%C(auto)%h %C(cyan)%<(17,trunc)%an%C(auto) %D%n        %C(cyan)%ad%C(auto) %w(128,0,26)%s%w(0,0,26)%+b%-(trailers:key=FAKE)'
Run Code Online (Sandbox Code Playgroud)

...然后像这样使用它(使用--graph--all任何其他选项):

$ git log --graph --pretty=compact
Run Code Online (Sandbox Code Playgroud)

如果您还想将其设置为默认值,可以使用以下命令来执行此操作:

$ git config --global format.pretty compact
Run Code Online (Sandbox Code Playgroud)

或者如果您喜欢别名:

$ git log --graph --pretty=compact
Run Code Online (Sandbox Code Playgroud)

如果您想进行任何更改,请参阅参考资料的“漂亮格式”部分git log


ard*_*new 5

具有日期时间格式的 Git 内置工具(无附加组件)

\n

由于文档在使用内置格式方面有点迟钝,因此这里还有两个开箱即用的示例别名。

\n

git tree\xe2\x80\x93 所有提交的时间戳日志

\n
# Tools for analyzing the merge history of a repo using tree-like graphics\n[alias]\n    tree = log --no-show-signature --graph --date=format-local:%H:%M:%S --all \\\n        --pretty="\'%C(#ffe97b ul)%h%C(reset) %C(#568ea6)%cs %C(#305f72)%cd%C(reset)%C(auto)%d%C(reset) %s %C(yellow)(%C(reset)%C(#1abc9c)%an%C(reset)%C(yellow),%C(reset) %C(#007055)%cr%C(reset)%C(yellow))%C(reset)\'"\n
Run Code Online (Sandbox Code Playgroud)\n

git树

\n

git tree.branches\xe2\x80\x93 所有分支/标签提交的时间戳日志

\n
# Some refinements to normal \'git tree\' output for alternative perspectives.\n[alias "tree"]\n    branches = tree --simplify-by-decoration\n
Run Code Online (Sandbox Code Playgroud)\n

git 树. 分支

\n

色标

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n
规格颜色风格
提交ID黄色的强调
提交日期深蓝
提交时间浅蓝色
提交消息白色的
提交作者绿色的
提交相对日期深绿色
远程分支机构红色的
当地分支机构紫色的
标签粉色的强调
\n