You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重现手动解决Git合并冲突后的特定diff展示?

如何重现Git合并提交前仅显示手动解决冲突的diff?

我用Git已有较长时间,有时需要手动解决合并冲突。当合并因失败中断时,手动解决冲突后执行git diff,只会显示我手动处理的冲突差异。但完成合并提交后,似乎无法再查看这类diff——最接近的三方diff会展示两个分支的所有变更,无论是否为手动解决的冲突。请问有什么技巧能重现合并提交前的这类diff?


测试用例

在新建的空目录中执行以下bash脚本test-git-merge.sh:

#!/bin/sh

git init
git config user.email "nnseva@gmail.com"
git config user.name "Vsevolod Novikov"
echo a1>>a.txt
echo a2>>a.txt
echo a3>>a.txt
echo b1>>b.txt
echo b2>>b.txt
echo b3>>b.txt
git add a.txt b.txt
git commit -a -m "Initial"
git checkout -b branch-x
echo a1>a.txt
echo "branch-x" >>a.txt
echo a2>>a.txt
echo a3>>a.txt
echo "branch-x" >>b.txt
git commit -a -m "Branch X"
git checkout master
git checkout -b branch-y
echo "branch-y" >>d.txt
git add d.txt
echo a1>a.txt
echo a2>>a.txt
echo "branch-y" >>a.txt
echo a3>>a.txt
echo "branch-y" >>b.txt
git commit -a -m "Branch Y"
git checkout branch-x
git checkout -b branch-z
git merge branch-y
echo "------------- Diff after merge conflict --------------"
git diff
echo b1>b.txt
echo b2>>b.txt
echo b3>>b.txt
echo "branch-x" >>b.txt
echo "branch-y" >>b.txt
echo "------------- Diff after merge conflict resolve --------------"
git diff
git commit -a -m "Fixed merge"
echo "------------- Diff for merge commit --------------"
git diff HEAD HEAD^@

测试输出

解决合并冲突后的Diff

diff --cc b.txt
index dac91e4,22e151d..0000000
--- a/b.txt
+++ b/b.txt
@@@ -1,4 -1,4 +1,5 @@@
  b1
  b2
  b3
 +branch-x
+ branch-y

合并提交的Diff

diff --cc a.txt
index 45f2c54,dd210a3..4164b20
--- a/a.txt
+++ b/a.txt
@@@ -1,4 -1,4 +1,5 @@@
  a1
 +branch-x
  a2
+ branch-y
  a3
diff --cc b.txt
index dac91e4,22e151d..7aaeeec
--- a/b.txt
+++ b/b.txt
@@@ -1,4 -1,4 +1,5 @@@
  b1
  b2
  b3
 +branch-x
+ branch-y

可以看到,合并提交的diff包含了自动解决的a.txt文件内容,这并非我们需要的。


解决技巧

方法1:提交前预先保存diff

在手动解决冲突后、执行合并提交前,直接将当前diff保存到文件:

git diff > merge-resolve.diff

之后需要查看时,直接打开这个文件即可,完全还原提交前的diff状态。

方法2:提交后通过Git命令筛选差异

如果提交前没保存diff,可以通过以下命令,仅提取手动解决冲突的文件的差异:

git diff HEAD HEAD^1 -- $(git diff --name-only --diff-filter=U HEAD^1 HEAD^2)

命令解释:

  • git diff --name-only --diff-filter=U HEAD^1 HEAD^2:列出合并时存在冲突(需要手动解决)的文件
  • git diff HEAD HEAD^1 -- [文件列表]:对比合并提交(HEAD)与第一个父分支的指定文件差异,即手动解决冲突后的变更

方法3:查看合并提交的冲突解决详情

也可以用git show命令,加上--diff-merges=cc参数,配合文件筛选展示冲突文件的解决结果:

git show --diff-merges=cc HEAD -- $(git diff --name-only --diff-filter=U HEAD^1 HEAD^2)

这个命令会以三方diff的形式展示仅冲突文件的解决结果,更贴近提交前的diff形态。


内容的提问来源于stack exchange,提问作者nnseva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:40:26