在Git中可视化分支拓扑

我在自己的机器上单独使用Git,我发现很难维护我所有分支和提交的心理模型。我知道我可以从我所在的位置做一个git log来查看提交历史,但是有没有办法看到整个分支拓扑,就像这些似乎到处都在使用的ASCII映射来解释分支?

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

感觉就像有人走过来试图拿起我的存储库会很难弄清楚到底发生了什么。

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

692205 次浏览

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

对于分支名称和紧凑视图,请尝试:

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"

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

* 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"

然而,正如喧嚣的索德尔在注释中指出的那样,这样长的格式化命令很难记住。通常,这不是问题,因为您可以将其放入~/.gitconfig文件中。但是,如果您有时必须登录到无法修改配置文件的远程机器,您可以使用更简单但更快的输入版本:

git log --graph --oneline

我喜欢,与#0,做:

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

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

Gitg是一个很好的Linux工具,类似于OS X的Gitx。只需从存储库的树结构中的某个地方在命令行上运行“gitg”(与gitx相同)。

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

我觉得有必要发布这个,因为它似乎没有像它应该的那样广为人知。它没有出现在大多数关于可视化历史的Stack Overflow问题中,而且我花了相当多的时间才找到-即使在我知道我想要它之后!我终于在这个Debianbug报告中找到了它。Stack Overflow上第一次提到的似乎是Antoine Pelisse的这个答案

傻笑绘制了非常漂亮的图形。

我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=shorthist = 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将查看整个分支历史。

看看#0。它让我想起了龟汞分支可视化,它是免费的非商业用途。

我使用以下别名。

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

它的配色比我上面看到的别名有更多的信息。它似乎也很常见,所以你可能有机会在别人的环境中存在,或者在谈话中提到它而不必解释它。

带有屏幕截图和git lola中的完整描述。

我个人最喜欢的别名,通过.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"

您可以像这样直接从命令行进行测试:

git 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"

示例输出:

输入图片描述

我发现大图删除非常有用。

它使用点/Graphviz创建漂亮的2D图形,而不是gitk和朋友产生的相当线性的“一维”视图。使用-i选项,它显示分支点和合并提交,但省略了中间的所有内容。

Gitk的输出有时让我读起来很痛苦:

在此输入图片描述

于是我写了系统版本库

在此输入图片描述

一个很好的基于Web的工具是ungit。它可以在Node.js和Git支持的任何平台上运行。对于那些发现这种事情比阅读更容易的人来说,它是如何工作的…

在此输入图片描述

我找到了这篇博客文章,它显示了一种简洁的方式:

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

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

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

只需使用gl

您还可以将别名添加到Git配置中。打开文件~/.gitconfig并将以下行添加到[别名]部分:

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

并像这样使用它:

git lg

示例输出:

在此处输入图片描述

TortoiseGit有一个名为“修订图”的工具。如果您在Windows上,只需右键单击您的存储库→TortoiseGit修订图表

看看支行

我编写它是为了可视化一个复杂的分支结构,将它们之间的所有提交折叠成一行。数字表示提交的数量。

在此输入图片描述

我试过--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/).*/)/'}

另一个git日志命令。这个带有定宽柱

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

示例输出:

输入图片描述

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

[alias]lg = lg1lg1 = lg1-specific --alllg2 = lg2-specific --alllg3 = 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(或者版本控制你的dotfile,当然)

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

在Windows上,您可以使用一个非常有用的工具:git扩展。它是一个GUI工具,使Git操作非常容易。

它也是开源的。

看看GitKraken——一个以清晰方式显示拓扑的跨平台GUI。

拓扑

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

注意:需要注册。

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

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

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

在此处输入图片描述

在Git2.12+中,您甚至可以使用#0配置选项自定义图形的线条颜色。

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

还有Tig。它不会像“BronchMaster”那样折叠分支,但是…

它是快速的,在终端运行。

因为它非常快(+键盘控制),您可以获得很好的用户体验。它几乎就像我对包含Git存储库的目录的“ls”。

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

修订图

(PS:是这张截图后台的终端,现在看起来好多了,但是我电脑拒绝截图,不好意思)

(PPS:我也使用GitKraken,它有非常清晰的可视化,但它比Tig重得多)

对于Mac用户,请查看免费的开源工具GitUp

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

该项目是在github

GitUp截图

Git的官方网站招募了一些第三方平台特定的GUI工具。打开Git GUI Tools forLinux平台

我已经为Linux平台使用了gitgGitKraken。两者都有助于理解提交树。

对于那些使用VSCode文本编辑器的人,考虑D. Jayamanne的Git历史扩展

输入图片描述

