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?

Markdorison
quelle
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.

Cascabel
quelle
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
Artur Barseghyan
quelle
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
Sieger
quelle
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'
Dr. Beco
quelle
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
10
git fetch --all && git reset --hard origin/master
Luca C.
quelle
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.

Seth Johnson
quelle
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.

Strahinja Kustudic
quelle
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
Gil
quelle
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

Pablo Pazos
quelle
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
3

Normalerweise mache ich:

git checkout .
git pull

Im Stammordner des Projekts.

Cassiano Franco
quelle
2

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

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