Является ли использование `git checkout --theirs <filename>` законным способом разрешения конфликта слияния?

Я обновляю с master и получил ошибку слияния с файлом, который я не должен изменять (я должен был сделать это случайно).

Вместо того, чтобы пытаться выяснить проблемы слияния в коде, я могу просто сказать git использовать "их" копию? Могу ли я просто использовать git checkout --theirs без каких-либо последствий?

Если нет, каков будет правильный путь к этому?

1 ответ

Решение

Вы можете, на самом деле, git checkout --theirs -- path заменить версию файла в рабочем дереве (с именем path) на их версию. -- часть требуется только если path напоминает git checkout опция, например, если файл назван --ours или же --force или что-то глупое, как это. (Однако полезно привыкнуть к его использованию, на всякий случай. Когда-нибудь вы наткнетесь на файл с именем -rf и -- -rf привычка помешает тебе бежать rm -rf...:-))

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

Особенно если ты git checkout MERGE_HEAD path, это пометит файл как разрешенный. Это потому, что эта форма git checkout сначала копирует файл из указанного коммита— MERGE_HEAD - в нулевой слот индекса, затем оттуда к рабочему дереву. Этот шаг "копировать в слот 0" разрешает конфликт слияния. Но обратите внимание, что если вы переименовали файл, path вам нужно с --theirs и path вам нужно с MERGE_HEAD будет другим!

Другие вопросы по тегам