Git Pull beim Ignorieren lokaler Änderungen?


489

Gibt es eine Möglichkeit, eine git pulllokale Datei zu ignorieren, ohne das Verzeichnis wegzublasen und eine auszuführen git clone?


17
Mit "ignoriert" meinst du "überschreibt"?
Cascabel

@Cascabel Dies bedeutet, alle lokalen Änderungen rückgängig zu machen, alle lokalen Commits aufzuheben, alle lokalen neuen Dateien und Verzeichnisse zu löschen, alle lokal gelöschten Dateien und Verzeichnisse wiederherzustellen usw. Kurz gesagt, führen Sie einfach einen Befehl so aus, als ob rm -rf local_repo && git clone remote_url.
Victor

Antworten:


820

Wenn Sie meinen, dass der Pull lokale Änderungen überschreiben soll, führen Sie die Zusammenführung so aus, als wäre der Arbeitsbaum sauber. Reinigen Sie den Arbeitsbaum:

git reset --hard
git pull

Wenn nicht verfolgte lokale Dateien vorhanden sind, können Sie diese git cleanentfernen. Verwenden Sie git clean -fdiese Option, um nicht verfolgte Dateien -dfzu entfernen, nicht verfolgte Dateien und Verzeichnisse -xdfzu entfernen und nicht verfolgte oder ignorierte Dateien oder Verzeichnisse zu entfernen.

Wenn Sie andererseits die lokalen Änderungen irgendwie beibehalten möchten, verwenden Sie Stash, um sie vor dem Ziehen zu verbergen, und wenden Sie sie anschließend erneut an:

git stash
git pull
git stash pop

Ich halte es jedoch nicht für sinnvoll , die Änderungen buchstäblich zu ignorieren - die Hälfte des Pulls ist das Zusammenführen, und die festgeschriebenen Versionen des Inhalts müssen mit den abgerufenen Versionen zusammengeführt werden.


4
Wenn sich git resetIhre Dateien immer noch von der Fernbedienung unterscheiden, lesen Sie stackoverflow.com/questions/1257592/…
Colonel Panic

3
Git ist das Seltsamste überhaupt. Git Reset - hart gemacht. Dann Git-Status: Ihre Filiale hat 2 Commits Vorsprung.
Shailen

21
@shailenTJ "Lokale Änderungen" bedeutet hier nicht festgeschriebene Änderungen, keine lokalen Festschreibungen. git reset --hardbetrifft das erstere, nicht das letztere. Wenn Sie den Status der Fernbedienung vollständig zurücksetzen möchten, git reset --hard origin/<branch>aber häufig und in diesem Fall sind diese beiden Commits, durch die Sie dem Ursprung voraus sind, Arbeit, die Sie erledigt haben, und nicht etwas, das Sie wegwerfen möchten.
Cascabel

2
Das ist also dasselbe wie das lokale Repository zu zerstören und erneut herunterzuladen, oder? Ich möchte nur in der Lage sein, das Ziehen zu erzwingen und Änderungen der Einfachheit halber zu überschreiben. In 99% der Fälle erhalte ich diese Fehlermeldung, wenn ich versehentlich etwas lokal durcheinander gebracht habe und nur vom Repo aus neu beginnen möchte.
Sudo

Was ist, wenn Sie unmöglich keine lokale Veränderung gegen Kopf haben können? Beispiel: Das Repo wurde in einem Dateisystem erstellt, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, und wird in einem Dateisystem ohne Berücksichtigung von Groß- und Kleinschreibung geklont. Es gibt zwei Dateien mit demselben Namen und unterschiedlichem Gehäuse.
Xster

305

Für mich hat folgendes funktioniert:

(1) Holen Sie zuerst alle Änderungen ab:

$ git fetch --all

(2) Setzen Sie dann den Master zurück:

$ git reset --hard origin/master

(3) Ziehen / Aktualisieren:

$ git pull

22
Hat super für mich funktioniert, als ich viele Probleme mit der Top-Antwort hatte. Vielen Dank!
0x0

6
Dies funktioniert sogar, wenn Sie
Ihre

16
Dies sollte die beste Antwort sein :)
Purus

