Sea*_*ean 30 git merge commit difftool
有没有办法查看已经在3-way diff中提交的合并?
如果3周前分支机构之间发生了巨大的合并,有什么方法可以在像BeyondCompare3这样的外部差异工具中看到它的3路差异吗?我正在寻找合并提交中更改的文件.奖金,如果我能得到它只显示冲突和任何手动更改,而不是看到两个分支之间的文件的完整差异.
如果左侧有<<<<< ===== >>>>>冲突标记而右侧是承诺结果,我不介意解决双向差异问题.
我试着看看diff-tree,diff-files,diff,difftool,show等等,但是无法弄明白.我知道gitk会在合并提交中显示更改,但我不喜欢上下差异视图,当有大量更改时很难理解.
如果我能做点什么的话 git difftool --cc firstparent..secondparent..result
更新的答案:我的原始版本的脚本在某种意义上是有缺陷的,$conflicting_files实际上它不仅包含真正存在冲突的文件,而是包含在两个父分支中都已更改的所有文件(但不一定有冲突).此外,它没有使用理论中所宣传的"已配置的合并工具",但是diffuse.我在当前版本的脚本中解决了这两个问题.
原始答案: 假设我们有一个主要开发的"主"分支,以及一个"主题"分支,它在一些(较旧的)master状态之上添加了一些功能.通过说你只是在寻找合并提交中更改的文件,我假设你只对在合并提交中引入"master"的更改"主题"(包括任何冲突解决方案)感兴趣,而不是非由于"主题"分支,在"主"中完成的冲突变化.进一步假设"master"是合并提交的第一个父级,"topic"是第二个,这可以通过实现
git difftool <merge commit>^1 <merge commit>
Run Code Online (Sandbox Code Playgroud)
请注意,在这里使用3向diff是没有意义的,因为我们正在查看包含任何冲突解决方案的状态.这也是GitHub为合并提交显示的内容,顺便说一下,参见例如我用于测试的合并提交.
为了在3向diff工具中只查看冲突的文件及其分辨率,我想出了这个脚本
#!/bin/sh
if [ $# -ne 1 ]; then
echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool."
echo "Usage : $(basename $0) <merge commit>"
exit -1
fi
# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8
our=$1^1
their=$1^2
base=$(git merge-base $our $their)
conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$")
for f in $conflicting_files; do
diffuse -r $our -r $base -r $their $f
done
Run Code Online (Sandbox Code Playgroud)
我使用的是Diffuse而不是Beyond Compare,因为第一个可以直接在Git提交上工作而不是本地文件; 根据自己的喜好改变参数的顺序.要使用BC,您可能需要进行临时检查; 我还在考虑重做合并,应用已知的解决方案,并运行所git mergetool配置的内容,但这两个想法都需要更多工作,以免弄乱您的工作树并正确地进行清理.