Як виправити конфлікт злиття через видалення файлу у гілці?


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. Що ще мені потрібно зробити?


Ви можете прочитати цю публікацію на "Переповнення стека": - Як виправити конфлікти злиття в Git? Прийнята відповідь посилається на посібник з git .
важкий

Відповіді:


271

Повідомлення про конфлікт:

CONFLICT (видалити / змінити): res / layout / dialog_item.xml видалено у діалоговому вікні та змінено в HEAD

означає що res/layout/dialog_item.xml було видалено у вікні "діалогового вікна", який ви об'єднуєте, але було змінено в 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
Чи існує масовий підхід? У мене є проект, який покладається на зовнішні речі, які я не хочу тримати. Отже, є безліч файлів, які були модифіковані вгору за течією, і я хочу видалити у своїй гілці, яку я випускаю, незважаючи ні на що. Стомлено це робити по черзі.
mlt

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і це підкаже, чи хочу я зберегти модифікований файл або зберегти його видаленим. Це найшвидший спосіб IMHO, оскільки це одна команда замість кількох у файлі.

Якщо у певному підкаталозі є маса видалених файлів, і ви хочете, щоб усі вони були вирішені шляхом видалення файлів, ви можете зробити це:

yes d | git mergetool -- the/subdirectory

Додано dдля вибору видалення кожного файлу. Ви також mможете зберегти змінений файл. З огляду на підказку, яку ви бачите під час запуску mergetool:

Use (m)odified or (d)eleted file, or (a)bort?

1
@BrianMinton мене теж, інші речі були просто порочним колом
Nate L

2
Це стає дратівливим, коли його багато файлів, чи є спосіб дати одну відповідь для всіх?
ideaman42

2
@ Ideman42 Я оновив свою відповідь, щоб показати рішення щодо пакетного видалення.
void.pointer

1
Я не знав про інструмент злиття. Ти врятував мій день чувак!
Мерт

6

Якщо ви використовуєте Git Gui у Windows,

  1. Відмовитися від злиття
  2. Переконайтеся, що ви перебуваєте у своїй цільовій галузі
  3. Видаліть конфліктуючий файл із провідника
  4. Перегляньте зміни в Git Gui (F5)
  5. Зауважте, що конфліктний файл видалений
  6. Виберіть Етап змінених файлів для фіксації (Ctrl-I) у меню "Комісія"
  7. Введіть коментар до виконання, наприклад "видалений конфліктуючий файл"
  8. Вкласти (ctrl-enter)
  9. Тепер, якщо ви перезапустите злиття, воно (сподіваємось) спрацює.

5
Хлопець просто не любить, як вони поводяться з Git з GUI, напевно. Шлях краще в командному рядку.
Суріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.