Git merge не сообщает о конфликте слияний и получает неожиданный конечный результат - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть хороший сценарий воспроизведения для сценария, в котором 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.После объединения мастера, a.txt все еще содержит 6!Зачем?Я ожидал увидеть конфликт слияния, так как обе ветви вносили изменения в одном и том же месте.

Я знаю, что сценарий может показаться придуманным и не показывает использование лучших практик.Пожалуйста, обратите внимание, почему GIT дает для меня неожиданный результат.

Спасибо!

1 Ответ

0 голосов
/ 01 февраля 2019

Я только что воспроизвел ваш сценарий и нашел объяснение.Что происходит, так это то, что Git использует только три коммита для выполнения слияния, а не промежуточную историю.

Непосредственно перед последним слиянием, если вы выполните

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

, вы не увидите сообщений об изменениях, поскольку вы внесли изменение и отменили его при следующем коммите.

Когда алгоритм трехстороннего слияния сравнивает $MERGE_BASE, master и release, он видит, что master не вводил никакихизменения и, следовательно, принимает изменения в release без конфликта.

...