Является ли использование `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
будет другим!