如何使用git做三向图形化差异(不合并)?

时间:2019-04-23 21:47:49

标签: git git-diff

我在git中有两个类似的分支,我想手动将这些更改拉到完全不同的第三个分支中。是否可以对这些更改进行三向图形化比较?

当前已设置两个分支的图形差异,并且可以很好地与“ meld”配合使用。以下显示了预期的图形化融合窗口:

  • git diff branch1 branch2-我的文件名

我尝试执行以下操作,但是得到了'diff --cc'的ASCII输出。

  • git diff master branch1 branch2-myfilename

这是获取三向差异的有效语法吗?什么是正确的.gitconfig设置才能将其打开?我正在使用Git版本1.8.2.1。

我的期望是在一个融合窗口中打开这三个文件,然后我可以查看branch1 / branch2之间的更改,然后从视觉上确保相同的更改在master中。我刚刚意识到,可以通过从三个分支中分别检出每个文件,然后将文件名作为参数直接传递给meld来做到这一点。 可以按照以下SO答案进行结帐:https://stackoverflow.com/a/888623/350265

1 个答案:

答案 0 :(得分:1)

手动一线命令

通过将bash中的meld语法与您的<(cmd)想法结合起来,可以在文件的三个版本上调用git show,而无需使用临时文件:

meld <(git show master:file) <(git show branch1:file) <(git show branch2:file)

这将弹出融合文件dev/fd/61/dev/fd/62/dev/fd/63,分别引用三个分支中的文件。名称不是很友好,但是您会习惯的。关键是它将显示您想要看到的内容。

编写脚本

显而易见的下一步是使用脚本简化语法:

创建文件~/bin/git-meld3(或PATH中的其他任何位置):

#!/bin/bash
meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

使其可执行:

chmod +x ~/bin/git-meld3

调用:

git meld3 master branch1 branch2 myfilename

该命令适用于任何内容:

git meld3 master 36d1cf756 HEAD^^^ myfilename

更灵活的脚本

~/bin/git-meld脚本接受两个或三个承诺:

#!/bin/bash
if [[ $# -eq 3 ]]; then
   meld <(git show $1:$3) <(git show $2:$3)
elif [[ $# -eq 4 ]]; then
   meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)
else
   echo Usage: git meld committish1 committish2 [committish3] file >&2
   exit 1
fi

PS

在我自己的计算机上,我必须像这样调用融合:python2.6 /usr/bin/meld,可能是因为未正确安装它,所以这是我的实际~/bin/git-meld3脚本:

#!/bin/bash
python2.6 /usr/bin/meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

产地老!该脚本说它需要Python 2.4,但是不能用2.7或3编译。所幸,它确实可以用2.6运行,因此我能够测试我的解决方案。