У меня проблема при манипулировании git pull. Предположим, у меня есть 2 ветки в удаленном (исходном) хранилище: A и B.

Удаленная ветвь B опережает локальную ветвь B на 1 коммит.

Этот дополнительный коммит (в удаленной ветке B) просто добавляет новый файл, скажем, "newfile".

В моей локальной ветке A у меня есть файл "newfile", и его содержимое отличается от содержимого удаленной ветки B.

Затем я запускаю следующие команды:

git checkout A
git pull origin B:B

Я вижу следующее поведение: ветка B обновляется, как я ожидал. B был переадресован, а затем содержит "новый файл". Но у меня тоже есть конфликт по "newfile". и в моем текущем каталоге, файл "newfile" содержит маркеры конфликтов.

Почему возникает конфликт, когда слияние уже сделано?

Спасибо.

2 ответа2

0

Когда вы делаете тягу, (по умолчанию) он получает все, что может, не перезаписывая сделанные вами изменения. Все, что он не мог получить, потому что ему пришлось бы изменить ваше редактирование, считается конфликтом. Конфликты должны быть разрешены вручную, или вы можете отменить изменения и сделать еще одну попытку. Как только вы завершите слияние, вы можете нажать, чтобы зафиксировать изменения.

Это поведение по умолчанию, потому что подумайте, насколько это может быть плохо, если он этого не сделает - ваши изменения могут быть сорваны без вашего разрешения.

0

Я думаю, что неправильно понял семантику git pull. Я думал так :

git pull origin B:B

означало :

fetch the remote B 
         + 
merge the remote B into the local B

Я понимаю, что это означает:

fetch the remote B and updates (if fast-forward is possible)  the local B
             +
merge the remote B into the local branch

На самом деле git pull всегда будет сливаться с локальной веткой независимо от refspec.

Другими словами, pull = fetch + merge. Обновление локальной ветви B выполняется командой "fetch", а конфликт генерируется следующей операцией слияния (в локальную ветку).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .