Frage Wie erzwinge ich "git pull", um lokale Dateien zu überschreiben?


Wie erzwinge ich ein Überschreiben von lokalen Dateien auf einem git pull?

Das Szenario folgt:

  • Ein Teammitglied ändert die Vorlagen für eine Website, an der wir gerade arbeiten
  • Sie fügen dem Bilderverzeichnis einige Bilder hinzu (vergisst aber, sie unter Quellcodeverwaltung hinzuzufügen)
  • Sie senden die Bilder später per Post an mich
  • Ich füge die Bilder unter der Quellcodeverwaltung hinzu und drücke sie zusammen mit anderen Änderungen zu GitHub
  • Sie können keine Updates von GitHub abrufen, da Git ihre Dateien nicht überschreiben möchte.

Dies ist der Fehler, den ich bekomme:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

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


5198
2017-07-14 14:58


Ursprung


Antworten:


Wichtig: Wenn Sie lokale Änderungen haben, gehen diese verloren. Mit oder ohne --hard Option, alle lokalen Commits, die nicht gepusht wurden, gehen verloren.[*]

Wenn Sie Dateien haben, die das sind nicht Diese Dateien sind von Git nicht betroffen (z. B. hochgeladene Benutzerinhalte).


Ich denke, das ist der richtige Weg:

git fetch --all

Dann haben Sie zwei Möglichkeiten:

git reset --hard origin/master

ODER wenn Sie in einer anderen Branche sind:

git reset --hard origin/<branch_name>

Erläuterung:

git fetch lädt das Neueste von Remote herunter, ohne zu versuchen, etwas zusammenzuführen oder neu zu erstellen.

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


Pflegen Sie die aktuellen lokalen Commits

[*]: Es ist erwähnenswert, dass es möglich ist, aktuelle lokale Commits beizubehalten, indem Sie eine Verzweigung von erstellen 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 beibehalten new-branch-to-save-current-commits.

Nicht festgeschriebene Änderungen

Nicht festgeschriebene Änderungen gehen jedoch verloren (sogar inszeniert). Stellen Sie sicher, dass Sie alles, was Sie benötigen, speichern und festlegen. Dafür können Sie Folgendes ausführen:

git stash

Und dann, um diese nicht festgeschriebenen Änderungen erneut anzuwenden:

git stash pop

7275
2018-01-17 00:02



Versuche dies:

git reset --hard HEAD
git pull

Es sollte tun, was Sie wollen.


761
2018-05-09 19:45



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


Manchmal einfach clean -f hilft nicht. Falls Sie nicht geordnete VERZEICHNISSE haben, wird auch die Option -d benötigt:

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

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


381
2018-03-19 09:10



Wie Hedgehog finde ich die Antworten schrecklich. Aber obwohl Hedgehogs Antwort vielleicht besser ist, glaube ich nicht, dass es so elegant ist, wie es sein könnte. Die Art, wie ich dies gefunden habe, besteht darin, "fetch" und "merge" mit einer definierten Strategie zu verwenden. Das sollte es so machen, dass Ihre lokalen Änderungen beibehalten werden, solange sie nicht zu den Dateien gehören, mit denen Sie ein Überschreiben erzwingen wollen.

Mach zuerst deine Änderungen fest

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

Holen Sie dann die Änderungen und überschreiben Sie, wenn ein Konflikt vorliegt

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

"-X" ist ein Optionsname und "ihr" ist der Wert für diese Option. Sie wählen "ihre" Änderungen anstelle von "Ihren" Änderungen, wenn ein Konflikt vorliegt.


334
2018-04-11 20:13



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

Keine Notwendigkeit, alle Fernbedienungen und Zweige zu holen, wenn Sie auf den Ursprung / Hauptverzweigung rechts setzen werden?


237
2018-04-26 13:48



Es sieht so aus, als ob der beste Weg zuerst ist:

git clean

Um alle nicht geordneten Dateien zu löschen, fahren Sie mit dem üblichen fort git pull...


121
2017-07-14 15:16



Achtung, dabei werden Ihre Dateien endgültig gelöscht, wenn Sie in Ihrer Gitignore-Datei irgendwelche Verzeichnisse / * Einträge haben.

Einige Antworten scheinen schrecklich zu sein. Schrecklich in dem Sinne, was passiert ist, @Lauri durch die Befolgung von David Avsajanishvili Vorschlag.

Eher (git> v1.7.6):

git stash --include-untracked
git pull

Später können Sie die Vorgeschichte löschen.

Manuell, eins nach dem anderen:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutal, alles auf einmal:

$ git stash clear

Natürlich, wenn du zu dem zurückkehren willst, was du versteckt hast:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Sie können diesen Befehl hilfreich finden, um lokale Änderungen wegzuwerfen:

git checkout <your-branch> -f

Führen Sie anschließend eine Bereinigung durch (entfernt nicht verfolgte Dateien aus dem Arbeitsbaum):

git clean -f

Wenn Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien entfernen möchten:

git clean -fd

86
2017-08-05 18:06



Anstatt mit zu verschmelzen git pull, Versuche dies:

git fetch --all

gefolgt von:

git reset --hard origin/master.


72
2017-11-22 10:56