展示Git分支结构。

37
有没有一种方法可以在Git中只显示分支结构?有许多工具可以以图形方式显示提交历史记录,但在我的情况下,列表太长了,无法看清分支结构。我猜git-log可能是答案,但我找不到只显示分支提交的开关。"--graph --branches --oneline --all"与此结合可以解决问题。
编辑:我正在寻找在Ubuntu中实现此操作的方法。

1
可能是漂亮的git分支图形的重复问题。 - trblnc
这里有一份来自Git官网的GUI列表和一份来自维基百科的GUI比较列表,可能会对你有所帮助。我建议你使用GitKraken来获取这些图片。GitKraken - Gonçalo Peres
6个回答

40

我不确定你所说的“分支结构”具体指什么。
git log 可以帮助可视化通过提交创建的分支(参见此博客文章):

[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"

alt text

但是如果你只想要不同的HEAD分支,你可以尝试类似于下面这样的操作:

heads = !"git log origin/master.. --format='%Cred%h%Creset;%C(yellow)%an%Creset;%H;%Cblue%f%Creset' | git name-rev --stdin --always --name-only | column -t -s';'"

(使用column命令,仅列出自上次origin/master提交以来的提交记录)
注意:Jakub Narębski建议添加选项--simplify-by-decoration,请参见他的答案

这个解决方案(后者)已经非常接近了,我只需要在命令中添加日期和--branch。否则它只会显示当前分支。虽然它仍然没有排除不是head的提交。我所说的“分支结构”是一种查看每个分支是从哪个分支创建的方法,但是通过这个命令,我可以滚动列表(大约有350个提交)来查看发生了什么。 - Makis
@Makis:如果你有最终的命令,可以将其发布为答案:我很感兴趣(并会投票支持)。然后,如果你想的话,甚至可以接受自己的答案作为官方答案。 - VonC
我还在研究中,明天回到办公室尝试理清结构。该仓库是使用svn2git创建的,我也不确定svn仓库是否完全按照规范创建。 - Makis
1
@Makis:尝试使用--simplify-by-decoration选项来运行git-log。 - Jakub Narębski
这个方法很管用,谢谢!也感谢其他人的建议! - Makis

35

也许你想要的是--simplify-by-decoration选项,参见git log文档:

--simplify-by-decoration

    选择被某个分支或标签引用的提交。

因此命令应该是:

git log --graph --simplify-by-decoration --all

或者跟随VonC的回答

git log --graph --simplify-by-decoration \
   --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' \
   --abbrev-commit --date=relative

太好了,我错过了那个特定的选项。+1 - VonC
@VonC:这是一个相当新的选项;它出现在git版本1.6.1中。 - Jakub Narębski
1.6.1?http://git.kernel.org/?p=git/git.git;a=tags: 对我来说,2008年12月25日似乎是一辈子以前的事了 ;) - VonC
这个翻译非常接近,但是它错过了一些常见祖先提交到多个分支的情况,而这些提交并没有命名为分支或标签。 - musiphil

9
也许我漏掉了什么,但似乎还没有人提到 gitk --all

4
我刚刚尝试了gitk --all --simplify-by-decoration,效果还不错。(这是使用git 1.7.9.5附带的gitk做的) - Rhubbarb

6

基本解决方案是:

git log --graph --all

如果你想更加高级一些:

git log --graph --all --pretty=format:"%Cblue%h%Creset [%Cgreen%ar%Creset] %s%C(yellow)%d%Creset"

3

GitX 适用于 macOS。

SmartGit 适用于 macOS 或 Windows(但我没有使用过它)。

Git GUI 可以使用本地的 Git GUI(跨平台)。


抱歉,我忘了提到我使用的是Ubuntu操作系统。 - Makis
git-gui(你是指gitk,对吧?)对我不起作用 - 1. 它只显示您检出的分支,我想要整个树。2. 它显示所有提交,我只对分支结构感兴趣。 - ripper234
@ripper234 你可以使用 gitk -a 来显示所有分支。 - Joe Halliwell

2
要了解特定分支与您的存储库和远程存储库中其他分支的关系,您可以使用William Morgan的附加脚本git wtf。该脚本的网址为:http://git-wt-commit.rubyforge.org/。它会生成类似以下的摘要信息:
$ git wtf
Local branch: master
[x] in sync with remote
Remote branch: origin/master (git@gitorious.org:willgit/mainline.git)
[x] in sync with local

Feature branches:
{ } origin/experimental is NOT merged in (1 commit ahead)
    - some tweaks i'm playing around with [80e5da1]
{ } origin/dont-assume-origin is NOT merged in (1 commit ahead)
    - guess primary remote repo from git config instead of assuming "origin" [23c96f1]

(以上网址中的示例。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接