我在我自己的机器上孤立地玩git,我发现很难维护我所有分支和提交的心理模型。我知道我可以做一个git log
来查看我所处的提交历史,但是有没有办法看到整个分支地形,就像这些ascii地图似乎随处可用来解释分支?
.-A---M---N---O---P
/ / / / /
I B C D E
\ / / / /
`-------------'
只是觉得有人出现并试图拿起我的存储库会很难确定正在发生的事情。
我想我受到了AccuRev的stream browser ...
的影响答案 0 :(得分:960)
git log --graph
或gitk
。 (两者都接受--all
,它将显示所有分支而不是当前分支。)
修改强>
对于分支名称和紧凑视图,请尝试:git log --graph --decorate --oneline
答案 1 :(得分:453)
我通常使用
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) 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
,但它会将提交消息绑定到数字,这看起来不那么漂亮了。)
要为此命令创建快捷方式,您可能需要编辑~/.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
答案 2 :(得分:380)
我有3个别名(以及4个别名 - 别名以便快速使用)我通常会在window.contentView.translatesAutoresizingMaskIntoConstraints = NO;
文件中输入
~/.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 lg2
看起来像这样:
注意:答案在stackoverflow.com/questions/1057564/pretty-git-branch-graphs复制并改进了答案,因为它在这里比在那里更合适。由于历史原因,将副本留在另一个问题上 - 它现在已关闭,答案由一堆其他答案引用。
答案 3 :(得分:217)
对于这些配方中的任何一个(基于git log或gitk),您可以添加--simplify-by-decoration
来折叠历史记录中不感兴趣的线性部分。这样可以立即显示更多的拓扑。我现在可以理解没有这个选项会难以理解的大历史!
我觉得有必要发布这个,因为它似乎并不像它应该的那样众所周知。它没有出现在关于可视化历史的大多数Stack Overflow问题中,并且我花了很多时间寻找 - 即使在我知道我想要它之后!我终于在Debian bug report找到了它。 Stack Overflow的第一次提及似乎是Antoine Pelisse的this answer。
答案 4 :(得分:66)
答案 5 :(得分:47)
&#34; 99.999%的时间按git lg
查看历史记录,0.001%是git log
&#34;
只想分享可能有用的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
git lg
会看到当前的分支历史记录。git hist
将会看到整个分支历史。答案 6 :(得分:42)
我喜欢git log
来做:
git log --graph --oneline --branches
(也用--all,用于查看远程分支)
适用于最近的Git版本:介绍since 1.6.3(Thu, 7 May 2009)
日志命令系列的“
--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个提交通常就足够了。
答案 7 :(得分:40)
答案 8 :(得分:32)
Gitg对于Linux来说是一个很棒的工具,类似于Gitx for OS X.只需在命令行中从存储库的树结构中的某个位置运行'gitg'(与gitx相同)。
答案 9 :(得分:23)
答案 10 :(得分:23)
我发现“git-big-picture”非常有用:https://github.com/esc/git-big-picture
它使用dot / graphviz创建漂亮的2D图形,而不是gitk和朋友生成的相当线性的“一维”视图。使用-i选项,它显示分支点和合并提交,但不包括中间的所有内容。
答案 11 :(得分:18)
答案 12 :(得分:14)
Giggle绘制漂亮的图表
答案 13 :(得分:13)
Tortoise Git有一个名为“修订图”的工具。如果您使用的是Windows,只需右键单击您的回购 - &gt; Tortoise Git - &gt;修订图。
答案 14 :(得分: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
答案 15 :(得分:11)
没人提到if(root.getVal().equals("*")) {
if(root.getLeftChild().getVal().equals("1")) {
return root.getRightChild();
}
else if(root.getRightChild().getVal().equals("1")) {
return root.getLeftChild();
}
else if(root.getLeftChild().getVal().equals("0")) {
return root.getLeftChild();
}
else if(root.getRightChild().getVal().equals("0")) {
return root.getRightChild();
}
else if(root.getLeftChild().getVal().equals("*")) {
if(root.getRightChild().getType().equals("constant")) {
if(root.getLeftChild().getLeftChild().getType().equals("constant")) { // Ex: (5*x)*6 ==> 30*x
int num1 = Integer.parseInt(root.getRightChild().getVal());
int num2 = Integer.parseInt(root.getLeftChild().getLeftChild().getVal());
OpNode mult = new OpNode("*");
mult.setLeftChild(new ConstNode(String.valueOf(num1 * num2)));
mult.setRightChild(root.getLeftChild().getRightChild());
return mult;
}
...
...
...
...
?它不会折叠分支,例如&#34; BranchMaster&#34;,但是......
速度快,在终端运行。
因为它如此快速(+键盘控制)你获得了很好的用户体验,
它几乎就像我的#34; tig
&#34;对于包含git存储库的目录。
它有通常的快捷方式,ls
来搜索等等。
(ps。它是此屏幕截图背景中的终端,现在看起来更好,但我的电脑拒绝截取屏幕截图,抱歉)
(pps。我也使用gitkraken并且具有非常清晰的可视化效果,但它比/
重得多)
答案 16 :(得分:9)
我在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
)和相对作者日期< / strong>即可。请注意,Git&gt; = 1.8.3支持%C(auto)
语法,它告诉Git使用提交哈希的默认颜色等。
答案 17 :(得分:9)
对于Mac用户,结帐(没有双关语)免费的开源工具GitUp:http://gitup.co/
我喜欢图表的显示方式,它比我见过的其他一些工具更清晰。
答案 18 :(得分:7)
我发现this blog post显示了一种简洁的方式:
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
答案 19 :(得分:7)
对于使用VSCode text editor的人,请考虑D. Jayamanne的Git History Extension:
答案 20 :(得分:6)
另一个git log命令。这个固定宽度列:
git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short
答案 21 :(得分:6)
如果您碰巧使用OS X,Gitx也是一款出色的可视化工具。
答案 22 :(得分:6)
我个人最喜欢的别名是.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"
答案 23 :(得分:5)
旧帖子,但请查看SmartGit
。它非常提醒Tortoise HG分支可视化,它可以免费用于非商业用途。
答案 24 :(得分:3)
我正在使用 Visual Studio Code 编辑器,我发现自己对它的 Git Graph 扩展非常满意,它由 mhutchie 制作。 (而且我并不孤单,该扩展程序有 100 万用户!)。
如果您碰巧喜欢编辑器,那么只需转到扩展选项卡(左侧中间的隔间)并输入“Git Graph”并安装
要使用它,请转到 Git control 选项卡并按 View Git Graph 按钮
答案 25 :(得分:2)
在Windows上,您可以使用一个非常有用的工具:git extensions。它是一个gui工具,使git操作非常容易。
它也是开源的。
答案 26 :(得分:2)
最受好评的答案显示git log
命令是最喜欢的解决方案。
如果您需要 tablelike (例如输出列),则可以对.gitconfig alias.tably 代码段进行一些稍加修改和一些限制的git log命令在下面。
修改:
%><(<N>[,ltrunc|mtrunc|trunc])
--color
选项限制:
%n...
%><(<N>[,trunc])
如果需要额外的字符来装饰,例如{p}中的(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输出相比,这很慢但很好
Example来自该网站:
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 196
branch = 214
tag = bold 222
[alias]
# delimiter used as column seperator
delim = ^
# example thompson1
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)'
# modified thompson1 example
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)'
# set a column for the graph
thompson1-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命令有问题,请发表评论。
答案 27 :(得分:1)
我已经尝试了--simplify-by-decoration
,但我的所有合并都没有显示。所以我只是修剪掉没有&#34; \&#34;和&#34; /&#34;标题处的符号,同时始终用&#34;(&#34;在此之后立即指示分支。当显示分支历史记录时,我通常对提交注释不感兴趣,所以我也删除它们。我最终使用以下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/).*/)/'
}
答案 28 :(得分:1)
我们可以使其变得更复杂吗?
简单如何 git log --all --decorate --oneline --graph(记住一条狗= --All --Decorate --Oneline --Graph)
答案 29 :(得分:1)
令人难以置信的是,在众多答案中没有提到Gitviz,适用于 Window/Linux/Mac
除了提供分支和提交的二维视图外,它还侦听您的 git 命令并自行修改图表。
答案 30 :(得分:1)
我想分享 compact
命令的 git log
预设:
(绿色是我的默认控制台颜色)
它被设计得尽可能紧凑和像桌子一样(不添加任何多余的空间),同时仍然信息丰富且易于阅读。这基本上是 Git 默认使用的 medium
格式的精简版。
特点:
您可以使用以下命令将其添加到配置文件中:
(请注意,他们将更改所有 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)'"
如果您想进行任何更改,请参阅 git log
参考中的 PRETTY FORMATS section。
答案 31 :(得分:0)
Git官方网站招募了一些第三方平台特定的GUI工具。嗨,您好 git GUI Tools for Linux Platform
我已经将gitg
和GitKraken
用于linux平台。两者都很好理解提交树