5
@Marco Servetto: Sie holen zuerst alle Ihre Git-Änderungen ab, wenden sie aber noch nicht an. Anschließend setzen Sie den Master auf den letzten Status zurück (aktualisiert). Wenn Sie den ersten Schritt überspringen, werden die Änderungen am alten Master (lokal) zurückgesetzt. Nach meiner Erfahrung verursacht die Art und Weise, wie ich es beschrieben habe, niemals Probleme. Alle anderen Versuche am Ende.
Artur Barseghyan

1
Dies funktionierte für mich, ich wollte alle meine lokalen Änderungen ignorieren, einschließlich der Wiederherstellung gelöschter Dateien
Neri

28

Sie wollen nur einen Befehl, der genau das gleiche Ergebnis liefert wie rm -rf local_repo && git clone remote_url, oder? Ich möchte auch diese Funktion. Ich frage mich, warum git keinen solchen Befehl (wie git recloneoder git sync) bereitstellt und svn auch keinen solchen Befehl (wie svn recheckoutoder svn sync) bereitstellt .

Versuchen Sie den folgenden Befehl:

git reset --hard origin/master
git clean -fxd
git pull

Das funktioniert wirklich, auch wenn Sie bereits lokale Commits haben, die Sie entfernen möchten.
Yuri Ghensev

5
Warnung Jungs !! git clean -fxdentfernt auch Dateien von .gitignore.
Ramesh Navi

@RameshNavi Sicher. Genau das ist erwünscht. Was gewünscht wird, ist eine schnellere Möglichkeit, es erneut zu klonen, dh das gesamte lokale Repo zu löschen und es dann zu klonen.
Victor

27

Der Befehl unten wird nicht immer funktionieren . Wenn Sie nur:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

und so weiter...

Um wirklich von vorne zu beginnen, die Branche herunterzuladen und alle Ihre lokalen Änderungen zu überschreiben, gehen Sie einfach wie folgt vor:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Dies wird gut funktionieren.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
JA. Dies ist, was ich für einen ultimativen Ansatz brauchte, bei dem ich kein F darüber gebe, was lokal ist. Vielen Dank. :)
Adambean


8

Schauen Sie sich git stash an, um alle Ihre lokalen Änderungen in eine "Stash-Datei" zu kopieren und zum letzten Commit zurückzukehren. An diesem Punkt können Sie Ihre versteckten Änderungen anwenden oder verwerfen.


8

Wenn Sie unter Linux arbeiten:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Die for-Schleife löscht alle verfolgten Dateien, die im lokalen Repo geändert wurden, git pullund funktioniert daher problemlos.
Das Schönste daran ist, dass nur die verfolgten Dateien von den Dateien im Repo überschrieben werden, alle anderen Dateien bleiben unberührt.


Ich denke, Sie meinten "verfolgte Dateien", was genau das ist, was ich brauche, danke.
Ali

Gibt es ein Äquivalent für Powershell?
Earlee

8

Der kürzeste Weg dazu ist:

git pull --rebase --autostash

wusste --autostashvorher nichts , danke!
Shiro

7

das hat bei mir funktioniert

git fetch --all
git reset --hard origin/master
git pull origin master

Mit der akzeptierten Antwort erhalte ich Konfliktfehler


Das ist der Antwort von Artur Barseghyan aus dem Jahr 2015 sehr ähnlich ... aber ich würde immer noch gerne wissen, was der Zweck des 3. Befehls ist: Die Arbeitsdateien haben sich nach dem 2. Befehl geändert, und der 3. Befehl lautet "Bereits aktuell "
Mike Nagetier

Das ist die einzige Kombination, die in meiner Umgebung funktioniert hat. Vielleicht sehen Sie etwas anderes. Für mich brauchte ich die drei Befehle
Pablo Pazos

Interessant. Könnte eine Versionssache sein. Ich bin auf Git 2.7.4. Aber ich habe auch gerade einen neuen Kommentar von Artur Barseghyan gesehen: "Andernfalls könnten Sie an einem versehentlich veralteten Meister arbeiten."
Mike Nagetier

Vielleicht, aber das einzige, was ich sagen kann, ist "das hat bei mir funktioniert, als es keine andere Lösung gab", also könnte es anderen helfen
Pablo Pazos


2

Dadurch wird der aktuelle Zweig abgerufen und versucht, einen schnellen Vorlauf zum Master durchzuführen:

git fetch && git merge --ff-only origin/master

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.