Wie erzwinge ich “git pull”, um lokale Dateien zu überschreiben?
Lesezeit: 8 Minuten
Jakob Troszok
Wie erzwinge ich ein Überschreiben lokaler Dateien auf a git pull?
Das Szenario ist folgendes:
Ein Teammitglied ändert die Vorlagen für eine Website, an der wir arbeiten
Sie fügen einige Bilder zum Bilderverzeichnis hinzu (vergisst aber, sie unter Quellcodeverwaltung hinzuzufügen).
Sie schicken mir die Bilder später per Post
Ich füge die Bilder unter der Quellcodeverwaltung hinzu und schiebe sie zusammen mit anderen Änderungen auf 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: Nicht nachverfolgte Arbeitsbaumdatei ‘public/images/icon.gif’ würde beim Zusammenführen überschrieben
Wie zwinge ich Git, sie zu überschreiben? Die Person ist ein Designer – normalerweise löse ich alle Konflikte von Hand, damit der Server die neueste Version hat, die sie nur auf ihrem Computer aktualisieren müssen.
Jeder, der dies liest und glaubt, er könnte Dateien verlieren, ich war in dieser Position und habe festgestellt, dass der Puffer von Sublime Text mich gerettet hat – wenn ich an etwas arbeite, dann lösche versehentlich alles, indem ich versuche, ein ähnliches Problem wie dieses zu lösen, oder indem ich es verwende Wenn Sie eine Antwort auf diese Frage haben und die Dateien in Sublime geöffnet haben (was sehr wahrscheinlich ist), sind die Dateien immer noch in Sublime vorhanden, entweder nur dort oder im Undo-Verlauf
– Toni Leigh
20. Januar 2016 um 8:51 Uhr
git reset --hard origin/branch_to_overwrite
– Andrew Atkinson
22. März 2016 um 8:37 Uhr
Führen Sie im Grunde nur nach dem anfänglichen Checkout -b einen Pull aus der Entwicklung durch. Erledige deine Arbeit und drücke dich dann wieder hinein.
– ldgorman
22. August 2018 um 9:09 Uhr
Kurze Antwort: Zweig löschen und neu erstellen. 1. Zweig löschen: git branch <branch> -D 2. Auf einen Commit vor dem Konflikt zurücksetzen: git reset <commit> --hard 3. Erstellen Sie den Zweig neu: git branch <branch> 4. Stellen Sie das Tracking auf dem Server ein: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull’
– Nino Filius
24. September 2018 um 8:54 Uhr
Um alle CRLF-Endungen in LF-Endungen zu ändern (start clean) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
– Chloe
17. Januar 2019 um 2:46 Uhr
Travis Reeder
Versuche dies:
git reset --hard HEAD
git pull
Es sollte tun, was Sie wollen.
Ich habe dies getan und einige lokale Dateien, die sich nicht mehr im Repo befanden, blieben auf der Festplatte.
– Piotr Owsiak
8. April 2011 um 16:00 Uhr
Ich glaube nicht, dass das richtig ist. Das obige führt eine Zusammenführung durch und überschreibt nicht, was in der Frage angefordert wurde: “How to force git to overwrite them?” Ich habe die Antwort nicht, ich suche gerade danach “git checkout -b BranchToOverwrite”. Sie haben jetzt den genauen Code von BranchWithCodeToKeep auf dem Zweig BranchToOverwrite, ohne eine Zusammenführung durchführen zu müssen.
– Felbus
13. Juli 2011 um 10:11 Uhr
anstatt mit ‘git pull’ zusammenzuführen, versuchen Sie git fetch –all gefolgt von ‘git reset –hard origin/master’
– Lloyd Moore
21. Februar 2012 um 14:56 Uhr
Ja, die @lloydmoore-Lösung hat bei mir funktioniert. Könnte eher eine Antwort als nur ein Kommentar sein.
– Max Williams
19. November 2012 um 9:54 Uhr
Dadurch werden die aktuellen Änderungen auf den zuletzt abgerufenen Branch-Commit zurückgesetzt. Dann führt git pull die Änderungen aus dem letzten Zweig zusammen. Das hat genau das getan, was ich wollte. Danke!
– Codeversiert
5. Dezember 2014 um 17:42 Uhr
Sie können git clean ein Pfadargument geben, um genauer zu sein und das Löschen von nicht nachverfolgten Dateien zu vermeiden, die nicht in Konflikt stehen.
– Joachim
18. Oktober 2011 um 10:08 Uhr
Ich denke, die Szenariobeschreibung macht deutlich, dass er den Inhalt nicht wirklich wegwerfen will. Vielmehr will er den Idioten davon abhalten, die Dateien zu überschreiben. @Lauri, das hätte dir nicht passieren dürfen. Leider scheinen die Leute die Essenz der Szenariobeschreibung falsch verstanden zu haben – siehe meinen Vorschlag.
– Igel
11. Februar 2012 um 23:05 Uhr
ENDLICH. git clean -f -d ist praktisch, wenn make clean nicht alles säubern kann.
– Erdmelone
23. Juni 2012 um 4:32 Uhr
@crizCraig, es sei denn, sie werden hinzugefügt .gitignore
– Blutende Finger
13. Juni 2013 um 6:58 Uhr
@earthmeLon, dafür möchtest du vielleicht git clean -dfx. Die -x ignoriert .gitignore. Normalerweise befinden sich Ihre Build-Produkte in .gitignore.
– Paul Tucher
12. August 2015 um 18:28 Uhr
Richard Kersey
Wie Hedgehog finde ich die Antworten schrecklich. Aber obwohl die Antwort von Hedgehog besser sein könnte, denke ich nicht, dass sie so elegant ist, wie sie sein könnte. Der Weg, den ich gefunden habe, um dies zu tun, ist die Verwendung von fetch und merge mit definierter Strategie. Dadurch sollten Ihre lokalen Änderungen erhalten bleiben, solange sie nicht zu den Dateien gehören, mit denen Sie ein Überschreiben erzwingen möchten.
Führen Sie zuerst ein Commit Ihrer Änderungen durch
git add *
git commit -a -m "local file server commit message"
Holen Sie dann die Änderungen und überschreiben Sie sie, wenn es einen Konflikt gibt
-X ein Optionsname ist und theirs ist der Wert für diese Option. Sie entscheiden sich für die Verwendung their Änderungen (die andere Option ist ours Änderungen), wenn es einen Konflikt gibt.
Dies ist die beste Antwort, die ich bisher gesehen habe. Ich habe es nicht versucht, aber im Gegensatz zu anderen Antworten versucht dies nicht, alle Ihre nicht verfolgten Dateien zu zerstören, was aus offensichtlichen Gründen sehr gefährlich ist.
– huyz
7. Mai 2012 um 9:36 Uhr
Dito – das hat bei mir funktioniert, als ich eine sehr große Zusammenführung (GitHub-Pull-Anforderung) durchgeführt habe, bei der 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
– quux00
27. Juli 2012 um 1:44 Uhr
Dadurch werden alle Konflikte mit den Repositories-Dateien überschrieben und nicht mit Ihren lokalen, richtig?
– Nathan F.
5. Dezember 2014 um 11:40 Uhr
Beste Antwort. Die höchst akzeptierte Antwort ließ mich in meinem Fall auf distanziertem Kopf zurück. Ich wechselte zurück zum lokalen Master-Zweig und lief git merge -X theirs origin/master
– Petergus
11. März 2016 um 12:46 Uhr
Ich wollte nur, dass der verdammte Idiot alles überschreibt und die Klappe hält. Schließlich verwende ich es nur zwischen meinem Arbeits-PC und einigen Himbeer-Pi-Systemen. Wunsch nach einer Option zum erzwungenen Überschreiben, zumindest für den Projektleiter
Sie müssen nicht alle Remotes und Zweige abrufen, wenn Sie auf den Ursprungs-/Master-Zweig zurücksetzen, richtig?
Dies ist die beste Antwort, die ich bisher gesehen habe. Ich habe es nicht versucht, aber im Gegensatz zu anderen Antworten versucht dies nicht, alle Ihre nicht verfolgten Dateien zu zerstören, was aus offensichtlichen Gründen sehr gefährlich ist.
– huyz
7. Mai 2012 um 9:36 Uhr
Dito – das hat bei mir funktioniert, als ich eine sehr große Zusammenführung (GitHub-Pull-Anforderung) durchgeführt habe, bei der 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
– quux00
27. Juli 2012 um 1:44 Uhr
Dadurch werden alle Konflikte mit den Repositories-Dateien überschrieben und nicht mit Ihren lokalen, richtig?
– Nathan F.
5. Dezember 2014 um 11:40 Uhr
Beste Antwort. Die höchst akzeptierte Antwort ließ mich in meinem Fall auf distanziertem Kopf zurück. Ich wechselte zurück zum lokalen Master-Zweig und lief git merge -X theirs origin/master
– Petergus
11. März 2016 um 12:46 Uhr
Ich wollte nur, dass der verdammte Idiot alles überschreibt und die Klappe hält. Schließlich verwende ich es nur zwischen meinem Arbeits-PC und einigen Himbeer-Pi-Systemen. Wunsch nach einer Option zum erzwungenen Überschreiben, zumindest für den Projektleiter
– Uhrwerk
5. Juni 2019 um 14:39 Uhr
Peter Mortensen
Es sieht so aus, als wäre es am besten, zuerst Folgendes zu tun:
git clean
Löschen Sie alle nicht verfolgten Dateien und fahren Sie dann mit dem Üblichen fort git pull…
Ich habe versucht, “git clean” zu verwenden, um das gleiche Problem zu lösen, aber es hat es nicht gelöst. git status sagt “Ihr Zweig und ‘Ursprung/Master’ sind auseinandergegangen, # und haben jeweils 2 und 9 verschiedene Commits.” und git pull sagt etwas ähnliches wie oben.
– schlau
24. September 2009 um 4:25 Uhr
git clean ist ein ziemlich stumpfes Instrument und könnte viele Dinge wegwerfen, die Sie vielleicht behalten möchten. Es ist besser, die Dateien zu entfernen oder umzubenennen, über die sich Git beschwert, bis der Pull erfolgreich ist.
– Neil Mayhew
2. Juli 2010 um 13:21 Uhr
Ich glaube nicht, dass das generell funktioniert. Gibt es keine Möglichkeit, im Grunde einen Git-Clone-Remote über einen erzwungenen Git-Pull durchzuführen?
Ist git clean die beste Antwort hier? Scheint, als ob das Entfernen von Dateien nicht unbedingt das ist, was das OP will. Sie baten um „ein Überschreiben lokaler Dateien“, nicht um eine Löschung.
– JohnAllen
4. März 2014 um 8:28 Uhr
9868300cookie-checkWie erzwinge ich “git pull”, um lokale Dateien zu überschreiben?yes
Jeder, der dies liest und glaubt, er könnte Dateien verlieren, ich war in dieser Position und habe festgestellt, dass der Puffer von Sublime Text mich gerettet hat – wenn ich an etwas arbeite, dann lösche versehentlich alles, indem ich versuche, ein ähnliches Problem wie dieses zu lösen, oder indem ich es verwende Wenn Sie eine Antwort auf diese Frage haben und die Dateien in Sublime geöffnet haben (was sehr wahrscheinlich ist), sind die Dateien immer noch in Sublime vorhanden, entweder nur dort oder im Undo-Verlauf
– Toni Leigh
20. Januar 2016 um 8:51 Uhr
git reset --hard origin/branch_to_overwrite
– Andrew Atkinson
22. März 2016 um 8:37 Uhr
Führen Sie im Grunde nur nach dem anfänglichen Checkout -b einen Pull aus der Entwicklung durch. Erledige deine Arbeit und drücke dich dann wieder hinein.
– ldgorman
22. August 2018 um 9:09 Uhr
Kurze Antwort: Zweig löschen und neu erstellen. 1. Zweig löschen:
git branch <branch> -D
2. Auf einen Commit vor dem Konflikt zurücksetzen:git reset <commit> --hard
3. Erstellen Sie den Zweig neu:git branch <branch>
4. Stellen Sie das Tracking auf dem Server ein:git --set-upstream-to=origin/<branch> <branch> 5. Pull:
git pull’– Nino Filius
24. September 2018 um 8:54 Uhr
Um alle CRLF-Endungen in LF-Endungen zu ändern (start clean)
git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
– Chloe
17. Januar 2019 um 2:46 Uhr