Git合并不会报告合并冲突,并且会选择意外的最终结果

时间:2019-02-01 13:40:10

标签: git git-merge

对于GIT给我带来意外结果的场景,我有一个不错的再现脚本:

# in an empty directory
git init

echo 4 > a.txt
git add a.txt
git commit -m "initial commit"

git checkout -b test
echo 6 > a.txt
git commit -am "4 => 6"

git checkout -b release master
git merge --no-edit --no-ff test

git checkout master
echo 6 > a.txt
git commit -am "4 => 6"
echo 4 > a.txt
git commit -am "6 => 4"

git checkout release
git merge --no-edit master

在最后一次合并之前,a.txt包含6,而master:a.txt将其更改为4。合并master之后,a.txt仍然包含6!为什么?我希望看到合并冲突,因为两个分支都在同一位置进行了更改。

我知道该脚本似乎是经过精心编写的,并未显示出最佳做法的使用。请关注为什么GIT对我来说会产生意外结果。

谢谢!

1 个答案:

答案 0 :(得分:2)

我刚刚转载了您的情况并找到了解释。发生的事情是,Git仅查看三个提交来进行合并,而不是中间的历史记录。

就在最后一次合并之前

MERGE_BASE=`git merge-base master release`
git diff $MERGE_BASE master

您将看不到任何更改,因为您进行了更改并在下一次提交时取消了更改。

当三元合并算法比较$MERGE_BASEmasterrelease时,它会发现master没有引入任何更改,因此接受{{ 1}},没有冲突。