Git Ersetzen Sie die lokale Version durch die Remote-Version

148

Wie kann ich git anweisen, meine lokale Datei zu ignorieren und die aus meinem Remote-Zweig zu übernehmen, ohne zu versuchen, sie zusammenzuführen und Konflikte zu verursachen?

Ryudice
quelle
1
In der SO-Antwort " git-Befehl zum Erstellen eines Zweigs wie der andere " finden Sie alle derzeit möglichen Simulationsmöglichkeitengit merge -s their .
VonC
Es wäre hilfreich, wenn Sie weitere Details angeben könnten. Möchten Sie den Inhalt aller Dateien aus dem Remote-Zweig oder nur einige der Dateien übernehmen (dh einige lokale Versionen / Änderungen beibehalten)? Haben Sie eine lokale Geschichte, die Sie behalten möchten? (Dies kann wichtig sein, wenn andere Zweige oder Repositorys Ihren lokalen Verlauf bereits enthalten haben.) Wenn Sie Ihren lokalen Verlauf beibehalten möchten, was planen Sie später damit zu tun? (Sie können ein Tag hinterlassen, das auf den lokalen Verlauf verweist, und Ihren Zweig einfach auf das zurücksetzen, was die Fernbedienung hat, oder Sie möchten ihren Zweig zusammenführen.)
Chris Johnsen
1
Es gibt auch einen Thread wie diesen bei der Frage Lokalen Repository-Zweig
zurücksetzen

Antworten:

169

Dies ist die sicherste Lösung:

git stash

Jetzt können Sie tun, was Sie wollen, ohne Angst vor Konflikten zu haben.

Zum Beispiel:

git checkout origin/master

Wenn Sie die Remote-Änderungen in den Hauptzweig aufnehmen möchten, haben Sie folgende Möglichkeiten:

git reset --hard origin/master

Dadurch verzweigen Sie "master" und zeigen auf "origin / master".

Olivier Verdier
quelle
90
Es könnte darauf hingewiesen werden, dass dieser Kopf lösen wird - der Fragesteller mit vielleicht lieber auf dem Zweig bleibengit stash; git fetch origin; git reset --hard origin/master
Mark Longair
10
Ich denke, Mark Longairs Kommentar ist die eigentliche Antwort auf diese Frage
Es war die nützlichste Antwort für mich +1
Andres
Wie komme ich vor dem zurück in den Staat git stash? git stash listist leer.
Leo
Ich möchte dich umarmen
Ugur Kazdal
45

Ich verstehe die Frage folgendermaßen: Sie möchten den Inhalt einer Datei (oder einer Auswahl) von Upstream vollständig ersetzen. Sie möchten den Index nicht direkt beeinflussen (Sie würden also wie gewohnt add + commit ausführen).

Einfach machen

git checkout remote/branch -- a/file b/another/file

Wenn Sie dies für umfangreiche Teilbäume tun möchten und stattdessen den Index direkt beeinflussen möchten, verwenden Sie

git read-tree remote/branch:subdir/

Sie können dann (optional) Ihre Arbeitskopie aktualisieren, indem Sie dies tun

git checkout-index -u --force
sehe sehen
quelle
2
Genau das wollte ich. Vielen Dank.
AutonomousApps
11

Nach meinem Verständnis haben Sie beispielsweise eine Datei, die Sie nur zu Testzwecken aktualisiert haben, fälschlicherweise gespeichert. Wenn Sie dann "git status" ausführen, wird die Datei als "Geändert" angezeigt und Sie sagen einige schlechte Wörter. Sie möchten nur die alte Version zurück und arbeiten normal weiter.

In diesem Szenario können Sie einfach den folgenden Befehl ausführen:

git checkout -- path/filename
Almir Campos
quelle
10

Ich würde die entfernte Datei aus dem "Master" (dem entfernten / Ursprungs-Repository) wie folgt auschecken:

git checkout master <FileWithPath>

Beispiel: git checkout master components / indexTest.html

Birol Efe
quelle
Für mich arbeitete so "git checkout remotes / origin / master <my-file>"
saravanakumar
4

Verwenden Sie die Option -soder in --strategyKombination mit der -XOption. In Ihrer speziellen Frage möchten Sie alle Remote-Dateien behalten und die gleichnamigen lokalen Dateien ersetzen.

Ersetzen Sie Konflikte mit der Remote-Version

git merge -s recursive -Xtheirs upstream/master  

verwendet die Remote-Repo-Version aller in Konflikt stehenden Dateien.

Ersetzen Sie Konflikte mit der lokalen Version

git merge -s recursive -Xours upstream/master

verwendet die lokale Repo-Version aller in Konflikt stehenden Dateien.

csi
quelle