Wie erzwinge ich ein Überschreiben lokaler Dateien auf a git pull
?
Das Szenario ist das folgende:
- Ein Teammitglied ändert die Vorlagen für eine Website, an der wir arbeiten
- Sie fügen einige Bilder zum Bilderverzeichnis hinzu (vergessen jedoch, sie unter Quellcodeverwaltung hinzuzufügen).
- Sie senden mir die Bilder später per Post
- Ich füge die Bilder unter der Quellcodeverwaltung hinzu und schiebe sie zusammen mit anderen Änderungen an GitHub
- Sie können keine Updates von GitHub abrufen, da Git ihre Dateien nicht überschreiben möchte.
Dies ist der Fehler, den ich bekomme:
Fehler: Die nicht verfolgte Arbeitsbaumdatei 'public / images / icon.gif' wird durch Zusammenführen überschrieben
Wie zwinge ich Git, sie zu überschreiben? Die Person ist ein Designer - normalerweise löse ich alle Konflikte von Hand, sodass der Server die neueste Version hat, die sie nur auf ihrem Computer aktualisieren müssen.
git reset --hard origin/branch_to_overwrite
git branch <branch> -D
2. Vor dem Konflikt auf ein Commit zurücksetzen :git reset <commit> --hard
3. Zweig neu erstellen:git branch <branch>
4. Tracking auf den Server setzen:git --set-upstream-to=origin/<branch> <branch> 5. Pull:
git pull`git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Antworten:
Wichtig: Wenn Sie lokale Änderungen haben, gehen diese verloren. Mit oder ohne
--hard
Option gehen alle lokalen Commits verloren, die nicht gepusht wurden. [*]Wenn Sie Dateien haben, die nicht von Git verfolgt werden (z. B. hochgeladene Benutzerinhalte), sind diese Dateien nicht betroffen.
Ich denke das ist der richtige Weg:
Dann haben Sie zwei Möglichkeiten:
ODER Wenn Sie sich in einem anderen Zweig befinden:
Erläuterung:
git fetch
lädt das Neueste von der Fernbedienung herunter, ohne zu versuchen, etwas zusammenzuführen oder neu zu starten.Dann
git reset
setzt der Master-Zweig auf das zurück, was Sie gerade abgerufen haben. Die--hard
Option ändert alle Dateien in Ihrem Arbeitsbaum so, dass sie mit den Dateien in übereinstimmenorigin/master
Behalten Sie die aktuellen lokalen Commits bei
[*] : Es ist erwähnenswert, dass es möglich ist, aktuelle lokale Commits beizubehalten, indem
master
vor dem Zurücksetzen ein Zweig erstellt wird :Danach bleiben alle alten Commits erhalten
new-branch-to-save-current-commits
.Nicht festgeschriebene Änderungen
Nicht festgeschriebene Änderungen (auch inszeniert) gehen jedoch verloren. Stellen Sie sicher, dass Sie alles verstauen und festschreiben, was Sie brauchen. Dazu können Sie Folgendes ausführen:
Und dann, um diese nicht festgeschriebenen Änderungen erneut anzuwenden:
quelle
git reset --hard origin/branch-name
git pull -f
git reflog
, wobei alle Commits aufgelistet werden, auch solche ohne Basis. Bis Sie Ihre lokale Kopie mit bereinigengit gc
, ist alles verlorenVersuche dies:
Es sollte tun, was Sie wollen.
quelle
WARNUNG:
git clean
Löscht alle nicht verfolgten Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden.Manchmal
clean -f
hilft es einfach nicht. Falls Sie DIRECTORIES nicht mehr verfolgt haben, wird auch die Option -d benötigt:WARNUNG:
git clean
Löscht alle nicht verfolgten Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden.Erwägen Sie zuerst die Verwendung des Flags
-n
(--dry-run
). Dies zeigt Ihnen, was gelöscht wird, ohne etwas zu löschen:Beispielausgabe:
quelle
.gitignore
git clean -dfx
. Der-x
ignoriert .gitignore. Normalerweise befinden sich Ihre Build-Produkte in .gitignore.Wie Igel finde ich die Antworten schrecklich. Aber obwohl Hedgehogs Antwort vielleicht besser ist, denke ich nicht, dass es so elegant ist, wie es sein könnte. Die Art und Weise, wie ich dies fand, war die Verwendung von "Abrufen" und "Zusammenführen" mit einer definierten Strategie. Dadurch sollten Ihre lokalen Änderungen erhalten bleiben, solange sie nicht zu den Dateien gehören, mit denen Sie ein Überschreiben erzwingen möchten.
Machen Sie zuerst ein Commit Ihrer Änderungen
Rufen Sie dann die Änderungen ab und überschreiben Sie sie, wenn ein Konflikt vorliegt
"-X" ist ein Optionsname und "ihrer" ist der Wert für diese Option. Sie verwenden "ihre" Änderungen anstelle von "Ihren" Änderungen, wenn ein Konflikt vorliegt.
quelle
get fetch other-repo
; 2)git merge -s recursive -X theirs other-repo/master
git merge -X theirs origin/master
Anstatt zu tun:
Ich würde empfehlen, Folgendes zu tun:
Sie müssen nicht alle Fernbedienungen und Zweige abrufen, wenn Sie auf den Ursprungs- / Hauptzweig zurücksetzen möchten, oder?
quelle
git add .
zuerst, bevorgit reset --hard
Es sieht so aus, als wäre es am besten, zuerst Folgendes zu tun:
Um alle nicht verfolgten Dateien zu löschen und dann mit den üblichen
git pull
...quelle
git fetch origin && git reset --hard origin/master
git clean
die beste Antwort hier? Das Entfernen von Dateien scheint nicht unbedingt das zu sein, was das OP will. Sie baten um "Überschreiben lokaler Dateien", nicht um Löschen.Warnung: Wenn Sie dies tun, werden Ihre Dateien dauerhaft gelöscht, wenn Ihre gitignore-Datei Verzeichnis- / * -Einträge enthält.
Einige Antworten scheinen schrecklich zu sein. Schrecklich im Sinne dessen, was mit @Lauri passiert ist, wenn man dem Vorschlag von David Avsajanishvili folgt.
Eher (git> v1.7.6):
Später können Sie den Stash-Verlauf bereinigen.
Manuell eins nach dem anderen:
Brutal auf einmal:
Natürlich, wenn Sie zu dem zurückkehren möchten, was Sie versteckt haben:
quelle
--include-untracked
einfach nachahmen , indem Siegit add
Ihr gesamtes Repo vorübergehend speichern und es dann sofort verstauen.git stash apply
brachte alle meine nicht verfolgten Dateien mit der Ausnahme (zu Recht) derjenigen zurück, die die Zusammenführung bereits erstellt hatte: "existiert bereits, keine Kasse." Hat perfekt funktioniert.git stash -u
.Dieser Befehl kann hilfreich sein, um lokale Änderungen zu verwerfen:
Führen Sie dann eine Bereinigung durch (entfernt nicht verfolgte Dateien aus dem Arbeitsbaum):
Wenn Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien entfernen möchten:
quelle
git pull
Versuchen Sie Folgendes , anstatt mit zu verschmelzen :git fetch --all
gefolgt von:
git reset --hard origin/master
.quelle
Das einzige, was für mich funktioniert hat, war:
Dies bringt Sie fünf Commits zurück und dann mit
Ich fand das, indem ich nachschaute, wie man eine Git-Zusammenführung rückgängig macht .
quelle
work around
aber wirklich effektiven. Da einige Konflikte nur in wenigen Commits auftreten können, wird durch das Zurücksetzen von 5 Commits sichergestellt, dass keine Konflikte mit Remotecode auftreten.Das Problem bei all diesen Lösungen ist, dass sie entweder alle zu komplex sind oder, ein noch größeres Problem, dass sie alle nicht verfolgten Dateien vom Webserver entfernen, was wir nicht wollen, da immer benötigte Konfigurationsdateien aktiv sind der Server und nicht im Git-Repository.
Hier ist die sauberste Lösung, die wir verwenden:
Der erste Befehl ruft die neuesten Daten ab.
Der zweite Befehl prüft, ob Dateien zum Repository hinzugefügt werden, und löscht die nicht verfolgten Dateien aus dem lokalen Repository, die Konflikte verursachen würden.
Der dritte Befehl checkt alle Dateien aus, die lokal geändert wurden.
Schließlich versuchen wir, auf die neueste Version zu aktualisieren, diesmal jedoch ohne Konflikte, da nicht verfolgte Dateien, die sich im Repo befinden, nicht mehr vorhanden sind und alle lokal geänderten Dateien bereits dieselben wie im Repository sind.
quelle
git merge origin/master
wird schneller und wahrscheinlich noch sicherer. Da, wenn jemand beim Entfernen von Dateien dieses Skripts neue Änderungen vorgenommen hat (was wahrscheinlich nicht möglich, aber möglich ist), kann der gesamte Pull fehlschlagen. Der einzige Grund, den ichpull
dort eingegeben habe, ist, dass möglicherweise nicht jemand am Hauptzweig arbeitet, sondern an einem anderen Zweig, und ich wollte, dass das Skript universell ist..gitignore
.Versuchen Sie zunächst den Standardweg:
Warnung : Die oben genannten Befehle können nur dann zum Verlust von Daten / Dateien führen, wenn Sie sie nicht festgeschrieben haben! Wenn Sie sich nicht sicher sind, erstellen Sie zuerst die Sicherung Ihres gesamten Repository-Ordners.
Dann ziehen Sie es wieder.
Wenn das oben Gesagte nicht hilft und Sie sich nicht um Ihre nicht verfolgten Dateien / Verzeichnisse kümmern (machen Sie zuerst die Sicherung für alle Fälle), versuchen Sie die folgenden einfachen Schritte:
Dadurch werden alle Git-Dateien ENTFERNT (Ausnahmeverzeichnis
.git/
, in dem Sie alle Commits haben) und erneut abgerufen .Warum
git reset HEAD --hard
könnte in einigen Fällen scheitern?Benutzerdefinierte Regeln in
.gitattributes file
Eine
eol=lf
Regel in .gitattributes kann dazu führen, dass git einige Dateiänderungen ändert, indem CRLF-Zeilenenden in einigen Textdateien in LF konvertiert werden.In diesem Fall müssen Sie diese CRLF / LF-Änderungen festschreiben (indem Sie sie überprüfen
git status
) oder versuchengit config core.autcrlf false
, sie vorübergehend zu ignorieren.Inkompatibilität des Dateisystems
Wenn Sie ein Dateisystem verwenden, das keine Berechtigungsattribute unterstützt. Beispiel: Sie haben zwei Repositorys, eines unter Linux / Mac (
ext3
/hfs+
) und eines unter FAT32 / NTFS-basiertem Dateisystem.Wie Sie bemerken, gibt es zwei verschiedene Arten von Dateisystemen, sodass dasjenige, das keine Unix-Berechtigungen unterstützt, die Dateiberechtigungen auf einem System, das diese Art von Berechtigungen nicht unterstützt, grundsätzlich nicht zurücksetzen kann, also egal wie
--hard
Sie es versuchen, git Erkennen Sie immer einige "Änderungen".quelle
Ich hatte das gleiche Problem. Niemand hat mir diese Lösung gegeben, aber sie hat bei mir funktioniert.
Ich habe es gelöst durch:
.git
Verzeichnis.git reset --hard HEAD
git pull
git push
Jetzt funktioniert es.
quelle
Bonus:
Wenn ich in den vorherigen Antworten von Pull / Fetch / Merge spreche, möchte ich einen interessanten und produktiven Trick teilen:
git pull --rebase
Dieser obige Befehl ist der nützlichste Befehl in meinem Git-Leben, der viel Zeit gespart hat.
Versuchen Sie diesen Befehl, bevor Sie Ihr neues Commit auf den Server übertragen. Es synchronisiert automatisch die neuesten Serveränderungen (mit einem Abruf + Zusammenführen) und platziert Ihr Commit oben im Git-Protokoll. Sie müssen sich keine Gedanken über manuelles Ziehen / Zusammenführen machen.
Details finden Sie unter Was macht "git pull --rebase"? .
quelle
git pull -r
.Ich hatte ein ähnliches Problem. Ich musste das machen:
quelle
git clean
mit VorsichtIch habe andere Antworten zusammengefasst. Sie können
git pull
fehlerfrei ausführen :Warnung : Dieses Skript ist sehr leistungsfähig, sodass Sie Ihre Änderungen verlieren können.
quelle
git reset --hard HEAD
überflüssig ist. Meine lokale Manpage (2.6.3) sagt, dassreset
in der zweiten Zeilegit reset --hard origin/master
"standardmäßig HEAD in allen Formen" verwendet wird.Aufgrund meiner eigenen ähnlichen Erfahrungen ist die von Strahinja Kustudic oben angebotene Lösung bei weitem die beste. Wie andere bereits betont haben, werden durch einfaches Zurücksetzen alle Elemente entfernt nicht verfolgten Dateien entfernt, die viele Dinge enthalten können, die Sie nicht entfernen möchten, z. B. Konfigurationsdateien. Was sicherer ist, ist, nur die Dateien zu entfernen, die hinzugefügt werden sollen. In diesem Fall möchten Sie wahrscheinlich auch alle lokal geänderten Dateien auschecken, die aktualisiert werden sollen.
Vor diesem Hintergrund habe ich Kustudics Skript aktualisiert, um genau das zu tun. Ich habe auch einen Tippfehler behoben (ein Fehlen im Original).
quelle
Ich glaube, es gibt zwei mögliche Konfliktursachen, die separat gelöst werden müssen, und soweit ich das beurteilen kann, befasst sich keine der obigen Antworten mit beiden:
Lokale Dateien, die nicht verfolgt werden, müssen entweder manuell (sicherer) oder wie in anderen Antworten vorgeschlagen von gelöscht werden
git clean -f -d
Lokale Commits, die sich nicht in der Remote-Verzweigung befinden, müssen ebenfalls gelöscht werden. IMO ist der einfachste Weg, dies zu erreichen, mit:
git reset --hard origin/master
(Ersetzen Sie 'master' durch den Zweig, an dem Sie arbeiten, und führen Sie einengit fetch origin
ersten aus.)quelle
Ein einfacher Weg wäre:
Dadurch wird Ihre lokale Datei mit der Datei auf Git überschrieben
quelle
Es scheint, dass sich die meisten Antworten hier auf den
master
Zweig konzentrieren; Es gibt jedoch Zeiten, in denen ich an zwei verschiedenen Stellen an demselben Feature-Zweig arbeite und ich möchte, dass sich eine Rebase in einer in der anderen widerspiegelt, ohne dass viel durch die Reifen gesprungen wird.Basierend auf einer Kombination von Antwort der RNA und torek Antwort auf eine ähnliche Frage , ich habe mit diesem kommen , die hervorragend funktioniert:
Führen Sie dies von einem Zweig aus und es wird nur Ihr lokaler Zweig auf die Upstream-Version zurückgesetzt.
Dies kann auch gut in einen Git-Alias (
git forcepull
) eingefügt werden:git config alias.forcepull "!git fetch ; git reset --hard @{u}"
Oder in Ihrer
.gitconfig
Datei:Genießen!
quelle
Ich hatte das gleiche Problem und aus irgendeinem Grund
git clean -f -d
würde es sogar ein nicht tun. Hier ist der Grund: Aus irgendeinem Grund, wenn Ihre Datei von Git ignoriert wird (ich nehme an, über einen .gitignore-Eintrag), stört es immer noch, dies mit einem späteren Pull zu überschreiben , aber eine Bereinigung wird sie nicht entfernen, es sei denn, Sie fügen hinzu-x
.quelle
Ich kenne eine viel einfachere und weniger schmerzhafte Methode:
Das ist es!
quelle
Ich habe das gerade selbst gelöst durch:
Dabei gibt der letzte Befehl eine Liste Ihrer lokalen Änderungen an. Ändern Sie den Zweig "tmp" so lange, bis er akzeptabel ist, und fügen Sie ihn dann wieder auf den Master ein mit:
Für das nächste Mal können Sie dies wahrscheinlich sauberer handhaben, indem Sie nach "git stash branch" suchen, obwohl stash bei den ersten Versuchen wahrscheinlich Probleme verursacht. Experimentieren Sie also zuerst mit einem unkritischen Projekt ...
quelle
Ich habe eine seltsame Situation, die weder funktioniert
git clean
nochgit reset
funktioniert. Ich muss die widersprüchliche Datei entfernen,git index
indem ich für jede nicht verfolgte Datei das folgende Skript verwende:Dann kann ich ganz gut ziehen.
quelle
git fetch --all && git reset --hard origin/master && git pull
quelle
Trotz der ursprünglichen Frage können die häufigsten Antworten Probleme für Personen verursachen, die ein ähnliches Problem haben, aber ihre lokalen Dateien nicht verlieren möchten. Siehe zum Beispiel die Kommentare von Al-Punk und crizCraig.
In der folgenden Version werden Ihre lokalen Änderungen in einen temporären Zweig (
tmp
) übernommen, der ursprüngliche Zweig (von dem ich annehmemaster
) ausgecheckt und die Aktualisierungen zusammengeführt. Sie könnten dies mit tunstash
, aber ich habe festgestellt, dass es normalerweise einfacher ist, einfach den Branch / Merge-Ansatz zu verwenden.wo wir das übernehmen andere Repository ist
origin master
.quelle
Diese vier Befehle funktionieren für mich.
Zum Überprüfen / Ziehen nach Ausführung dieser Befehle
Ich habe viel versucht, aber schließlich Erfolg mit diesen Befehlen.
quelle
Mach einfach
So vermeiden Sie alle unerwünschten Nebenwirkungen wie das Löschen von Dateien oder Verzeichnissen, die Sie behalten möchten usw.
quelle
Setzen Sie den Index und den Kopf auf zurück
origin/master
, aber setzen Sie den Arbeitsbaum nicht zurück:quelle
Bedarf:
Lösung:
Fetch mit einem sauberen von Dateien und Verzeichnissen zu ignorieren .gitignore und Hard - Reset auf Herkunft .
quelle