Wie behebe ich einen Zusammenführungskonflikt aufgrund des Entfernens einer Datei in einem Zweig?

207

Ich habe einen dialogZweig erstellt und wenn ich versuche, ihn zum masterZweig zusammenzuführen. Es gibt 2 Konflikte. Ich weiß nicht, wie ich es lösen soll CONFLICT (delete/modify). Können Sie mir bitte sagen, was ich tun soll?

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

Ich habe geöffnet src/DialogAdapter.java, den Konflikt behoben und a git add src/DialogAdapter.java. Was muss ich noch tun?

BuZZ-dEE
quelle
Sie können diesen Beitrag über Stapelüberlauf lesen: - Wie behebe ich Zusammenführungskonflikte in Git? Die akzeptierte Antwort verweist auf das Git-Handbuch .
Heavyyd

Antworten:

270

Die Konfliktmeldung:

KONFLIKT (löschen / ändern): res / layout / dialog_item.xml im Dialog gelöscht und in HEAD geändert

bedeutet, dass dies res/layout/dialog_item.xmlin dem 'Dialog'-Zweig, den Sie zusammenführen, gelöscht, aber in HEAD (in dem Zweig, in den Sie zusammenführen) geändert wurde.

Sie müssen sich also entscheiden, ob

  • Datei mit " git rm res/layout/dialog_item.xml" entfernen

oder

  • Akzeptiere die Version von HEAD (möglicherweise nach dem Bearbeiten) mit " git add res/layout/dialog_item.xml"

Dann schließen Sie die Zusammenführung mit " git commit" ab.

Beachten Sie, dass git Sie warnt, dass Sie ein Zusammenführungs-Commit erstellen, in dem (seltenen) Fall, in dem Sie dies nicht möchten. Vermutlich Überreste aus den Tagen, als dieser Fall weniger selten war.

Jakub Narębski
quelle
21
Versuchte das erstere ( git rm …), aber ich bekomme …: needs mergeund rm '…'was ich schwer zu interpretieren habe. Und wenn ich dann versuche, ein Commit durchzuführen , wird stackoverflow.com/questions/19985906/… erneut angezeigt .
Jesse Glick
17
Die zweite Hälfte dieses Kommentars spielt keine Rolle. Die Ausgabe von Git ist etwas alarmierend, scheint aber harmlos zu sein.
Jesse Glick
4
Gibt es einen Massenansatz? Ich habe ein Projekt zur Hand, das sich auf externe Dinge stützt, die ich nicht behalten möchte. Es gibt also viele Dateien, die im Upstream geändert wurden, und ich möchte in meinem Zweig löschen, dass ich auf jeden Fall eine neue Basis habe. Es ist mühsam, es eins nach dem anderen zu tun.
Mlt
2
@mit: Sie können git ls-files --stageund / oder git status --porcelainund / oder verwenden git diff-files <something>, um die Liste der geänderten Dateien abzurufen und ein Skript zu erstellen, um sie zu löschen oder Ihre oder ihre Version zu akzeptieren.
Jakub Narębski
1
@Honey: Die CONFLICT-Nachricht enthält eine Beschreibung, welche Änderung in welchem ​​Zweig vorgenommen wurde. Sie können es später mit git statusoder überprüfen git diff --cc. Es gibt auch git log --mergewas helfen kann ...
Jakub Narębski
74

Normalerweise git mergetoolstarte ich nur und es wird mich gefragt, ob ich die geänderte Datei behalten oder gelöscht halten möchte. Dies ist meiner Meinung nach der schnellste Weg, da es sich um einen Befehl anstelle mehrerer Befehle pro Datei handelt.

Wenn Sie eine Reihe gelöschter Dateien in einem bestimmten Unterverzeichnis haben und möchten, dass alle durch Löschen der Dateien aufgelöst werden, können Sie Folgendes tun:

yes d | git mergetool -- the/subdirectory

Mit können Sie dauswählen, ob jede Datei gelöscht werden soll. Sie können mdie geänderte Datei auch behalten. Entnommen aus der Eingabeaufforderung, die Sie beim Ausführen sehen mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
quelle
1
@ BrianMinton mich auch, das andere Zeug war nur ein Teufelskreis
Nate L
2
Das wird ärgerlich, wenn es viele Dateien gibt. Gibt es eine Möglichkeit, eine Antwort für alle zu geben?
ideasman42
2
@ ideasman42 Ich habe meine Antwort aktualisiert, um eine Batch-Löschlösung anzuzeigen.
void.pointer
1
Ich wusste nicht wirklich über das Merge-Tool Bescheid. Du hast meinen Tag gerettet, Alter!
Mert
6

Wenn Sie Git Gui unter Windows verwenden,

  1. Brechen Sie die Zusammenführung ab
  2. Stellen Sie sicher, dass Sie sich in Ihrem Zielzweig befinden
  3. Löschen Sie die widersprüchliche Datei aus dem Explorer
  4. Erneut nach Änderungen in Git Gui suchen (F5)
  5. Beachten Sie, dass widersprüchliche Dateien gelöscht werden
  6. Wählen Sie im Menü Festschreiben die Option Zu ändernde zu ändernde Dateien ändern (Strg-I)
  7. Geben Sie einen Festschreibungskommentar wie "gelöschte Konfliktdatei" ein.
  8. Commit (Strg-Enter)
  9. Wenn Sie nun die Zusammenführung neu starten, funktioniert sie (hoffentlich).
salihcenap
quelle
5
Der Typ mag es einfach nicht, wie man mit Git mit GUI umgeht, wahrscheinlich. Ein Befehlszeilenweg ist besser.
Souris