Lösen eines Zusammenschlusskonflikts "beide hinzugefügt" in Git?

138

Ich base in git neu, und ein Konflikt, den ich bekomme, ist "beides hinzugefügt" - das heißt, genau der gleiche Dateiname wurde unabhängig in meinem Zweig und in dem Zweig, auf dem ich neu basiert, hinzugefügt. git statussagt mir:

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

Meine Frage ist, wie löse ich das? Muss ich ein Zusammenführungstool verwenden oder gibt es eine Möglichkeit, dies nur über die Befehlszeile zu tun? Wenn ja git rm src/MyFile.cs, woher weiß Git, welche Dateiversion ich entfernen und welche behalten möchte?

Jez
quelle

Antworten:

139

Wenn Sie git rmgit verwenden, werden alle Versionen dieses Pfads aus dem Index entfernt, sodass Sie bei Ihrer Auflösungsaktion keine der beiden Versionen mehr haben.

Sie können verwenden git checkout --ours src/MyFile.cs, um die Version aus dem Zweig auszuwählen, auf den Sie neu gründen, oder git checkout --theirs src/MyFile.csum die Version aus dem Zweig auszuwählen, auf den Sie neu gründen.

Wenn Sie eine Mischung wünschen, müssen Sie ein Zusammenführungswerkzeug verwenden oder es manuell bearbeiten.

CB Bailey
quelle
1
Vielen Dank. Und ich habe gerade festgestellt, dass der Grund, warum das Zusammenführungstool nicht funktioniert, darin besteht, dass git die Dateien .LOCAL und .REMOTE für die Zusammenführung erstellt, nicht jedoch die Datei .BASE. Ich denke, es sollte nur eine leere .BASE-Datei erstellen. Wenn Sie die leere .BASE-Datei manuell erstellen, funktioniert das Zusammenführungstool einwandfrei.
Jez
1
@Jez: Bitte sehen Sie diesen Thread: thread.gmane.org/gmane.comp.version-control.git/188776/…
CB Bailey
1
Wollen Sie damit sagen, dass dies in einer neueren Version von git behoben wird?
Jez
1
@Jez: Es ist in Git-Versionen> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey
21
Von @Tom antwortet: Wenn git checkout --ours someFile Sie ... Es scheint, als hätte es beim Git-Status nichts getan. Denken Sie daran, dies später zu tun. git add someFile git status
Pec
72

Ich finde es manchmal verwirrend, die Optionen --theirsund --ourszu verwenden, um festzustellen, woher die Datei kommt. Die meiste Zeit wird meine in der Filiale sein, auf die ich mich neu beziehe, worauf von Bezug genommen wird --theirs!

Sie können auch verwenden git checkout <tree-ish> -- src/MyFile.cs

Wobei das <tree-ish>entweder durch den Filialnamen oder die Commit-ID ersetzt werden kann, die die Datei enthält, die Sie behalten möchten.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

Anas Alkhatib
quelle
42

Wenn Sie ...

git checkout --ours someFile

Es scheint, als hätte es beim Git-Status nichts getan.

Denken Sie daran, dies später zu tun.

git add someFile
git status
Tom
quelle