Подтвердить что ты не робот

Как я могу удалить удаленные изменения и отметить файл как "разрешенный"?

У меня есть локальные файлы, я вытаскиваю из удаленной ветки, и есть конфликты. Я знаю, что хотел бы сохранить локальные изменения и игнорировать удаленные изменения, вызывающие конфликты. Есть ли команда, которую я могу использовать, чтобы сказать "отметьте все конфликты как разрешенные, используйте локальные"?

4b9b3361

Ответ 1

git checkout имеет параметр --ours, чтобы проверить версию файла, который у вас был локально (в отличие от --theirs, который является той версией, которую вы вытащили). Вы можете передать . в git checkout, чтобы сказать ему, чтобы проверить все в дереве. Затем вам нужно пометить конфликты как разрешенные, которые вы можете сделать с помощью git add и выполнить свою работу после выполнения:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

Обратите внимание на . в команде git checkout. Это очень важно и легко пропустить. git checkout имеет два режима; один, в котором он переключает ветки, и тот, в котором он проверяет файлы из индекса в рабочую копию (иногда сначала вытягивая их в индекс из другой ревизии). Способ, которым он отличается, заключается в том, прошел ли вы имя файла; если вы не передали имя файла, он пытается переключить ветки (хотя, если вы не пройдете также в ветке, он просто попытается проверить текущую ветку снова), но он отказывается это делать, если есть модифицированные файлы что это будет иметь значение. Итак, если вам нужно поведение, которое перезапишет существующие файлы, вам нужно передать . или имя файла, чтобы получить второе поведение от git checkout.

Также хорошая привычка иметь при прохождении в имени файла смещение с помощью --, например git checkout --ours -- <filename>. Если вы этого не сделаете, и имя файла совпадает с именем ветки или тега, Git будет считать, что вы хотите проверить, что ревизия вышла, вместо того, чтобы проверять это имя файла, и поэтому используйте первую форму команда checkout.

Я немного расскажу о том, как конфликты и слияние работают в Git. Когда вы сливаетесь в код другого пользователя (что также происходит во время pull, pull - это, по существу, выборка, за которой следует слияние), существует несколько возможных ситуаций.

Самое простое, что вы в той же версии. В этом случае вы "уже обновлены", и ничего не происходит.

Другая возможность заключается в том, что их пересмотр является просто вашим потомком, и в этом случае вы по умолчанию будете иметь "ускоренное слияние", в котором ваш HEAD просто обновляется до их фиксации без какого-либо слияния ( это может быть отключено, если вы действительно хотите записать слияние, используя --no-ff).

Затем вы попадаете в ситуации, когда вам действительно нужно объединить две ревизии. В этом случае возможны два возможных результата. Во-первых, слияние происходит чисто; все изменения находятся в разных файлах или находятся в одних и тех же файлах, но достаточно далеко друг от друга, что оба набора изменений могут быть применены без проблем. По умолчанию, когда происходит чистое слияние, оно автоматически фиксируется, но вы можете отключить его с помощью --no-commit, если вам нужно его предварительно отредактировать (например, если вы переименовали функцию foo в bar, а кто-то еще добавляет новый код, который вызывает foo, он будет сливаться чисто, но создаст разбитое дерево, поэтому вы можете очистить его как часть слияния, чтобы избежать каких-либо ломаных коммитов).

Последняя возможность заключается в том, что существует реальное слияние, и есть конфликты. В этом случае Git будет выполнять как можно больше слияния и создавать файлы с маркерами конфликтов (<<<<<<<, ======= и >>>>>>>) в вашей рабочей копии. В индексе (также называемом "промежуточной областью", где файлы хранятся на git add, прежде чем их совершать), у вас будет 3 версии каждого файла с конфликтами; есть оригинальная версия файла от предка двух разделяемых вами ветвей, версия из HEAD (ваша сторона слияния) и версия из удаленной ветки.

Чтобы разрешить конфликт, вы можете либо отредактировать файл, который находится в вашей рабочей копии, удалив маркеры конфликтов и зафиксировав код, чтобы он работал. Или вы можете проверить версию с одной или с другой стороны слияния, используя git checkout --ours или git checkout --theirs. После того, как вы поместили файл в нужное вам состояние, вы укажете, что вы сделали слияние файла, и он готов к фиксации с использованием git add, а затем вы можете зафиксировать слияние с помощью git commit.

Ответ 2

Удостоверьтесь в происхождении конфликта: если это результат git merge, см. Брайан Кэмпбелл answer.

Но если результат a git rebase, чтобы отменить удаленные (их) изменения и использовать локальные изменения, вам нужно будет сделать:

git checkout --theirs -- .

См. "Почему значение "ours" и "theirs" отменено "" , чтобы увидеть, как обменять ours и theirs во время rebase (потому что ветвь upstream вычеркнута).