Wie behalte ich die lokale Datei oder die entfernte Datei während des Zusammenführens mit Git und der Befehlszeile?


194

Ich weiß, wie man Änderungen mit vimdiff zusammenführt, aber wenn ich nur weiß, dass die gesamte Datei gut zu behalten oder wegzuwerfen ist, wie mache ich das?

Ich möchte nicht für jeden von ihnen vimdiff öffnen, ich möchte einen Befehl ändern, der "Lokal halten" oder "Remote halten" sagt.

EG: Ich habe eine Zusammenführung mit Dateien erhalten, die als geändert markiert sind, weil jemand sie unter Windows geöffnet, die EOL geändert und dann festgeschrieben hat. Beim Zusammenführen möchte ich nur meine eigene Version behalten und seine verwerfen.

Das Gegenteil interessiert mich auch: Ich habe es sehr vermasselt und möchte die Remote-Datei akzeptieren und meine Änderungen verwerfen.

Antworten:


308

Sie können auch tun:

git checkout --theirs /path/to/file

um die entfernte Datei zu behalten, und:

git checkout --ours /path/to/file

lokale Datei zu behalten.

Dann sind git addsie und alles erledigt.

Edition: Beachten Sie, dass dies für ein mergeSzenario gilt. Während a rebase --theirsbezieht sich auf den Zweig, in dem Sie gearbeitet haben.


4
Ich habe das getan ... aber nichts passiert ... woher weiß ich, dass es die richtige Datei nimmt? Ich benutze, git version 1.8.4wenn das wichtig ist.
Rosdi Kasim

3
warum das umgekehrte Wort verwenden? Ich nehme an, "ihre" wäre eine entfernte Datei und "unsere" wäre meine Datei
phuclv

1
So ist es, @ LưuVĩnhPhúc
Warten auf Dev ...

7
nein, ihre Bedeutungen sind umgekehrt stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 ihre wären meine Dateien und unsere sind die Dateien in der Gegenstelle
phuclv

6
"Einfach", ja. Intuitiv? Nr.
Wilbur Whateley

107

Dieser Ansatz scheint einfacher zu sein, da nicht jede Datei einzeln ausgewählt werden muss:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

oder

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Direkt kopiert von: Lösen Sie Git-Zusammenführungskonflikte zugunsten ihrer Änderungen während eines Pulls


3
Ich liebe diesen. Insbesondere, wenn mehr als eine Datei vorhanden ist.
Tek

Die Frage betraf zwei verschiedene Befehle, aber es gibt keine Beschreibung, was diese beiden tun. Was macht jede Zeile?
Alex

Ich habe mindestens fünf Stackoverflow-Antworten durchgesehen, bevor ich diese gefunden habe, was ich wollte. Vielen Dank.
Bolton Bailey

14

git checkout {branch-name} -- {file-name}

Dadurch wird die Datei aus dem Zweig Ihrer Wahl verwendet.

Ich mag das, weil posh-gitAutocomplete damit großartig funktioniert. Außerdem werden Unklarheiten darüber beseitigt, welcher Zweig entfernt und welcher lokal ist. Und --theirshat sowieso nicht für mich gearbeitet.


Keine Mehrdeutigkeit, funktioniert sowohl für {meine} als auch für {ihre} und unterstützt das Hinzufügen ganzer Verzeichnisse. Dies sollte die akzeptierte Antwort sein.
Dotancohen

9

Informationen zum Zeilenende finden Sie unter man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Stellen Sie sicher, dass Sie autocrlf = falseund / oder safecrlf = falsezum Windows-Klon (.git / config) hinzufügen.

Git Mergetool verwenden

Wenn Sie ein Mergetool wie folgt konfigurieren:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Dann eine einfache

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Wird den Job machen

Verwenden einfacher Git-Befehle

In anderen Fällen nehme ich an

git checkout HEAD -- path/to/myfile.txt

sollte den Trick machen

Bearbeiten , um das Gegenteil zu tun (weil Sie es vermasselt haben):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 für die Tipps, aber nicht akzeptiert, aber es ist nicht das, wonach ich gefragt habe. Ich möchte etwas, das in allen Fällen funktioniert, nicht nur in den Beispielfällen. Außerdem funktioniert "git checkout remote / branch_to_merge - path / to / myfile.txt" nicht, wenn Sie die Zusammenführung bereits gestartet haben: Es wird angezeigt, dass Sie sich mitten in einer Zusammenführung befinden, und dies wird Sie daran hindern.
E-Satis

1
@ e-satis: das ist überraschend. Ich würde das als Fehler betrachten, da das Auschecken mit einem Pfad kein reguläres Auschecken ist (und HEAD nicht beeinflusst). Ich werde es jetzt ausprobieren, weil ich es nicht glauben kann
siehe

1
@ e-satis: Soooo ... ich hatte recht; git checkout remote/branch_to_merge -- path/to/myfile.txtfunktioniert wie ein Zauber, während ein Zusammenführungskonflikt gelöst wird. (git 1.7.1)
sehe

1
Es wurde eine Lösung hinzugefügt, die jetzt auf Git Mergetool basiert
siehe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.