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_BASE
、master
和release
时,发现master
没有引入任何变化,因此接受变化release
没有冲突。
我有一个很好的重现脚本,用于 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_BASE
、master
和release
时,发现master
没有引入任何变化,因此接受变化release
没有冲突。