Вопрос:
Итак, я часто сталкивался с этой неприятной проблемой и пытался искать любые решения в Интернете, но я не уверен, что это ожидаемое поведение git или нет.
Всякий раз, когда у меня есть несколько локальных коммитов, и я делаю git pull, git переносит все другие народы в мою промежуточную область на случай, у меня конфликт слияния. Теперь, хотя конфликт находится в одном файле, я не понимаю, почему git приводит к конфликтующим конфликтам других людей в моей промежуточной области, прося меня передать их, как если бы они были изменениями/фиксациями, сделанными мной.
В последнее время у меня было такое же поведение на ноутбуке коллеги, и мы исключили все файлы, которые не были добавлены коллегой перед совершением, а затем передали единственный файл, который противоречил друг другу. И то, что произошло, было совершенно неожиданным. git, судя по всему, удалил все эти файлы, расстегнул все изменения, как будто наша команда изменила их.
Однако самое странное в том, что мы смотрели в Stash (мы используем Stash для управления центральным репо), и я не видел, чтобы эти файлы были отменены нашей фиксацией в Stash.
Я не понимаю, как это произошло. Любое правдоподобное объяснение? Кроме того, я видел, как Стэст очень странно временами. Это кажется ненадежным. Он не будет показывать никаких изменений между двумя коммитами, но все же есть изменения. Я понятия не имею, как это происходит, но кто-нибудь еще испытал эти проблемы?
Обновление. Я понял это позже, что Стейш не был странным, просто немного неинтуитивным. При слиянии он показывал изменения, основанные на двух разных родителях. И было небольшое раскрывающееся меню, которое позволило бы вам изменить родителя, чтобы увидеть соответствующие ему изменения. Я подумал, что было бы неплохо обновить его здесь, чтобы люди не вводили в заблуждение идеи.
Лучший ответ:
Поэтажные файлы, которые вы видите, являются результатом всех изменений между последней синхронизацией вашей локальной ветки с удаленной ветвью (я предполагаю, что мастер, как вы ее не упоминаете).
Git pull “извлек” изменения с момента последнего вытягивания, затем пытается объединить эту локальную копию удаленной ветки в вашу локальную ветвь. Затем он попал в конфликт в одном из измененных файлов.
Поэтому он должен остановиться в середине слияния, чтобы спросить, как разрешить конфликт в одном файле.
Таким образом, другие файлы готовы к объединению, были поставлены и были бы объединены автоматически, если бы не было никаких других конфликтов.
Чтобы завершить автоматическое слияние, вам необходимо: а) разрешить конфликт, а затем b) нажать фиксацию, чтобы завершить слияние других людей с изменениями в вашей локальной ветке. (Некоторые графические интерфейсы автоматизируют шаг завершения фиксации после нажатия кнопки “Я закончил разрешение” )
Вы также заметите, что в окне фиксации вашего графического интерфейса есть готовое сообщение слияния для ожидающего коммита? Он скажет что-то вроде “слияние происхождения/х в х… Конфликты: у”. После того, как все измененные файлы могут быть добавлены на сцену, вы готовы завершить эту автоматическую фиксацию, которая была приостановлена.
Итак, это звучит как ожидаемое поведение для меня, но вы просто видите “внутри” одного из внутренних процессов git.
Штампование не должно быть необходимым или задействованным здесь. Хотя некоторые графические интерфейсы делают автосохранение, git сам не использует тиснение во время pull.
Примечание: вы не должны иметь никаких измененных файлов локально, когда вы делаете pull. (т.е. совершать все чистое, прежде чем выполнять какие-либо операции с филиалом, является хорошей передовой практикой). Утилита GUI для очистки ваших измененных файлов – это когда автозагрузка полезна, но она по-прежнему имеет свои сложности при возникновении конфликтов. т.е. вам необходимо разрешить конфликты, а затем помните, чтобы потом всплывать. Если вы слишком много полагаетесь на автоматизацию, это становится запутанным, когда вам нужно завершить автоматический процесс, о котором вы не знаете! Поэтому я рекомендую всегда держать ваш рабочий каталог в чистоте.
Ответ №1
Поведение git pull по умолчанию – выполнить fetch, а затем a merge. Слияние – это фактическое, новое, фиксированное; обычно это разрешается автоматически, поэтому вы не видите никаких поэтапных изменений. Однако в случае конфликта коммит не может выполняться автоматически, поэтому видимые поэтапные изменения.