Как исправить конфликт слияния из-за удаления файла в ветке?

208

Я создал dialogветку, и когда я пытаюсь объединить ее с masterветкой. Есть 2 конфликта. Я не знаю, как решить CONFLICT (delete/modify). Подскажите, пожалуйста, что мне делать?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

Я открыл src/DialogAdapter.java, исправил конфликт и сделал git add src/DialogAdapter.java. Что еще мне нужно сделать?

Базз-DEE
источник
Вы можете прочитать этот пост о переполнении стека: - Как я могу исправить конфликты слияния в Git? Принятый ответ ссылается на руководство по git .
тяжело

Ответы:

271

Сообщение о конфликте:

КОНФЛИКТ (удалить / изменить): res / layout / dialog_item.xml удален в диалоге и изменен в HEAD

означает, что res/layout/dialog_item.xmlбыл удален в ветке 'dialog', которую вы объединяете, но был изменен в HEAD (в ветке, в которую вы сливаетесь).

Таким образом, вы должны решить,

  • удалить файл с помощью " git rm res/layout/dialog_item.xml"

или

  • принять версию из HEAD (возможно, после ее редактирования) с помощью " git add res/layout/dialog_item.xml"

Затем вы завершаете слияние с " git commit".

Обратите внимание, что git предупредит вас, что вы создаете коммит слияния, в (редком) случае, когда это то, что вам не нужно. Вероятно, остается со времен, когда указанный случай был менее редким.

Якуб Наребски
источник
22
Пробовал первый ( git rm …), но я получаю …: needs mergeи rm '…'который мне трудно интерпретировать. И затем, если я пытаюсь зафиксировать, снова появляется stackoverflow.com/questions/19985906/…
Джесси Глик
17
Не берите в голову вторую половину этого комментария. Вывод из Git несколько тревожит, но кажется безвредным.
Джесси Глик
4
Есть ли массовый подход? У меня есть проект, который опирается на внешние вещи, которые я не хочу оставлять. Так что есть много файлов, которые были изменены в апстриме, и я хочу удалить в своей ветке, что я перебираю, несмотря ни на что. Утомительно делать это один за другим.
млт
2
@mit: вы можете использовать git ls-files --stageи / или git status --porcelainи / или git diff-files <something>получить список измененных файлов, и запустить сценарий, чтобы удалить их или принять вашу или их версию.
Якуб Наребски
1
@Honey: сообщение CONFLICT включает описание того, какое изменение было в какой ветви. Вы можете проверить это позже с помощью git statusили git diff --cc. Есть и то, git log --mergeчто может помочь ...
Якуб Наребски
74

Обычно я просто запускаю, git mergetoolи мне будет предложено сохранить измененный файл или удалить его. ИМХО, это самый быстрый способ, так как это одна команда вместо нескольких на файл.

Если у вас есть несколько удаленных файлов в определенном подкаталоге, и вы хотите, чтобы все они были решены путем удаления файлов, вы можете сделать это:

yes d | git mergetool -- the/subdirectory

Предусмотрено dудаление каждого файла. Вы также можете использовать, mчтобы сохранить измененный файл. Взято из приглашения, которое вы видите при запуске mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
источник
1
@BrianMint, мне тоже, остальные вещи были просто порочным кругом
Нейт Л,
2
Это раздражает, когда много файлов, есть ли способ дать один ответ для всех?
ideasman42
2
@ ideasman42 Я обновил свой ответ, чтобы показать решение для пакетного удаления.
void.pointer
1
Я действительно не знал об инструменте слияния. Ты спас мой день, чувак!
Мерт
6

Если вы используете Git Gui на Windows,

  1. Прервать слияние
  2. Убедитесь, что вы находитесь в целевой ветви
  3. Удалить конфликтующий файл из проводника
  4. Пересканируйте изменения в Git Gui (F5)
  5. Обратите внимание, что конфликтующий файл удален
  6. Выберите Stage Измененные файлы для фиксации (Ctrl-I) из меню Commit
  7. Введите комментарий для коммита, например «удаленный конфликтующий файл»
  8. Подтвердить (Ctrl-Enter)
  9. Теперь, если вы перезапустите слияние, оно будет (надеюсь) работать.
salihcenap
источник
5
Парню просто не нравится, как вы справляетесь с Git с помощью GUI, вероятно. Путь командной строки лучше.
Souris