在外部3向差异工具中查看已经提交的Git合并

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

ssc*_*rth 6

更新的答案:我的原始版本的脚本在某种意义上是有缺陷的,$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配置的内容,但这两个想法都需要更多工作,以免弄乱您的工作树并正确地进行清理.


小智 2

我不知道如何在 git 中进行三向比较而不需要一些黑客技术,但是对于双向比较我会使用meld. meld如果您签出项目的三个不同版本,按目录进行新的比较并选择“三向比较”选项,则能够进行三向比较。

首先安装meld

sudo apt-get install meld

然后将 meld 设置为 difftool

git config --global diff.tool meld

找到提交

git log | more

打开提交

git difftool <old-version>..HEAD