Как я могу отменить удаленные изменения и пометить файл как "разрешенный"?
У меня есть некоторые локальные файлы, я тяну из удаленной ветки и есть конфликты. Я знаю, что хотел бы сохранить свои локальные изменения и игнорировать удаленные изменения, вызывающие конфликты. Есть ли команда, которую я могу использовать, чтобы фактически сказать: "отметьте все конфликты как разрешенные, используйте локальные"?
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
меняются местами во время перебазирования (потому что вверх по течению филиала проверили).