漂亮的git分支图


1385

我看过一些书籍和文章中有一些非常漂亮的git分支和提交图。如何制作git历史记录的高质量可打印图像?


4
我已经创建了一个python脚本来创建graphiz图!看一看。github.com/chode/git-graph
Stephan Bechter 2014年

4
如果您想要高质量和可打印的产品,我的工具(bit-booster.com/graph.html)会将“ git log”转换为SVG。有关更多信息,请参阅我的答案
G.西尔维·戴维斯

2
您是在寻找一种可视化自己的git历史记录的工具-还是一种可以绘制漂亮的“ Git分支”的图表工具?
Uri Abramson


5
我将删除标记有向无环图,因为它与该问题无关
Maksim Dmitriev

Answers:


1843

更新:这个答案已经引起了远远超出应有的关注。最初发布是因为我认为这些图形看起来不错,可以在Illustrator中绘制它们以进行发布-并且没有更好的解决方案。但是,现在对此问题存在更多适用的答案,例如fraczJubobsHarry Lee的答案!请去投票那些!!

更新2:对于git问题中的Visualization分支拓扑,我已经发布了此答案的改进版本,因为它在那里更合适。该版本包括 lg3,同时显示作者和提交者信息,因此您确实应该检查一下。出于历史原因(&rep,我会承认)离开此答案,尽管我真的很想删除它。

我的2¢:我通常在~/.gitconfig文件中使用两个别名:

[alias]
lg1 = 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(bold yellow)%d%C(reset)' --all
lg2 = 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 yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

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

git lg2看起来像这样:
git lg2


35
是的。正常和明亮/大胆的颜色为:黑色#202020/ #555555,红色:#5d1a14/ #da4939,绿色:#424e24/ #a5c261,黄色:#6f5028/ #ffc66d,蓝色:#263e4e/ #6d9cbe,洋红色:#3e1f50/ #a256c7,青色:#234e3f/ #62c1a1和白色:#979797/ #ffffff
斯利普·汤普森

3
@Turbo:对我来说,颜色在终端应用程序(Terminal.app)的配置文件设置中可以更改。您正在使用的终端应用程序可能支持也可能不支持更改给定ANSI颜色的显示颜色。同样,使用option-shift- [连字符-负号键]创建了破折号(准确的是破折号)。我想我错误地认为当前所有平台都对Unicode有所了解。
斯利普·汤普森

3
--date=relative和和--abbrev-commit是多余的,因为您分别明确使用%cr%h
graywh

6
我将%C(auto)修饰符添加到refnames(%d)中以获得更好的颜色。见stackoverflow.com/questions/5889878/color-in-git-log/...
约瑟夫EISL

2
好答案。我已经修改了命令,使其看起来更像是–oneline --decorate的输出,与lg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
Craig P. Motlin's

1196

这里的许多答案都很棒,但是对于那些只需要简单一行就可以直接回答而不必设置别名或其他任何东西的人,这里是:

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

并不是每个人都会一直在做git log,但是当您需要时,请记住:

”= GIT中的日志- 一个 LL - d ecorate - ö neline - 拉夫

enter image description here


252
git config --global alias.adog "log --all --decorate --oneline --graph"
fracz

4
我一直在寻找,已经--all哭了很长时间(T_T),谢谢!
费利佩·杰拉德

2
--oneline在Git 1.6.3中引入: github.com/git/git/blob/…--pretty = oneline将在1.6.3之前的版本中使用Git版本
Pat Myron

13
最佳答案。感谢您放心。
Tobias Feil

4
我认为默认情况下现在包括“ --decorate”。但是我还是会记住这种首字母缩写词!
JosiahYoder无效,..

378

对于文本输出,您可以尝试:

git log --graph --abbrev-commit --decorate --date=relative --all

要么:

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

或者:这是 用于绘制DAG图的graphviz别名。

我个人使用gitxgitk --allgitnub


14
我会补充说--abbrev-commit --decorate,那就完美了!
不对称

6
--oneline暗示--abbrev-commit,不是吗?
dwineman

4
@dwineman是的,--abbrev-commit如果使用则不需要--oneline
托马斯(Thomas)