评分最高的答案是将git log命令显示为最喜欢的解决方案。

如果您需要桌面,例如类似列的输出,您可以使用您很棒的git log命令,只需稍作修改并对下面的. gitconfigalias.tably片段进行一些限制。

修改:

  • 你必须在每个提交占位符之前使用%><(<N>[,ltrunc|mtrunc|trunc])
  • 添加唯一分隔符作为列分隔符
  • 为彩色输出添加--color选项

局限性:

  • 只要不使用非空换行符%n...,您就可以将CPU图放置在每一列

  • 任何换行符的最后一个提交占位符都可以不用%><(<N>[,trunc])

  • 如果需要额外的字符来装饰,例如(committer: <>)

    ...%C(dim white)(committer: %cn% <%ce>)%C(reset)...

    要获得类似表的输出,它们必须直接写在提交占位符之前和之后

    ...%C(dim white)%<(25,trunc)(committer: %cn%<(25,trunc) <%ce>)%C(reset)...

  • 如果--format=format:选项不是最后一个,则用%C(reset)关闭它,因为大部分都完成了

  • 与正常的git log输出相比,这个很慢,但很好

示例取自本网站:

thompson1     = log --all --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)'

将使用^作为分隔符并且不添加字符

thompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'

相比之下

在此输入图片描述

在此输入图片描述

或者将图表移动到第5列:

在此输入图片描述

要实现这一点,请将以下内容添加到您的. gitconfig文件并使用git tably YourLogAlias

#请求参数
[color "decorate"]HEAD = bold blink italic 196branch = 214tag = bold 222
[alias]
# delimiter used as column seperatordelim = ^# example thompson1thompson1     = log --all --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)'# modified thompson1 examplethompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'# set a column for the graphthompson1-new-col = 1
tably     = !bash -c '"                                                                                                              \declare -A col_length;                                                                                                 \delim=$(git config alias.delim);                                                                                       \git_log_cmd=$(git config alias.$1);                                                                                    \git_tre_col=${2:-$(git config alias.$1-col)};                                                                          \\i=0;                                                                                                                   \n=0;                                                                                                                   \while IFS= read -r line; do                                                                                            \((n++));                                                                                                             \while read -d\"$delim\" -r col_info;do                                                                               \((i++));                                                                                                           \[[ -z \"$col_info\" ]] && col_length[\"$n:$i\"]=${col_length[\"${last[$i]:-1}:$i\"]} && ((i--)) && continue;       \[[ $i -gt ${i_max:-0} ]] && i_max=$i;                                                                              \col_length[\"$n:$i\"]=$(grep -Eo \"\\([0-9]*,[lm]*trunc\\)\" <<< \"$col_info\" | grep -Eo \"[0-9]*\" | head -n 1); \[[ -n \"${col_length[\"$n:$i\"]}\" ]] && last[$i]=$n;                                                              \chars_extra=$(grep -Eo \"\\trunc\\).*\" <<< \"$col_info\");                                                        \chars_extra=${chars_extra#trunc)};                                                                                 \chars_begin=${chars_extra%%\\%*};                                                                                  \chars_extra=${chars_extra#*\\%};                                                                                   \case \" ad aD ae aE ai aI al aL an aN ar as at b B cd cD ce cE ci cI cl cL cn cN cr                                \cs ct d D e f G? gd gD ge gE GF GG GK gn gN GP gs GS GT h H N p P s S t T \" in                            \*\" ${chars_extra:0:2} \"*)                                                                                       \chars_extra=${chars_extra:2};                                                                                   \chars_after=${chars_extra%%\\%*};                                                                               \;;                                                                                                              \*\" ${chars_extra:0:1} \"*)                                                                                       \chars_extra=${chars_extra:1};                                                                                   \chars_after=${chars_extra%%\\%*};                                                                               \;;                                                                                                              \*)                                                                                                                \echo \"No Placeholder found. Probably no tablelike output.\";                                                   \continue;                                                                                                       \;;                                                                                                              \esac ;                                                                                                             \if [[ -n \"$chars_begin$chars_after\" ]];then                                                                      \len_extra=$(echo \"$chars_begin$chars_after\" | wc -m);                                                          \col_length["$n:$i"]=$((${col_length["$n:$i"]}+$len_extra-1));                                                    \fi;                                                                                                                \\done <<< \"${line#*=format:}$delim\";                                                                                \i=1;                                                                                                                 \done <<< \"$(echo -e \"${git_log_cmd//\\%n/\\\\n}\")\";                                                                \\while IFS= read -r graph;do                                                                                            \chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);           \[[ ${chars_count:-0} -gt ${col_length["1:1"]:-0} ]] && col_length["1:1"]=$chars_count;                               \done < <([[ -n \"$(grep -F graph <<< \"$git_log_cmd\")\" ]] && git log --all --graph --pretty=format:\" \" && echo);   \\l=0;                                                                                                                   \while IFS= read -r line;do                                                                                             \c=0;                                                                                                                 \((l++));                                                                                                             \[[ $l -gt $n ]] && l=1;                                                                                              \while IFS= read -d\"$delim\" -r col_content;do                                                                       \((c++));                                                                                                           \if [[ $c -eq 1 ]];then                                                                                             \[[ -n \"$(grep -F \"*\" <<< \"$col_content\")\" ]] || l=2;                                                       \chars=$(sed -nl1000 \"l\" <<< \"$col_content\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \whitespaces=$((${col_length["1:1"]}-$chars));                                                                    \whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                                     \col_content[1]=\"${col_content[1]}$col_content$whitespaces\n\";                                                  \else                                                                                                               \col_content[$c]=\"${col_content[$c]}$(printf \"%-${col_length[\"$l:$c\"]}s\" \"${col_content:-\"\"}\")\n\";      \fi;                                                                                                                \done <<< \"$line$delim\";                                                                                            \for ((k=$c+1;k<=$i_max;k++));do                                                                                      \empty_content=\"$(printf \"%-${col_length[\"$l:$k\"]:-${col_length[\"${last[$k]:-1}:$k\"]:-0}}s\" \"\")\";         \col_content[$k]=\"${col_content[$k]}$empty_content\n\";                                                            \done;                                                                                                                \done < <(git $1 && echo);                                                                                              \\while read col_num;do                                                                                                  \if [[ -z \"$cont_all\" ]];then                                                                                       \cont_all=${col_content[$col_num]};                                                                                 \else                                                                                                                 \cont_all=$(paste -d\" \" <(echo -e \"$cont_all\") <(echo -e \"${col_content[$col_num]}\"));                        \fi;                                                                                                                  \done <<< $(seq 2 1 ${git_tre_col:-1};seq 1;seq $((${git_tre_col:-1}+1)) 1 $i_max);                                     \echo -e \"$cont_all\";                                                                                                 \"' "git-tably"

