我在git中有两个类似的分支,我想手动将这些更改拉到完全不同的第三个分支中。是否可以对这些更改进行三向图形化比较?
当前已设置两个分支的图形差异,并且可以很好地与“ meld”配合使用。以下显示了预期的图形化融合窗口:
我尝试执行以下操作,但是得到了'diff --cc'的ASCII输出。
这是获取三向差异的有效语法吗?什么是正确的.gitconfig设置才能将其打开?我正在使用Git版本1.8.2.1。
我的期望是在一个融合窗口中打开这三个文件,然后我可以查看branch1 / branch2之间的更改,然后从视觉上确保相同的更改在master中。我刚刚意识到,可以通过从三个分支中分别检出每个文件,然后将文件名作为参数直接传递给meld来做到这一点。 可以按照以下SO答案进行结帐:https://stackoverflow.com/a/888623/350265
答案 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运行,因此我能够测试我的解决方案。