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


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

2 177

2 ответа:

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. Когда вы сливаетесь в чужом коде (что также происходит во время вытягивания; вытягивание по существу является выборкой, за которой следует слияние), существует несколько возможных ситуаций.

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

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

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

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

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

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

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

git checkout --theirs -- .

в разделе "почему значение "ours" и "theirs" обратная" " посмотреть, как ours и theirs меняются местами во время перебазирования (потому что вверх по течению филиала проверили).