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

How can I do a three way graphical diff (not merge) with git?

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

两个分支的图形差异当前已设置并且与 'meld' 配合良好。以下显示了预期的图形融合 window:

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

这是获得三向差异的有效语法吗?什么是正确的 .gitconfig 设置让它打开 meld?我正在使用 Git 版本 1.8.2.1.

我的期望是同时打开三个文件 window,然后我可以查看 branch1/branch2 之间的变化,然后直观地确保主文件中有相同的变化。我刚刚意识到我可以通过独立地检查三个分支中的每个文件,然后将文件名作为参数直接传递给 meld 来做到这一点。 可以按照这个 SO 答案完成结帐:

手动一行命令

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

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 :) <(git show :) <(git show :)

使其可执行:

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 :) <(git show :)
elif [[ $# -eq 4 ]]; then
   meld <(git show :) <(git show :) <(git show :)
else
   echo Usage: git meld committish1 committish2 [committish3] file >&2
   exit 1
fi

PS

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

#!/bin/bash
python2.6 /usr/bin/meld <(git show :) <(git show :) <(git show :)

梅尔德老了!该脚本说它需要 Python 2.4,但它无法使用 2.7 或 3 进行编译。幸运的是,它可以 运行 使用 2.6,因此我能够测试我的解决方案。