9778 Stimmen

Wie zwinge ich "git pull" dazu, lokale Dateien zu überschreiben?

Wie erzwinge ich das Überschreiben von lokalen Dateien auf einer git pull ?

Das Szenario sieht folgendermaßen aus:

  • Ein Teammitglied ändert die Vorlagen für eine Website, an der wir gerade arbeiten
  • Sie fügen einige Bilder in das Verzeichnis images ein (vergessen aber, sie unter der Versionskontrolle hinzuzufügen)
  • Sie schicken mir die Bilder später per Post zu.
  • Ich füge die Bilder unter der Versionskontrolle hinzu und schiebe sie zusammen mit anderen Änderungen auf GitHub
  • Sie können keine Aktualisierungen von GitHub beziehen, weil Git ihre Dateien nicht überschreiben will.

Ich erhalte folgende Fehlermeldung:

Fehler: Die nicht verfolgte Arbeitsbaumdatei 'public/images/icon.gif' würde beim Zusammenführen überschrieben werden

Wie kann ich Git zwingen, sie zu überschreiben? Die Person ist ein Designer - normalerweise löse ich alle Konflikte von Hand, so dass der Server die neueste Version hat, die er nur noch auf seinem Computer aktualisieren muss.

349 Stimmen

git reset --hard origin/branch_to_overwrite

54 Stimmen

Jeder, der dies liest und denkt, dass er Dateien verlieren könnte, ich war in dieser Position und fand, dass der Puffer von Sublime Text mich gerettet hat - wenn ich an etwas arbeite, dann versehentlich alles lösche, indem ich versuche, ein ähnliches Problem wie dieses zu lösen oder indem ich eine Antwort auf diese Frage benutze und die Dateien in Sublime geöffnet hatte (was eine gute Chance ist), dann sind die Dateien immer noch in Sublime, entweder gerade dort oder in der Undo-Historie

6 Stimmen

Im Grunde genommen sollten Sie nur nach dem ersten Checkout einen Pull aus der Entwicklung durchführen -b. machen Sie Ihre Arbeit und pushen Sie dann wieder zurück.

13397voto

RNA Punkte 136061

Wichtig: Lokale Änderungen gehen verloren (sofern sie nachverfolgt werden). Außerdem, mit oder ohne --hard werden alle lokalen Commits, die noch nicht gepusht wurden, verloren gehen. [*]

Wenn Sie irgendwelche Dateien haben, die no von Git verfolgt werden (z. B. hochgeladene Benutzerinhalte), werden diese Dateien nicht betroffen sein.


Führen Sie zunächst einen Fetch aus, um alle origin/<branch> Verweise auf das Neueste:

git fetch --all

Sichern Sie Ihren aktuellen Zweig:

git branch backup-master

Dann haben Sie zwei Möglichkeiten:

git reset --hard origin/master

ODER Wenn Sie in einer anderen Niederlassung sind:

git reset --hard origin/<branch_name>

Erläuterung:

git fetch lädt die neueste Version aus der Ferne herunter, ohne zu versuchen, irgendetwas zusammenzuführen oder zu rebasen.

Dann wird die git reset setzt den Master-Zweig auf das zurück, was Sie gerade geholt haben. Die --hard ändert alle Dateien in Ihrem Arbeitsbaum so, dass sie mit den Dateien in origin/master


Aktuelle lokale Übertragungen beibehalten

[*] : Es ist erwähnenswert, dass es möglich ist, aktuelle lokale Commits beizubehalten, indem man einen Branch von master vor dem Zurücksetzen:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Danach werden alle alten Commits in new-branch-to-save-current-commits .

Unverbindliche Änderungen

Unbestätigte Änderungen (auch in der Phase) gehen jedoch verloren. Vergewissern Sie sich, dass Sie alles, was Sie brauchen, zwischenlagern und übertragen. Dazu können Sie das Folgende ausführen:

git stash

Und dann, um diese nicht gebundenen Änderungen wieder zu übernehmen:

git stash pop

2 Stimmen

Beachten Sie, dass Sie den Namen der Verzweigung abkürzen können durch @{u} die viel kürzer ist.

0 Stimmen

@GershomMaes git clean -dfx nach einem Hard-Reset, wie oben erwähnt von IceGlow ?

0 Stimmen

Ist es nicht einfacher, rm -rf /Ordner und git clone erneut auszuführen, wenn man alle lokalen Änderungen verwerfen möchte?

1448voto

Travis Reeder Punkte 34348

Versuchen Sie dies:

git reset --hard HEAD
git pull

Es sollte tun, was Sie wollen.

35 Stimmen

Ich habe dies getan und einige lokale Dateien, die nicht mehr im Projektarchiv waren, wurden auf der Festplatte belassen.

46 Stimmen

