Устранение конфликта слияния "оба добавлены" в git?

144

Я выполняю перезагрузку в git, и один конфликт, который я получаю, - это «оба добавлены», то есть точно такое же имя файла было добавлено независимо в моей ветке и в ветке, в которой я выполняю перезагрузку. git statusговорит мне:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

У меня вопрос, как мне решить эту проблему? Должен ли я использовать инструмент слияния или есть способ сделать это просто из командной строки? Если да git rm src/MyFile.cs, то как git узнает, какую версию файла я хочу удалить, а какую оставить?

Jez
источник

Ответы:

143

Если вы используете git rmgit, все версии этого пути будут удалены из индекса, поэтому действие разрешения оставит вас без какой-либо версии.

Вы можете использовать git checkout --ours src/MyFile.csдля выбора версии из ветки, на которую вы выполняете перебазирование, или git checkout --theirs src/MyFile.csдля выбора версии из ветви, которую вы переустанавливаете.

Если вы хотите смешать, вам нужно использовать инструмент слияния или отредактировать его вручную.

CB Bailey
источник
1
Спасибо. И я только что понял, что инструмент слияния не работает, потому что git создает файлы .LOCAL и .REMOTE для слияния, но не файл .BASE. Я думаю, нужно просто создать пустой файл .BASE. Если вы вручную создаете пустой файл .BASE, инструмент слияния работает нормально.
Jez
1
@Jez: Пожалуйста, посмотрите эту ветку
CB Bailey,
1
Вы хотите сказать, что это будет исправлено в последней версии git?
Jez,
1
@Jez: Это в версиях git> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey,
23
Из ответов @Tom: При выполнении ... git checkout --ours someFile Может показаться, что он ничего не сделал при выполнении git status. Только не забудьте сделать это потом. git add someFile git status
печ
72

Иногда меня сбивает с толку использование параметров --theirsи --ours, чтобы определить, откуда будет взят файл. Большую часть времени мой будет в ветке, которую я перебазирую, на которую ссылается --theirs!

Вы также можете использовать git checkout <tree-ish> -- src/MyFile.cs

Где <tree-ish>можно заменить либо именем ветки, либо идентификатором фиксации, содержащим файл, который вы хотите сохранить.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

Анас Алхатиб
источник
43

Когда делаешь ...

git checkout --ours someFile

Может показаться, что при выполнении git status ничего не произошло.

Только не забудьте сделать это потом.

git add someFile
git status
Том
источник