Jak naprawić konflikt scalania z powodu usunięcia pliku w oddziale?

208

Mam dialoggałąź i kiedy próbuję połączyć ją z mastergałęzią. Istnieją 2 konflikty. Nie wiem jak to rozwiązać CONFLICT (delete/modify). Czy możesz mi powiedzieć, co mam robić?

$ 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.

Otworzyłem src/DialogAdapter.java, naprawiłem konflikt i zrobiłem git add src/DialogAdapter.java. Co jeszcze muszę zrobić?

BuZZ-dEE
źródło
Możesz przeczytać ten post na Przepełnienie stosu: - Jak naprawić konflikty scalania w Git? Przyjęta odpowiedź odnosi się do instrukcji git .
heavyd

Odpowiedzi:

271

Komunikat o konflikcie:

KONFLIKT (usuwanie / modyfikacja): res / layout / dialog_item.xml usunięty w oknie dialogowym i zmodyfikowany w HEAD

oznacza, że res/layout/dialog_item.xmlzostał usunięty w gałęzi „okna dialogowego”, którą scalasz, ale został zmodyfikowany w HEAD (w gałęzi, do której się scalasz).

Musisz więc zdecydować, czy

  • usuń plik za pomocą „ git rm res/layout/dialog_item.xml

lub

  • zaakceptuj wersję HEAD (być może po edycji) za pomocą „ git add res/layout/dialog_item.xml

Następnie zakończysz scalanie za pomocą „ git commit”.

Zauważ, że git ostrzeże cię, że tworzysz zatwierdzenie scalania w (rzadkim) przypadku, gdy jest to coś, czego nie chcesz. Prawdopodobnie pozostaje z dni, w których wspomniany przypadek był rzadszy.

Jakub Narębski
źródło
22
Próbowałem tego pierwszego ( git rm …), ale rozumiem …: needs mergei rm '…'mam trudności z interpretacją. A jeśli spróbuję zatwierdzić, stackoverflow.com/questions/19985906/… pojawia się ponownie.
Jesse Glick,
17
Nie wspominając o drugiej połowie tego komentarza. Wyjście z Git jest nieco niepokojące, ale wydaje się nieszkodliwe.
Jesse Glick
4
Czy istnieje podejście masowe? Mam pod ręką projekt, który opiera się na rzeczach zewnętrznych, których nie chcę zachować. Tak więc istnieje wiele plików, które zostały zmodyfikowane w górę i chcę usunąć w mojej gałęzi, którą aktualizuję bez względu na wszystko. To nużące robić to jeden po drugim.
mlt
2
@mit: możesz użyć git ls-files --stagei / lub git status --porcelaini / lub git diff-files <something>uzyskać listę zmienionych plików i uruchomić skrypt, aby je usunąć lub zaakceptować swoją lub ich wersję.
Jakub Narębski
1
@Honey: Komunikat CONFLICT zawiera opis, która zmiana była w której gałęzi. Możesz to sprawdzić później za pomocą git statuslub git diff --cc. Jest też git log --merge
coś,
74

Zwykle po prostu uruchamiam git mergetooli wyświetli się monit, czy chcę zachować zmodyfikowany plik, czy go usunąć. Jest to najszybszy sposób IMHO, ponieważ jest to jedno polecenie zamiast kilku na plik.

Jeśli masz kilka usuniętych plików w określonym podkatalogu i chcesz, aby wszystkie zostały rozwiązane przez usunięcie plików, możesz to zrobić:

yes d | git mergetool -- the/subdirectory

dSłuży do wyboru usunięcie każdego pliku. Możesz także użyć mdo zachowania zmodyfikowanego pliku. Zaczerpnięte z monitu wyświetlanego po uruchomieniu mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
źródło
1
@BrianMinton też mnie, inne rzeczy były po prostu błędne koło
Nate L
2
To denerwuje, gdy wiele plików, czy istnieje sposób, aby dać jedną odpowiedź dla wszystkich?
ideasman42
2
@ ideasman42 Zaktualizowałem swoją odpowiedź, aby pokazać rozwiązanie usuwania wsadowego.
void.pointer
1
Tak naprawdę nie wiedziałem o narzędziu do scalania. Uratowałeś mój dzień, stary!
Mert
6

Jeśli używasz Git Gui w systemie Windows,

  1. Przerwij scalanie
  2. Upewnij się, że jesteś w oddziale docelowym
  3. Usuń sprzeczny plik z Eksploratora
  4. Skanuj ponownie w celu zmiany w Git Gui (F5)
  5. Zauważ, że plik powodujący konflikt został usunięty
  6. Z menu Commit wybierz opcję Stage Changed Files To Commit (Ctrl-I)
  7. Wpisz komentarz zatwierdzenia, taki jak „usunięty plik powodujący konflikt”
  8. Zatwierdź (ctrl-enter)
  9. Teraz, jeśli zrestartujesz scalanie, to (miejmy nadzieję) zadziała.
salihcenap
źródło
5
Ten facet chyba nie lubi sposobu, w jaki radzisz sobie z Gitem z GUI. Lepiej jest używać linii poleceń.
Souris,