这或多或少只是我的答案https://stackoverflow.com/a/61487052/8006273的一部分,在这里你可以找到更深层次的解释,但也很适合这个问题。

如果您的git log命令有问题,请发表评论。

我正在使用Visual Studio代码编辑器,我发现自己对它的图表管理工具扩展非常满意,由mhutchie制作。(我并不孤单,有100万扩展的用户!)。

在此处输入图片描述

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

在此处输入图片描述

要使用它,请转到Git控制选项卡并按View Git Graph按钮

在此处输入图片描述

我发现令人难以置信的是,在众多答案中没有提到Gitviz,可用于Windows/Linux /Mac
除了提供分支和提交的二维视图外,它还会侦听您的git命令并自行修改图形。

在此处输入图片描述

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

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

产品特点:

  • 固定项目位置;
  • 提交哈希和引用名称的默认颜色;
  • 提交作者日期在本地时区;
  • 提交消息包装为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)'

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

$ git log --graph --pretty=compact

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

$ git config --global format.pretty compact

如果你喜欢别名:

$ git config --global alias.logc "log --date=format-local:'%d %b %Y %H:%M' --pretty='%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)'"

如果您想进行任何更改,请参阅漂亮的格式部分 ofgit log参考。

对于那些在VIM中工作的人来说,gv.vim可能很有趣。这就是我直接从VIM中使用的,它还可以方便地浏览提交历史并检查特定的更改。

这是直接来自gv.vim的Github页面的屏幕截图:

输入图片描述

具体风格取决于所使用的颜色主题。

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

现有的答案都没有显示如何使用内置的git log工具更改日期时间格式。由于文档对该功能有点迟钝,我添加了我为此使用的两个别名作为示例。

git tree-所有提交的时间戳日志

# Tools for analyzing the merge history of a repo using tree-like graphics[alias]tree = log --no-show-signature --graph --date=format-local:%H:%M:%S --all \--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)'"

git tree

git tree.branches-所有分支/标记提交的时间戳日志

# Some refinements to normal 'git tree' output for alternative perspectives.[alias "tree"]branches = tree --simplify-by-decoration

gittree.branches

颜色代码

规范颜色样式
提交ID黄色下划线
提交日期深蓝色
提交时间浅蓝色
提交消息白色
提交作者绿色
提交相对日期深绿色
远程分支红色
本地分支紫色
标签粉红色下划线