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

Git merge doesn't report merge conflict and picks unexpected end result

我有一个很好的重现脚本,用于 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 会产生对我来说意想不到的结果。

谢谢!

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

就在最后一次合并之前,如果你这样做

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

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

当三向合并算法比较$MERGE_BASEmasterrelease时,发现master没有引入任何变化,因此接受变化release没有冲突。