在Git中可视化分支拓扑


882

我在自己的机器上孤立地与Git一起玩,我发现很难维护我所有分支和提交的思维模型。我知道我可以从自己的位置git log查看提交历史,但是有没有办法查看整个分支的拓扑结构,例如这些ASCII映射,似乎在各处都用来解释分支?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'

感觉就像有人进来并尝试拿起我的存储库将很难弄清楚到底发生了什么。

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



1
@ leif81,对我来说是重复的一半。@Masi在他的问题中明确排除了gitk。
Benjol 2011年

Answers:


1080

使用git log --graphgitk。(两者也都接受--all,这将显示所有分支,而不仅仅是当前分支。)

有关分支名称和紧凑视图,请尝试:

git log --graph --decorate --oneline

46
这甚至没有用分支标记提交。我不会称其为良好的可视化效果。
罗曼·斯塔科夫

7
谢谢!gitg也有--all选项,并标记提交。我也从未在下拉菜单中看到您可以在其中选择所有分支。
Thomas

210
我建议git log --graph --decorate --oneline-每行显示一次提交,并用分支名称装饰。
sleske 2013年

8
tig(ncurse git客户端)也提供了该--all选项。很方便!
Pierre-Adrien Buisson 2014年

5
另请参阅Andrew关于--simplify-by-decoration选项的答案
ruvim '16

482

我通常使用

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

使用颜色(如果您的外壳是Bash):

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

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

* 040cc7c       (HEAD, master) Manual 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 successfully
| *   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,但是它将提交消息与数字绑定在一起,恕我直言看起来不太漂亮)。

要为此命令创建快捷方式,您可能需要编辑~/.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 the Vociferous在注释中指出的那样,很难记住这么长的格式化命令。通常,这不是问题,因为您可以将其放入~/.gitconfig文件中。但是,如果有时您必须登录到无法修改配置文件的远程计算机,则可以使用更简单但输入速度更快的版本:

git log --graph --oneline