2
似乎在第二行中,git log --graph --oneline --decorate --date=relative --all--date参数没有用。我看不到日志中显示任何日期。
Lerner Zhang

指定
--oneline

253

Gitgraph.js允许在没有存储库的情况下绘制漂亮的git分支。只需编写用于配置分支,提交并在浏览器中呈现的Javascript代码。

var gitGraph = new GitGraph({
   template: "blackarrow",
   mode: "compact",
   orientation: "horizontal",
   reverseArrow: true
});

var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);

用Gitgraph.js生成的样本图

或使用metro模板:

GitGraph.js Metro主题

或带有提交消息,作者和标签:

带有提交消息的GitGraph

JSFiddle测试它。

使用@bsara 使用Git Grapher生成它。


3
是的,那真是太神奇了!将其发布到小提琴jsfiddle.net/guan1oz1中,以便您可以立即对其进行测试。
berkus 2014年

14
但是,箭头应指向父母,而不是孩子。
jub0bs 2015年

4
@ Jubobs:好点。对于尝试理解Git的人来说,这是一个共同的障碍:他们考虑时间顺序而不是继承。明确指出(几乎)git中的所有内容都与先前的内容有关,这有助于将所有其他内容放到位。
Slipp D. Thompson

6
关于箭头方向,来自文档:* @param {Boolean} [options.reverseArrow = false]-如果箭头为真,则使箭头指向祖先
Scott

2
仅供参考,在看完这篇文章并使用gitgraph.js之后,我决定创建一个小工具,该工具基本上将用户界面放入gitgraph.js。还没有完成,UI还不是我想要的位置,但是欢迎您提供帮助!看一下:github.com/bsara/git-grapher
bsara

123

建立在TikZ和PGF之上,gitdags是一个小乳胶包,让您毫不费力地产生矢量图形提交图表,等等。

自动生成现有存储库的提交图不是目的gitdags;它产生的图形仅用于教育目的

我经常用它来生成我的Git问题答案的图形,以替代ASCII提交图形:

这是这样一个图表的示例,演示了简单的变基的效果:

在此处输入图片说明

\documentclass{article}

\usepackage{subcaption}
\usepackage{gitdags}

\begin{document}

