git log:显示左侧的第二个父级

时间:2017-03-15 20:34:47

标签: git

考虑这个示例git repository。

#!/bin/bash -e
rm -rf example
git init example
cd example
echo 0 > file.txt
git add file.txt
git commit -am "initial commit"
git branch branch1
echo 1 > file.txt
git commit -am "1 (on master)"
git branch branch2
git checkout branch1
echo 2 > file2.txt
git add file2.txt
git commit -m "2 (on branch1)"
git merge --no-edit master
echo 3 > file2.txt
git commit -am "3 (on branch1)"
git checkout master
echo 4 > file.txt
git commit -am "4 (on master)"
git checkout branch1
git merge --no-edit master
echo 5 > file2.txt
git commit -am "5 (on branch1)"
git checkout master
git merge --no-edit --no-ff branch1
git log --graph --oneline

我们创建了一个分支branch1,从master分支合并了几次,最后合并回master

git log --oneline --graph看起来很奇怪。

*   2c3b97a Merge branch 'branch1'
|\
| * 1d722df 5 (on branch1)
| *   54039b6 Merge branch 'master' into branch1
| |\
| |/
|/|
* | d80d82c 4 (on master)
| * 2399286 3 (on branch1)
| *   9a0cb38 Merge branch 'master' into branch1
| |\
| |/
|/|
* | 31df841 1 (on master)
| * 5809072 2 (on branch1)
|/
* 08fc7a6 initial commit

如果它看起来像这样的图表会更简单:

*   2c3b97a Merge branch 'branch1'
|\
| * 1d722df 5 (on branch1)
| *   54039b6 Merge branch 'master' into branch1
|/|
* | d80d82c 4 (on master)
| * 2399286 3 (on branch1)
| *   9a0cb38 Merge branch 'master' into branch1
|/|
* | 31df841 1 (on master)
| * 5809072 2 (on branch1)
|/
* 08fc7a6 initial commit

正如我所理解的那样,它看起来不像是git log总是更喜欢在右侧显示每个合并提交的“第二个父”,因此对于每个合并提交它必须绕到右边。 (“第二个父”是合并的分支;“第一个父”是我们合并的分支。)

  1. 有没有办法说服git log生成我更喜欢的简单图表?有一个old gist from 2013提议解决这个问题(“让我指明哪些分支向左下沉”;那里也有其他有趣的想法),但我认为没有进展。
  2. 假设git log无法自然地做到这一点,是否还有另一个git commit图表工具/库可以用来制作这样的图形?

3 个答案:

答案 0 :(得分:2)

  
      
  1. 有没有办法说服git log生成我更喜欢的简单图表? 2013年有一个古老的要点,建议修复这个问题(&#34;让我指出哪些分支沉到左边&#34;还有其他有趣的想法),但我认为没有进展。< / LI>   

没有。 (正如我在另一个问题中所说的那样,一般来说这是一个很难的问题 - 事实上,它通常是NP难以解决的问题.Git的日志绘图代码是相当欺骗 - 但是交换父母可能会为这个案例,但还有很多其他案例。)

  
      
  1. 假设git log不能自然地完成,是否有另外一个git commit graphing工具/库可以用来制作这样的图形?
  2.   

我不知道。绘制图形的gitk代码与绘制图形的git log代码完全不同,但问题 - 概括为&#34;绘制具有最小交叉的DAG&#34; - 只是简单的硬盘。不过,有很多图形绘制程序。据说,dot非常好。

另请参阅Wikipediathis CS stackexchange question and answer

答案 1 :(得分:2)

感谢torek's suggestion尝试dot(又名Graphviz)我编写了这个Python脚本来生成dot文件格式的输出。它会生成一个这样的图形,对我来说看起来很不错:

enter image description here

#!/usr/bin/python
import subprocess, sys, re

args = ['git', 'log', '--pretty=format:%x00%H%x01%h%x01%P%x00'] + sys.argv[1:]

rows = subprocess.check_output(args).split('\x00')[1::2]

seen_commits = set([row.split('\x01')[0] for row in rows])

print("digraph G {")
for row in rows:
    columns = row.split('\x01')
    commit = columns[0]
    label = columns[1]
    print('"{}" [label="{}"];'.format(commit, label))
    for parent in columns[2].split(' '):
        if parent == "":
            continue
        if not parent in seen_commits:
            continue
        print('"{}" -> "{}"'.format(commit, parent))
print("}")

如果您将该文件放在$PATH git-log-dotchmod +x git-log-dot上,git会在您输入git log-dot时自动运行该文件。 (从git作为单独的脚本git-checkoutgit-reset等分发时,这是遗留的保留。)

您还需要Graphviz。在macOS上我用brew install graphviz安装了它;在Ubuntu上我相信你可以用sudo apt-get graphviz安装它。

您可以使用git log-dot生成PNG文件,如下所示:

git log-dot | dot -Tpng -o graph.png

(在上面的示例中,我还使用-Grankdir=LR使图表水平,但默认的垂直方向也非常好。)

答案 2 :(得分:0)

  

假设git log不能自然地完成,是否有另外一个git commit graphing工具/库可以用来制作这样的图形?

答案是,据我所知,你不能, 唯一关闭的(但不是你要问的)就是使用rebase(可以与""结合使用),这样日志就会更平坦。

但是再次 - 由于git的性质,你所要求的是不可能的

达到你想要做的最接近的方式(但又不是你想要的)

yourNumberFormatter.nilSymbol = "?"

尝试添加--onto&amp;&amp; git log --all --graph --decorate --oneline --boundary master...branch1 它没有帮助,也没有效果。

总结:

由于git的性质,你认为它不可能。

  

假设git log不能自然地完成,是否有另外一个git commit graphing工具/库可以用来制作这样的图形?

我没有任何其他工具可以做到这一点,因为git不会&#34;显示&#34;不同的分支提交(在您的样本--topo-order中)在同一&#34;行&#34;与另一个分支