Ich glaube nicht, dass dies korrekt ist. die oben wird eine Zusammenführung, nicht überschreiben, die in der Frage angefordert wurde, durchzuführen: "Wie kann man Git zwingen, sie zu überschreiben?" Im Moment wechsle ich zu dem Zweig mit dem Code, den ich behalten möchte, indem ich "git checkout BranchWithCodeToKeep" ausführe, dann "git branch -D BranchToOverwrite" und dann schließlich "git checkout -b BranchToOverwrite".

318 Stimmen

Statt mit "git pull" zusammenzuführen, versuchen Sie "git fetch --all" gefolgt von "git reset --hard origin/master".

611voto

WARNUNG: git clean löscht alle Ihre nicht verfolgten Dateien/Verzeichnisse und kann nicht rückgängig gemacht werden.


Manchmal nur clean -f ist nicht hilfreich. Falls Sie nicht verfolgte DIRECTORIES haben, ist die Option -d ebenfalls erforderlich:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

WARNUNG: git clean löscht alle Ihre nicht verfolgten Dateien/Verzeichnisse und kann nicht rückgängig gemacht werden.

Erwägen Sie die Verwendung von -n ( --dry-run ) Flagge zuerst. Dadurch wird Ihnen angezeigt, was gelöscht wird, ohne dass tatsächlich etwas gelöscht wird:

git clean -n -f -d

Beispielhafte Ausgabe:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

4 Stimmen

Sie können git clean ein Pfadargument geben, um spezifischer zu sein und zu vermeiden, dass nicht verfolgte Dateien gelöscht werden, die nicht in Konflikt stehen.

8 Stimmen

Ich denke, die Beschreibung des Szenarios macht deutlich, dass er den Inhalt nicht wirklich wegwerfen will. Vielmehr möchte er verhindern, dass Git die Dateien überschreibt. @Lauri, das hätte dir nicht passieren dürfen. Leider scheinen die Leute das Wesen der Szenariobeschreibung falsch verstanden zu haben - siehe meinen Vorschlag.

27 Stimmen

ENDLICH . git clean -f -d ist praktisch, wenn make clean nicht alles bereinigt.

501voto

Richard Kersey Punkte 5100

Wie Hedgehog finde ich die Antworten schrecklich. Aber obwohl die Antwort von Hedgehog besser sein könnte, halte ich sie nicht für so elegant, wie sie sein könnte. Der Weg, den ich gefunden habe, um dies zu tun, ist die Verwendung von fetch y merge mit einer festgelegten Strategie. Diese sollte dafür sorgen, dass Ihre lokalen Änderungen erhalten bleiben, solange sie nicht zu den Dateien gehören, deren Überschreibung Sie erzwingen wollen.

Führen Sie zunächst eine Übertragung Ihrer Änderungen durch

 git add *
 git commit -a -m "local file server commit message"

Holen Sie dann die Änderungen und überschreiben Sie sie, falls es einen Konflikt gibt

 git fetch origin master
 git merge -s recursive -X theirs origin/master

-X ist ein Optionsname, und theirs ist der Wert für diese Option. Sie entscheiden sich für die Verwendung von their Änderungen (die andere Option ist ours Änderungen), wenn es einen Konflikt gibt.

79 Stimmen

Das ist die beste Antwort, die ich bis jetzt gesehen habe. Ich habe es noch nicht ausprobiert, aber im Gegensatz zu anderen Antworten wird nicht versucht, alle Ihre nicht verfolgten Dateien zu vernichten, was aus offensichtlichen Gründen sehr gefährlich ist.

9 Stimmen

Dito - das hat bei mir funktioniert, als ich einen sehr großen Merge (GitHub Pull Request) gemacht habe, bei dem ich einfach alles zusätzlich zu dem, was ich hatte, akzeptieren wollte. Gute Antwort! In meinem Fall waren die letzten beiden Befehle: 1) get fetch other-repo ; 2) git merge -s recursive -X theirs other-repo/master

5 Stimmen

Dadurch werden alle Konflikte mit den Dateien des Repositorys überschrieben und nicht mit Ihren lokalen Dateien, richtig?

441voto

Johanneke Punkte 4811

Anstatt zu tun:

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

Ich würde Folgendes empfehlen:

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

Es ist nicht nötig, alle Remotes und Zweige zu holen, wenn Sie auf den Ursprungszweig/Masterzweig zurückgesetzt werden, richtig?

5 Stimmen

Ihre Antwort ist genau das, was Sie für Ihren Vertreter brauchen. Ich muss fragen, ob damit auch alle nicht verfolgten Dateien entfernt werden?

7 Stimmen

Ja, der größte Teil meines Rufs kommt von hier :) Damit werden auch alle nicht verfolgten Dateien entfernt. Etwas, das ich vergessen hatte und an das ich erst vor 2 Tagen schmerzlich erinnert wurde...

2 Stimmen

Siehe die Kommentare zu dieser anderen Antwort: stackoverflow.com/a/8888015/2151700

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X