\begin{figure}
  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      % Commit DAG
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C,
          D -- E,
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}     % node name and text 
        {above=of E} % node placement
        {E}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{Before\ldots}
  \end{subfigure}

  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C -- D' -- E',
          {[nodes=unreachable] D -- E },
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}      % node name and text 
        {above=of E'} % node placement
        {E'}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{\ldots{} and after \texttt{git rebase origin/master}}
  \end{subfigure}
  \caption{Demonstrating a typical \texttt{rebase}}
\end{figure}

\end{document}

1
@那看起来很棒!我还想谈谈如何使用它:考虑一个根本没有安装LaTeX的Windows用户。如何从头开始绘制图形?
VonC

1
@VonC我不确定,但是如果您不想安装LaTeX,则可以在ShareLatexWriteLaTeX之类的工具上生成图形。当我有更多时间时,我将进行研究并扩展Wiki ...随时推广该软件包:)
jub0bs 2014年

这是好东西!我会在某个时候写一个教程,但是现在,我只想提一提,您可以使用独立的documentclass(我使用crop功能)对图形进行后处理latex input.tex,生成dvi,然后最终使用dvisvgm input.dvi生成具有透明度的SVG。使用可以很容易地将SVG转换为PNG等栅格格式convert -antialias -density 300 -background none input.svg output.png。顺便说一句,这些图像在完全透明的情况下看起来很棒。仍在处理字体问题... i.imgur.com/1Xu2Ry5.png
vmrob

5
我花了一些时间才能完成此工作,所以我写了一个逐步指南,介绍如何在Ubuntu 14.04上从头开始运行
gitdags

1
@AndreaPolci有关合并的示例,请参见github.com/Jubobs/gitdags/issues/3。的文档gitdags即将发布!
jub0bs 2015年

79

Gitg是GNOME的Gitk和GitX的克隆(它也适用于KDE等),它显示出漂亮的彩色图形。

它是积极开发的(截至2012年)。它使您可以按时间顺序或拓扑对提交(图形节点)进行排序,并隐藏不导致选定分支的提交。

它适用于大型存储库和复杂的依赖关系图。

屏幕截图示例,显示了linux-git和linux-2.6存储库:

Linux的git

linux-2.6


60

SourceTree是一个非常好的产品。它的确打印出了美观,中等大小的历史记录和分支图:(以下是在一个实验性的Git项目上完成的,只是为了看到一些分支)。支持Windows 7+和Mac OS X 10.6+。

在此处输入图片说明

http://www.sourcetreeapp.com/


它也可以在App Store中获得,因此更新应该会自动进行。
WebOrCode

我喜欢sourcetree的图形,但是我更喜欢使用命令行,并且sourcetree的默认值总是与我的存储库混在一起。
SgtPooki 2014年

SourceTree会坚持要求您创建Atlassian帐户(或使用您的Google帐户并向Atlassian授予一些权限以获取您的电子邮件和个人资料信息),并且在Mac上安装(OS X El Capitan v 10.11.5)后,它在“克隆”步骤中失败: “致命:在.gitmodules中找不到路径'<跳过路径>'的子模块映射”,还有一个奇怪的警告:“未找到模板/ usr / local / git / share / git-core / templates”。非常模糊的消息,不是很好。
德米特里Shevkoplyas

3
然后卸载后,别忘了整理您先前授予的Google安全特权:myaccount.google.com/security- >已连接的应用程序和网站->已连接到您帐户的应用程序
Dmitry Shevkoplyas


56

git-forest是我使用了一年多的出色的perl脚本,几乎git log不再直接使用该命令了。

这些是我喜欢此脚本的一些东西:

  • 它使用unicode字符在图形中绘制线条,从而使图形线条更加连续。
  • 您可以将--reverse图形输出与常规git log命令结合使用。
  • 它在git log内部使用来获取提交列表,因此您传递给的所有选项git log也可以传递到此脚本。

我有一个别名使用git-forest如下:

[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"

这是终端上的输出结果:

在此处输入图片说明


3
@ void.pointer-是的,不会,因为git-forest是一个perl脚本,并且具有perl模块依赖性。如果确实要在Windows上运行,则在cygwin下运行git并安装所需的perl模块可能是最好的选择:)
Tuxdude 2015年

1
哇,该仓库有很多很棒的工具。谢谢!
Eldelshell

1
在Win $下完美运行@MinGW(MSYS);安装CPANM;然后是Git.pm; 创建一个别名,您就可以开始了。
Sektor

您使用的那个非常好的终端模拟器是什么?我喜欢图形提示指示器的东西。
NH。

如何安装此“脚本”?我在ubuntu上。
user13107

50

我编写了一个Web工具,用于将git日志转换为漂亮的SVG图: Bit-Booster-脱机提交图绘制工具

git log --pretty='%h|%p|%d'直接将输出上传到工具中,然后单击“下载graph.svg”链接。

该工具是纯客户端,因此您的Git数据都不会与我的服务器共享。您还可以在本地保存HTML + JS,然后使用“ file:///” URL来运行它。在Ubuntu 12.04上的Chrome 48和Firefox 43上进行了验证。

它生成的HTML可以直接发布到任何页面(包括blogspot博客引擎!)。在这里看一些博客文章:

http://bit-booster.blogspot.ca/

这是该工具生成的示例HTML文件的屏幕截图:

http://bit-booster.com/graph.html(该工具)


1
@Jay它出现在彩色反映该特定分支的缩进层次,而分支可以移动到另一个柱,并因此改变color.s
托尔比约恩Ravn的安德森

44

基于我在一个相关问题的答案中找到的Graphviz脚本,我破解了一个ruby脚本,该脚本创建了git存储库的摘要视图。它消除了所有线性历史记录,仅显示“有趣的”提交,即具有多个父项,多个子项或由分支或标签指向的提交。这是它为jquery生成的图的一个片段:

jQuery样本

git-big-pictureBranchMaster是类似的工具,它们仅通过显示标记,分支,合并等的相关性来尝试仅显示图的高级结构。

这个问题还有更多选择。


2
我尝试了这一点,但是无法使点与我们的repo输出(42个分支,175个标签,42.000个提交)一起正常工作。
Xavier Nodet 2013年

1
@XavierNodet,如果您的仓库是公开的和/或您收到错误消息等,请在GitHub上提交问题。谢谢!
Matt McHenry

38

我已经添加了三个自定义命令:git treegit streegit vtree。我将按顺序进行检查。

[alias]
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'

在此处输入图片说明

git streegit vtree我使用bash来帮助格式化。

[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    stree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\";          \
        done < <(git logx && echo);"'

git_stree


[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    vtree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\";  \
        done < <(git logx && echo);"'

git_vtree


编辑:这适用于git版本1.9a。颜色值“ auto”显然在此版本中首次亮相。这是一个很好的补充,因为分支名称将获得不同的颜色。例如,这使得更容易区分本地和远程分支。


fatal: bad color value 'auto' for variable '--pretty format':(
2014年

原来是git的旧版本。Yum在其仓库中有一个非常过时的Git版本。从源代码(1.9)编译,效果很好。也很漂亮!谢谢@gospes!
2014年

在OS X上无法运行:sed: illegal option -- r
Slipp D. Thompson

@ SlippD.Thompson:我正在使用linux :)。-r用于扩展正则表达式。显然sed的OSX版本没有它。也许您可以更新sed。否则,您可以重写sed命令而无需扩展正则表达式。
gospes

1
对于Mac OS X sed,请使用-E而不是-r
Baxter Lopez

37

取决于他们的模样。我使用gitx制作像这样的图片:

简单情节

您可以git log --graph在24路章鱼合并中比较gitk和gitk(最初来自http://clojure-log.n01se.net/date/2008-12-24.html):

24路git章鱼合并。 原始网址为<code> http://lwn.net/images/ns/kernel/gitk-octopus.png </ code>


49
好笑...我发誓我听说你说“ 24路章鱼合并”!
dty 2012年

4
出于好奇,有人试图将GitX(或其他GUI git工具)的绘制例程提取到独立的可执行文件中吗?如果我没记错的话,让可可绘制成矢量PDF文件并不难,并且可以满足OP对高Q可打印图像的需求。
斯利普·汤普森

在他们重做之前,它是通过小故障在S3上进行的。我希望我仍然有它。:(
达斯汀

只需将其替换为lwn.net/images/ns/kernel/gitk-octopus.png中的gitk版本,链接至clojure-log.n01se.net/date/2008-12-24.html。@Dustin:希望没事。它不是同一张图片,但其用途相似。从屏幕快照来看,它看起来像是Linux内核的一部分,所以我想您可能会发现该提交并重新获取了等效的gitx屏幕截图...
naught101

34

有关更详细的文本输出,请尝试:

git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short

您可以在$ HOME / .gitconfig中编写别名

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short

29

这是我对此的看法:

屏幕截图:

屏幕截图

用法:

git hist -显示当前分支的历史

git hist --all -显示所有分支的图形(包括遥控器)

git hist master devel -显示两个或多个分支之间的关系

git hist --branches -显示所有当地分支机构

“添加” --topo-order以拓扑方式提交,而不是按日期提交(此别名中的默认值)

优点:

  • 看起来像普通的--decorate,所以不同的分支名称使用不同的颜色
  • 添加提交者电子邮件
  • 添加提交相对和绝对日期
  • 按日期排序提交

设定:

git config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"


28

尽管有时我使用gitg,但总是回到命令行:

[alias]
    #quick look at all repo
    loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
    #quick look at active branch (or refs pointed)
    loggs  = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
    #extend look at all repo
    logga  = log --color --date-order --graph --oneline --decorate --all
    #extend look at active branch
    logg   = log --color --date-order --graph --oneline --decorate
    #Look with date
    logda  = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
    logd   = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"        
    #Look with relative date
    logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
    logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"  

    loga   = log --graph --color --decorate --all

    # For repos without subject body commits (vim repo, git-svn clones)
    logt  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
    logta  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all        
    logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration 

如您所见,几乎是一个按键保存别名,基于:

  • --color:清晰的外观
  • --graph:可视化父母
  • --date-order:最易于理解的回购协议
  • -装饰:谁是谁
  • --oneline:很多次您需要了解一次提交
  • -通过装饰简化:初次查看的基本内容(只是标签,相关合并,分支)
  • --all:使用和不使用此选项,保存具有所有别名的击键
  • --date = relative(%ar):了解回购中的活动(有时分支在master附近很少提交,但几个月前来自他)

请参见最新版本的git(1.8.5及更高版本),您可以在装饰占位符%d中受益于%C(auto)

从这里,您需要的是对gitrevisions的充分了解以过滤所需的内容(例如master..develop,其中--simplify-merges可以帮助您建立长期分支机构)

命令行的功能是根据您的需要进行快速配置(了解存储库不是唯一的键日志配置,因此有时需要添加--numstat或--raw或--name-status。别名快速,强大并且可以(随时间变化)获得最漂亮的图形,甚至更多,默认情况下通过分页器显示输出(少说),您可以始终在结果内部快速搜索。像gitgraph这样的项目


非常好。将这些添加到我的配置中。但我建议将%Cred%d%Creset更改为%C(auto)%d%Creset,这将为远程或本地分支名称提供不同的颜色
MarkB42

17

略微调整了Slipp的出色答案,您可以使用他的别名仅记录一个分支:

[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"

通过放弃,--all您现在可以做

git lgBranch1 <branch name>

甚至

git lgBranch1 --all


14

我使用此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
git log --graph --oneline 只是为了确保oneliner不会迷路
tsenapathy

有没有办法将分支名称放在左侧?
海军



11
git -c core.pager='less -SRF' log --oneline --graph --decorate

这是我的最终版本,类似于此处的许多答案。我喜欢调整传递的标志less以防止自动换行。

示例输出

我将其设置为别名以快速访问,因为该命令有点麻烦。


8

尝试ditaa。它可以将任何ASCII图转换为图像。尽管在设计时并未考虑到Git分支,但结果给我留下了深刻的印象。

来源(txt文件):

        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+

命令:

java -jar ditaa0_9.jar ascii-graph.txt

结果:

在此处输入图片说明

它还支持背景色,虚线,不同形状等等。请参阅示例


1
以类似的方式,Casual-effects.com/markdeep十分强大,可以整理手工布置的ascii艺术图。
贝尼·切尔尼亚夫斯基-帕斯金,

7

如果您的存储库位于Gitlab上,则可以使用其图形表示形式,因为它在浏览器中以SVG形式呈现。

在此处输入图片说明


6

我不了解直接工具,但也许您可以修改脚本以将数据导出为点格式并使用graphviz进行渲染。


试试这个github.com/gugod/bin/blob/master/git-graphviz。我在公司环境中并没有所有的依赖项,因此将这些io命令更改为简单的perl`git log [...]命令对我来说很有用。
罗斯·罗杰斯

如果您使用的是Mac,并且想尝试使用此脚本,则可以使用Perl brew install perl dotcpan common::sense IO::all获取依赖项。然后,将输出通过管道传递到适当的命令,例如git-graphviz | dot -Tpng -o repo.png。但是,输出与git-big-picture没有太大不同。
jrhorn424

6

有一个时髦的Git提交图,作为Raphael Web图形库的演示之一。

该演示是静态的,但是应该很容易拿到代码并将其静态数据换成一组实时数据-我认为这只是JSON格式的Git提交数据。

该演示在这里:http : //dmitrybaranovskiy.github.io/raphael/github/impact.html


1
这与GitHub的影响图上使用的图代码相同,不是吗?(如github.com/DmitryBaranovskiy/raphael/graphs/impact
SLIPP D.汤普森

@Sven:谢谢你指出这一点。我已经为您更正了断开的链接,但是请记住,这个答案已有五年历史了,因此最近可能有更好的解决方案。
Spudley


6

一个漂亮,干净的表格形式的git图输出给shell

除了图树以外,通常还有哈希

除了图树以外,通常还有哈希

或在额外的栏中

或在额外的栏中

编辑:您想立即开始而不阅读说明吗?使用下面的EDIT 5部分中的git别名,脚本或功能代码段。

到目前为止,在这个问题的所有答案中,没有一个显示出像贝壳一样干净的表。最接近的答案是我从哪里开始的。

我的方法的核心点是仅计算显示给用户的树字符。然后使用空格将其填充到个人长度。

除了git,您还需要这些工具

  • grep
  • 打印
  • sed
  • 序列
  • TR
  • 厕所

大多数随Linux发行版一起提供。

该代码段是

while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

要计算所需的空格,我们使用

  sed -nl500 'l' <<< "$graph"

要获得所有字符(每行最多500个字符),而不是只选择树形字符:/ \ _和空格

  grep -Eo '\\\\|\||\/|\ |\*|_'

最后对它们进行计数,然后从我们选择的长度值中减去结果,该值在示例中为9。

为了产生计算出的空白量,我们使用

  seq -s' ' $whitespaces

然后用

  tr -d '[:digit:]'

而不是将它们添加到图形线的末尾。而已!

Git有不错的选择,可以使用语法来格式化输出说明符的长度'%><(amount_of_characters,truncate_option)'从左侧的'>'或右侧的'<'端添加空格,并且可以从'ltrunc',中间'mtrunc'或末尾截断字符'trunc'。

上面的printf cmd对于相应的git列使用相同的长度值,这一点很重要

有趣的是,您可以根据自己的需求来设计自己的干净桌子,就像看起来的输出。

额外:

要获取正确的长度值,可以使用以下代码段

while read -r graph;do
    chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
    [[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')

并使用$ max_chars作为上面的正确长度值。


编辑1:刚注意到git树中也使用了下划线字符,并相应地编辑了上面的代码段。如果缺少其他字符,请发表评论。


编辑2:如果要摆脱分支和标记条目周围的括号,只需在git命令中使用“%D”而不是“%d”,就像在EDIT 3中一样。


编辑3:也许“自动”颜色选项是您最喜欢的分支和标记条目选项?

git无括号自动彩色头和标签表式外壳输出

更改git命令的这一部分(颜色214

%C(214)%>(15,trunc)%D%C(reset)

汽车

%C(auto)%>(15,trunc)%D%C(reset)


编辑4:还是您喜欢该部分自己的颜色混合,一个带有眨眼头的精美输出?

git tree花式样式的表式输出

为了能够首先设置标题,分支名称和标签的样式,我们需要像EDIT 3一样在git命令中使用“自动”颜色选项。

然后我们可以通过添加这三行来用我们自己的颜色替换已知的颜色值

 # branch name styling
 branch=${branch//1;32m/38;5;214m}
 # head styling
 branch=${branch//1;36m/3;5;1;38;5;196m}
 # tag styling
 branch=${branch//1;33m/1;38;5;222m}

在行前

 branch_all="$branch_all$(printf '%15s' "$branch")\n"

在我们的代码段中。替换值产生上面的颜色。

例如head的替换值是

3;5;1;38;5;196

其中3; 斜体字代表5;表示闪烁,颜色表示为1; 38; 5; 196。有关更多信息,请从此处开始。注意:此行为取决于您喜欢的终端,因此可能无法使用。

但是您可以选择任何喜欢的颜色值。

git颜色值和ANSI等效项的概述

在此处输入图片说明

您可以在此处找到带有git color / style选项的列表。

如果您需要控制台上的输出以获取准确的颜色(上图是通过stackoverflow缩小的),则可以使用以下命令生成输出

for ((i=0;i<=255;i++));do
  while IFS='+' read -r tree hash;do 
    echo -e "$(printf '%-10s' "(bold $i)") $hash  $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
  done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done

在您的git项目路径中,该路径使用git日志输出中的第一个提交。


编辑5:正如成员“ Andras Deak”所述,有一些方法可以使用此代码:

1)作为别名

别名不接受参数,但函数可以接受,因此只需在.bashrc中定义

   function git_tably () {
     unset branch_all graph_all hash_all message_all time_all max_chars

     ### add here the same code as under "2) as a shell-script" ###

   }

并直接在您的git项目路径下或从您希望使用git项目路径作为第一个参数的任何位置调用函数git_tably(源自tablelike)。

2)作为shell脚本

我将其与将git项目目录作为第一个参数传递给它的选项一起使用,或者如果为空,则像正常行为一样采用工作目录。整体而言,我们拥有

# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"

# determine the max character length of your git tree
while IFS=+ read -r graph;do
  chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
  [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')

# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch=${branch//1;32m/${branch_style:-1;32}m}
  branch=${branch//1;36m/${head_style:-1;36}m}
  branch=${branch//1;33m/${tag_style:-1;33}m}
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"

done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

3)作为git别名

也许最舒适的方法是在.gitconfig中添加git别名

[color "decorate"]
    HEAD = bold blink italic 196
    branch = 214
    tag = bold 222

[alias]
    count-log = log --all --graph --pretty=format:' '
    tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
    tably     = !bash -c '"                                                                                                    \
                  while IFS=+ read -r graph;do                                                                                 \
                    chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
                    [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count;                                          \
                  done < <(git count-log && echo);                                                                             \
                  while IFS=+ read -r graph hash time branch message;do                                                        \
                    chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$(($max_chars-$chars));                                                                        \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                               \
                    graph_all=\"$graph_all$graph$whitespaces\n\";                                                              \
                    hash_all=\"$hash_all$(printf \"%7s\" \"$hash\")  \n\";                                                     \
                    time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\";                                                     \
                    branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\";                                                \
                    message_all=\"$message_all$message\n\";                                                                    \
                  done < <(git tably-log && echo);                                                                             \
                  paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\")                  \
                                <(echo -e \"$hash_all\") <(echo -e \"$message_all\");                                          \
                '"

比只是git tably在任何项目路径下调用。

Git是如此强大,你可以改变头,标签,...直接如上图所示,并从这里拍摄

另一个不错的选择是选择最喜欢的树木颜色

[log]
    graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan

给您疯狂的外观,但始终像表格一样git log输出

fanciest_git_tree_tablelike_image

眨眼太多!只是为了证明可能。指定的颜色太少会导致颜色重复。

只需单击一下,即可获得完整的.gitconfig参考。

再次:乐于根据自己的需要来设计自己的干净桌子,就像看起来的输出一样。


您应该在答案中说明这些bash代码段将如何转变为类似于git log的命令。一个人可以找出用途,可以查看您链接的答案,但是答案应该是独立的
Andras Deak

您的意思是我应该详细解释git log cmd?还是请给我一个例子,说明您丢失了什么。
onemorequest

注意:此代码段使用了真棒git log命令的输出来接收终端上的表式输出。因此,正如您提到的那样,
相反

我认为您每次需要此输入时都不会输入20行bash。将其定义为bash函数或git别名是有意义的。大多数读者不会费心尝试完成您的代码以使其易于使用。我正是这个意思。如果只是将代码放在路径中的随机sh文件中,则可以忽略我。
Andras Deak

1
我知道了。感谢您的意见。我将编辑答案并添加这样的别名。通常,我将文件用于您提到的“长”命令。但是,我同意,将两种方式都写在这里要舒服得多。
onemorequest

5

〜/ .oh-my-zsh / plugins / git / git.plugin.zsh中的一些别名

gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'

4

对于OSX用户,我采用了@gospes示例,并对其进行了稍作修改以用于gsed(gnu-sed通过自制程序安装)并调整了颜色(以在黑色背景下工作,不知道原始示例如何能够呈现其在示例,因为它在背景为黑色的终端上指定了黑色文本)。

[alias]
    # tree, vtree, stree support
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(bold black)[%cr]%C(reset)  %x09%C(bold black)%an: %s %C(reset)'
    stree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
        timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
        timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
        printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
    done < <(git logx && echo);"' | less -r
    vtree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
      timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
      timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
      printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
    done < <(git logx && echo);"' | less -r

OSX的关键是首先安装Gnu sed(具有-r选项)。使用自制程序最容易完成,它不会覆盖系统安装的sed,而是将gnu sed安装为“ gsed”。希望这对上面评论了OSX无法正常工作的@ SlippD.Thompson有所帮助。

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.