如何重现手动解决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
相关产品推荐
相关产品推荐

