对于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对我来说会产生意外结果。
谢谢!
答案 0 :(得分:2)
我刚刚转载了您的情况并找到了解释。发生的事情是,Git仅查看三个提交来进行合并,而不是中间的历史记录。
就在最后一次合并之前
MERGE_BASE=`git merge-base master release`
git diff $MERGE_BASE master
您将看不到任何更改,因为您进行了更改并在下一次提交时取消了更改。
当三元合并算法比较$MERGE_BASE
,master
和release
时,它会发现master
没有引入任何更改,因此接受{{ 1}},没有冲突。