10
如果您喜欢日期:git log --graph --full-history --all --color --date = short --pretty = format:“%x1b [31m%h%x09%x1b [32m%d%x1b [ 0m%x20%ad%s”
sehugg 2010年

7
--oneline是所有令人难以忘怀的格式化魔术的更令人难忘的替代品。
Daniel Ralston

1
@SodeltheVociferous,的确,我没有从您所谈论的方面来解决问题。我扩大了答案。
P

2
注意:--full-history仅在使用--simplify-by-decoration或指定文件路径时才相关。
Slipp D. Thompson

2
我可能会问你从哪里得到格式字符串的?或者,您到底是如何炮制那件事的?
elliotwesoff 2016年

442

我通常将3个别名(和4个别名别名用于快速使用)放入~/.gitconfig文件中:

[alias]
    lg = lg1
    lg1 = lg1-specific --all
    lg2 = lg2-specific --all
    lg3 = 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

应该注意的是,这并不是一个万事俱备的解决方案,而是一个模板,您可以根据自己的喜好进行更改,添加和修正。如果要使用这些,我的建议是:

  1. 将它们添加到您的中.gitconfig
  2. 根据您的喜好进行自定义(不同的颜色选择,2线和3线版本的线排列不同等),
  3. 然后将副本保存到Gist或其他代码段工具中,以便.gitconfig将来可以将其复制并粘贴到s中(当然也可以通过版本控制您的dotfiles)

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


10
建议:替换%C(bold yellow)%C(auto)具有不同颜色的HEAD本地远程分支机构REF)。
Atcold

2
请注意,可以避免使用%w();在格式字符串中手动添加缩进;这样,您还可以正确地换行较长或多行的提交消息,而不会弄乱图表。
charliegreen

1
@ mbadawi23为了在平台和Git安装之间保持一致,它们是多余的。 --abbrev-commit之所以在这里是因为第二到第三行都用空格手动缩进,我想绝对确保它会使用短的SHA-比后悔更安全。 --decorate之所以也存在,是因为尽管Git的默认设置执行相同的操作,但是可以在不同的Git版本中进行不同的配置或不同的配置-为此,我绝对想要装饰。最终,多余/多余的标志在这里还不错–它放在文件中;您不必一直输入。
Slipp D. Thompson

1
@TimothyPulliam在代表每个分支/标签提示的每一行的末尾,您会在括号中看到相关的分支/标签名称-例如,在lg1lg2屏幕截图中,您可以看到(origin/test_on_10.8)显示了远程分支,在lg2屏幕快照中,您可以请参阅同时(HEAD -> master, origin/master, origin/HEAD)显示master分支机构的本地和远程位置HEAD。这与常用的Git分支可视化GUI工具(gitk,SourceTree,TortoiseGit,Tower,Fork,GitX)相匹配,尽管有些冗长(某些GUI工具使用颜色编码)
Slipp D. Thompson

2
@TimothyPulliam要理解什么提交是“每个分支的一部分”,您必须在视觉上跟踪彩色线。几乎每个工具都不能为您提供任何帮助,因为Git提交本质上不属于任何分支-隐含地(在图形可视化时)属于在其父系中具有它们的任何分支或标签。如果没有分支/标记引用提交并且它消失了(但是大约两周没有被垃圾收集);添加引用先前未引用的提交的分支/标记,它会重新出现。我希望这一切都有意义。
Slipp D. Thompson

235

对于任何这些配方(基于git log或gitk),您可以添加--simplify-by-decoration以折叠历史记录中不感兴趣的线性部分。这使得一次可以看到更多的拓扑。现在,我可以理解如果没有此选项将无法理解的大历史!

我觉得有必要发布此消息,因为它似乎并不像它应该的那样众所周知。在有关可视化历史记录的大多数Stack Overflow问题中都没有出现它,即使我知道自己想要它,也花了我很多时间去寻找!我终于在这份Debian错误报告中找到了它。关于堆栈溢出的第一个提及似乎是Antoine Pelisse的答案


3
完美-正是我想要的!它应该获得更多投票;几乎每个人都已经了解gitk / gitg / git log --graph了,但是如果您想可视化分支拓扑并且不关心单个提交,那么这些功能就根本没有用。
imolit 2014年

4
这正是我所需要的,太棒了。在所有答案中,这是唯一对我有所帮助的东西。--simplify-by-decoration清楚说明发生了什么。
Ela782 2015年

9
这确实是答案。git log --graph --all --simplify-by-decoration也可以。
Irfy

如果我们能使用--simplify-by-decoration而添加正提交前/后各deocrated提交(像-B-Agrep)。
六月

76

Gitk 有时候让我痛苦。

在此处输入图片说明

激励我编写GitVersionTree

在此处输入图片说明


3
@exhuma我与作者有公关来支持Mono(在Ubuntu 13.10上针对Mono 2.10进行了测试)
Max Ehrlich 2014年

1
我发现GitVersionTree随时间推移将分支保持在同一位置,这使查看事情如何变化变得更加容易。
sfranky

48

我的时间中99.999%的时间是,git lg而0.001%的时间是git log

我只想共享两个可能有用的日志别名(从.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
  • git lg 将看到当前的分支历史。
  • git hist 将看到整个分支历史。

44

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

拓扑结构

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


6
此线程如何具有GitKraken,但没有较旧的免费SourceTree?(我知道,Atlassian并非总能正确解决所有问题。但是SourceTree是一个非常不错的可视化工具。)
XML

43

我喜欢git log用来做:

 git log --graph --oneline --branches

(还带有--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

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

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次提交)


对于当前选择的解决方案,我不满意的是:

 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个提交通常就足够了。


我也选择了这种方法,但是我做了一个别名,以便键入“ git graph”与执行“ git log --graph --decorate --oneline”相同。
Will Pike

@ConnerPike好主意。我自己的别名为“ lg”:请参见stackoverflow.com/a/3667139/6309
VonC 2014年

35

Gitg是适用于Linux的出色工具,类似于OS X的Gitx。只需在存储库树状结构内部的某处(与gitx相同)在命令行上运行“ gitg”。


3
这么多话:gitg有一个下拉菜单,您可以在其中选择要可视化的分支。此下拉菜单还具有“全部”选项。
Phluks

1
或者gitg --all,如果您想避免在下拉菜单中乱七八糟,则可以从开始。
imolit 2014年

25

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

它使用点/图形来创建漂亮的2D图形,而不是gitk和朋友产生的线性,“一维”视图。使用-i选项,它可以显示分支点和合并提交,但不包括它们之间的所有内容。


使用起来非常简单,如果您没有很多提交并且想要一个简单的解决方案,则可以尝试一下。
wiswit

它应该随提交次数的增长而定(如果您使用-i),如果您具有复杂的分支和合并,它可能会变得不可读(但是,哪种工具没有)
Frank Osterfeld 2015年

1
在我们的中等规模项目中,这会产生大量的线条。我可以限制深度吗?即从最近N天左右提交。
OndraŽižka18年


21

看看BranchMaster

我通过将它们之间的所有提交折叠到一行来可视化复杂的分支结构。数字表示提交次数。

在此处输入图片说明


1
这就是我要的东西。是否有其他命令/工具可以做到这一点?
Aalex Gabi

3
@AalexGabi将其放入您的gitconfig中,它执行相同的操作,但是在命令行中gbranch = log --graph --simplify-by-decoration --pretty = format:'%C(yellow)%h%C(white)% d%C(粗体黑色)%ar%C(重置)%n'
all

您如何获取数据以可视化分支?
雪鱼

15

没有人提到tig吗?它不折叠“ BranchMaster”之类的分支,但是...

它运行很快,在终端上运行。

因为它是如此之快(+键盘控制),所以您可以获得出色的UX,ls对于包含git存储库的目录,这几乎就像我的“ ”。

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

它具有常用的快捷键,/搜索等。

修订图

(请注意,这是此屏幕快照后台的终端,如今看起来更好,但是我的计算机拒绝拍摄屏幕快照,对不起)

(pps。我也使用gitkraken,并且视觉效果非常清晰,但是比tig)重


我是终端爱好者,Tig(Git的文本模式界面)是与Git存储库进行交互的好工具,它非常有用,包括图形视图和Git历史记录。我向终端爱好者推荐它,作为Git命令行的额外工具。
hermeslm

15

Tortoise Git有一个称为“修订图”的工具。如果您使用的是Windows,则只需在存储库上单击鼠标右键-> Tortoise Git->修订图,就很容易。


1
长时间使用tortoise git真是一个了不起的功能,但不知道此功能。
kreamik

这更简单。谢谢。
Anoop


12

我使用以下别名。

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

与我在上面看到的别名相比,它在配色方案中具有更多信息。它似乎也很普遍,因此您可能有机会将其存在于其他人的环境中,或者可以在对话中提及它而无需解释。

在此处提供屏幕截图和完整说明:http : //blog.kfish.org/2010/04/git-lola.html


12

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

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

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

GitUp屏幕截图


这是唯一在x轴上看到分支并且在y轴上看到时间的图形。非常直观。GitUp绝对很棒!macOS不再存在,因此我切换到Windows,将非常怀念Gitup。
w00t

11

我使用此git log别名~/.gitconfig来查看图形历史记录:

[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.graphColors配置选项来自。

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


1
这是我第一次看到创作作者的约会,这真是太好了!谢谢,我将其添加到我的gitconfig中!
Simon C.

Windows用户应将单引号替换为双引号
PierDipi '18

11

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

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

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

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

和简单的使用 gl

您也可以将别名添加到git config中。打开~/.gitconfig并将以下行添加到[alias]

[alias]
        lg = log --oneline --abbrev-commit --all --graph --decorate --color

并像这样使用它: git lg


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"

6
稍微解释一下命令将是什么样子就很好了。
最大


7

如果您恰巧在OS X上,Gitx也是一种出色的可视化工具。


3
gitk(对于所有人)非常相似。不完全相同,但非常相似。
xero

有几个Gitx的分支- 这个(rowanj)目前看来是最好的。
rjmunro

7

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

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



2

我已经尝试过,--simplify-by-decoration但是没有显示所有合并。因此,我只是修剪标题中没有“ \”和“ /”符号的行,而始终保持带有“(”的行表示紧随其后的分支。当显示分支历史记录时,我通常对提交注释不感兴趣,因此我也删除了它们,最后得到了以下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/).*/)/'
}

2

我们可以使其更复杂吗?

如何简单的git log --all --decorate --oneline --graph(记住一条狗= --All --Decorate --Oneline --Graph)


1
这与接受的答案相同。但是助记符的道具
aljgom,

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.