我使用Git很长时间了,有时需要手动解决冲突。
当合并因合并失败而停止时,我会手动解决冲突。此时我可以拨打
git diff
,它只会向我显示那些有冲突并由我自己手动解决的差异。
但是在合并提交之后,看起来我无法再次看到这样的差异。最相似的是三向差异,它显示两个分支所做的所有更改,无论它们是冲突并手动解决,还是自动合并。
有人找到了一些技巧来查看这样的差异 - 再次在合并提交之前进行吗?
下面是演示我的问题的测试用例。
要在 bash 或 sh 中从为测试创建的空目录执行的文件
test-git-merge.sh
:
#/bin/sh
git init
git config user.email "[email protected]"
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 --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
文件有一个
extra不必要的部分,该部分已自动解决。
在
Diff after merge conflict resolve
时刻,a.txt
上演,而b.txt
则不上演。因此,git diff
仅输出b.txt
的差异。
为了仅输出
b.txt
的差异,我们需要将 b.txt
附加到 git diff HEAD HEAD^@
。
git diff HEAD HEAD^@ -- b.txt
但是手动指定
b.txt
并不明智。我们可以找出合并过程中发生冲突的文件。
git show HEAD --pretty= --remerge-diff --name-only
并将它们放在一起。
git diff HEAD HEAD^@ -- $(git show HEAD --pretty= --remerge-diff --name-only)