Wie kann man git pull lokale Dateien überschreiben?

Wie kann man lokale Dateien in git pull zwangsweise überschreiben?

Das Skript lautet wie folgt:

  • Teammitglied ändert Vorlagen für die Site, an der wir arbeiten
  • Sie fügen dem Bilderkatalog einige Bilder hinzu (vergessen Sie jedoch nicht, sie unter der Kontrolle des Quellcodes zu installieren.)
  • Sie senden mir Bilder per Post, später
  • Ich füge Bilder unter der Kontrolle des Quellcodes hinzu und bringe sie zusammen mit anderen Änderungen in GitHub ein.
  • Sie können keine Updates von GitHub erhalten, da Git ihre Dateien nicht überschreiben möchte.

Dies ist der Fehler, den ich bekomme:

Fehler: Die untracked Working Tree-Datei 'public / images / icon.gif' wird beim Zusammenführen überschrieben

Wie kann man Git dazu bringen, sie zu überschreiben? Diese Person ist Designerin. Ich löse normalerweise alle Konflikte manuell, so dass die neueste Version auf dem Server installiert ist, die sie nur auf ihrem Computer aktualisieren müssen.

5705
14 июля '09 в 17:58 2009-07-14 17:58 Gefragt von Jakub Troszok am 14. Juli 09 um 17:58 2009-07-14 17:58
@ 39 Antworten
  • 1
  • 2

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

Wenn Sie Dateien haben, die nicht von Git verfolgt werden (z. B. heruntergeladene Benutzerinhalte), sind diese Dateien nicht betroffen.


Ich denke, das ist der richtige Weg:

 git fetch --all 

Dann haben Sie zwei Möglichkeiten:

 git reset --hard origin/master 

ODER Wenn Sie sich in einer anderen Branche befinden:

 git reset --hard origin/<branch_name> 

Erklärung:

git fetch lädt die neuesten Daten von einem Remote-Computer herunter, ohne zu versuchen, etwas zusammenzuführen oder zu verschieben.

Dann setzt git reset den Hauptzweig auf das zurück, was Sie gerade erhalten haben. Die Option --hard ändert alle Dateien in Ihrem Arbeitsbaum entsprechend den Dateien in origin/master


Aktuelle lokale Commits pflegen

[*] : Es ist erwähnenswert, dass Sie die aktuellen lokalen Commits speichern können, indem Sie einen Zweig vom master zum Zurücksetzen erstellen:

 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 gespeichert.

Ausstehende Änderungen

Nicht korrigierte Änderungen (auch Phasenänderungen) gehen jedoch verloren. Stellen Sie sicher, dass Sie alles verbergen und weitergeben, was Sie benötigen. Dazu können Sie Folgendes ausführen:

 git stash 

Und wenden Sie dann diese unverbindlichen Änderungen erneut an:

 git stash pop 
7980
17 янв. Die Antwort ist RNA 17 Januar gegeben. 2012-01-17 03:02 '12 am 3:02 2012-01-17 03:02

Versuchen Sie folgendes:

 git reset --hard HEAD git pull 
border=0

Er muss tun, was Sie wollen.

798
09 мая '10 в 22:45 2010-05-09 22:45 antwortete Travis Reeder 9. Mai '10 um 22:45 Uhr 2010-05-09 22:45

ACHTUNG: git clean entfernt alle nicht verfolgbaren Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden.


Manchmal hilft nur clean -f nicht. Wenn Sie keine verfolgten Verzeichnisse haben, wird auch die Option -d benötigt:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

ACHTUNG: git clean entfernt alle nicht verfolgbaren Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden.

Verwenden Sie -n um -n ( --dry-run ) zu verwenden. Dies zeigt Ihnen, was entfernt wird, ohne etwas zu löschen:

 git clean -n -f -d 

Beispielausgabe:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 Die Antwort wird von David Avsajanishvili 19. März 11 um 12:10 2011-03-19 12:10 gegeben

Wie der Igel finde ich die Antworten schrecklich. Obwohl die Igel-Antwort vielleicht besser ist, denke ich nicht, dass sie so elegant ist, wie sie sein kann. Ich fand das so, dass man mit einer bestimmten Strategie "Sampling" und "Merge" verwendet. Dadurch sollte sichergestellt werden, dass Ihre lokalen Änderungen gespeichert werden, bis sie eine der Dateien sind, die Sie überschreiben möchten.

Übernehmen Sie zuerst die Änderungen.

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

Rufen Sie dann die Änderungen ab und schreiben Sie sie erneut, wenn ein Konflikt vorliegt.

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

"- X" ist der Name der Option und "ihre" ist der Wert für diese Option. Sie bevorzugen "Ihre" Änderungen anstelle von "Ihre" Änderungen, wenn ein Konflikt vorliegt.

347
11 апр. Antwort von Richard Kersey 11. April 2012-04-11 23:13 '12 um 11:13 PM 2012-04-11 23:13

Stattdessen:

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

Ich würde folgendes empfehlen:

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

Müssen Sie nicht alle Konsolen und Verzweigungen mitnehmen, wenn Sie zum Ursprungs- / Hauptzweig auf der rechten Seite zurückkehren möchten?

248
26 апр. Johanneke geschrieben am 26. April 2013-04-26 16:48 '13 am 16:48 2013-04-26 16:48

Es scheint so, als wäre es das Beste, dies zu tun:

 git clean 

So entfernen Sie alle nicht verwendeten Dateien und fahren dann mit normalem git pull ...

125
14 июля '09 в 18:16 2009-07-14 18:16 Die Antwort wird von Jakub Troszok am 14. Juli 09 um 18:16 Uhr 2009-07-14 18:16 gegeben

Achtung, dies löscht Ihre Dateien endgültig, wenn Sie in Ihrer Gititore-Datei irgendwelche Einträge im Verzeichnis / * haben.

Einige Antworten scheinen schrecklich. Schrecklich im Sinne von @Lauri, dem Vorschlag von David Avsadjanishvili folgend.

Eher (git> v1.7.6):

 git stash --include-untracked git pull 

Sie können den Verlaufscache später löschen.

Manuell nacheinander:

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

Grausam auf einmal:

 $ git stash clear 

Natürlich, wenn Sie zu dem zurückkehren möchten, was Sie versteckt haben:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Die Antwort wird von Hedgehog am 12. Februar gegeben. 2012-02-12 02:00 '12 um 2:00 2012-02-12 02:00

Dieser Befehl kann für das Löschen lokaler Änderungen hilfreich sein:

 git checkout <your-branch> -f 

Und dann die Bereinigung durchführen (löscht die Rohdateien aus dem Arbeitsbaum):

 git clean -f 

Wenn Sie zusätzlich zu Dateien ohne Trace nicht benötigte Verzeichnisse löschen möchten:

 git clean -fd 
88
05 авг. die antwort wird von Vishal 05 aug gegeben. 2010-08-05 21:06 '10 am 21:06 2010-08-05 21:06

Anstatt mit git pull verschmelzen git pull versuchen Sie Folgendes:

git fetch --all

gefolgt von:

git reset --hard origin/master .

81
22 нояб. Die Antwort wird von Lloyd Moore am 22. November gegeben. 2012-11-22 13:56 '12 am 1:56 pm 2012-11-22 13:56

Das einzige, was für mich funktionierte, war:

 git reset --hard HEAD~5 

Dies gibt Ihnen fünf Commits und dann

 git pull 

Ich fand das, indem ich mir anschaute, wie man Git Merge annulliert .

54
06 мая '11 в 0:53 2011-05-06 00:53 Die Antwort wird von Chris BIllante am 6. Mai 11 um 0:53 2011-05-06 00:53 gegeben

Das Problem bei all diesen Lösungen ist, dass sie entweder zu komplex sind oder ein noch schwerwiegenderes Problem ist, dass sie alle Rohdateien vom Webserver löschen, die wir nicht möchten, da Konfigurationsdateien, die sich immer auf dem Server befinden, immer erforderlich sind und nicht im Git Repository.

Hier ist die sauberste Lösung, die wir verwenden:

51
06 нояб. Antwort von Strahinja Kustudic vom 06. November 2012-11-06 02:32 '12 at 2:32 2012-11-06 02:32

Ich habe das gleiche Problem. Niemand hat mir diese Lösung gegeben, aber es hat für mich funktioniert.

Ich habe das entschieden:

  1. Löschen Sie alle Dateien. Belassen Sie nur das .git Verzeichnis.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Nun geht es.

38
13 янв. Die Antwort wurde am 13. Januar von John John Pichler gegeben 2011-01-13 02:58 '11 am 2:58 2011-01-13 02:58

Versuchen Sie zunächst die Standardmethode:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Achtung : Die oben genannten Befehle können nur dann zum Verlust von Daten / Dateien führen, wenn sie nicht behoben sind! Wenn Sie sich nicht sicher sind, sichern Sie zunächst den gesamten Repository-Ordner.

Dann ziehen Sie es noch einmal.

Wenn das oben genannte nicht hilft und Sie Ihre nicht protokollierten Dateien / Verzeichnisse nicht benötigen (erstellen Sie einfach eine Sicherungskopie für alle Fälle), führen Sie die folgenden einfachen Schritte aus:

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Dadurch werden alle git-Dateien (mit Ausnahme von .git/ dir, wo Sie alle Commits haben) entfernt und erneut extrahiert.


Warum git reset HEAD --hard in manchen Fällen nicht?

  1. Benutzerregeln in der .gitattributes file

    Das Vorhandensein der Regel eol eol=lf in .gitattributes kann dazu führen, dass git einige Dateiänderungen ändert und die Endungen der CRLF-Zeilen in einigen Textdateien in LF konvertiert.

    Wenn dies der Fall ist, sollten Sie diese CRLF / LF-Änderungen git config core.autcrlf false (indem Sie sie im git status git config core.autcrlf false ), oder versuchen Sie: git config core.autcrlf false , um sie vorübergehend zu ignorieren.

  2. Dateisystem-Inkompatibilität

    Wenn Sie ein Dateisystem verwenden, das Berechtigungsattribute nicht unterstützt. Beispielsweise verfügen Sie über zwei Repositorys, eines für Linux / Mac ( ext3 / hfs+ ) und das andere für FAT32 / NTFS-basierte Dateisysteme.

    Wie Sie bemerkt haben, gibt es zwei verschiedene Arten von Dateisystemen. Daher können Dateisysteme, die keine Unix-Berechtigungen unterstützen, grundsätzlich keine Berechtigungen für Dateien auf einem System zurücksetzen, die solche Berechtigungen nicht unterstützen. Ganz egal, wie sehr Sie es versuchen, git erkennt immer einige "Änderungen".

33
26 окт. Die Antwort ist Kenorb 26. Oktober gegeben . 2012-10-26 12:17 '12 am 12:17 2012-10-26 12:17

Bonus:

Apropos Pull / Fetch / Merge in früheren Antworten, ich möchte einen interessanten und produktiven Trick teilen:

git pull --rebase

Dieses Team ist das nützlichste Team in meinem Leben in Git, was viel Zeit gespart hat.

Bevor Sie Ihr neues Commit an den Server senden, probieren Sie diesen Befehl aus, um die neuesten Serveränderungen (mit fetch + merge) automatisch zu synchronisieren und Ihr Commit an die Spitze des Git-Protokolls zu setzen. Sie müssen sich keine Gedanken über das manuelle Extrahieren / Zusammenführen machen.

Teile finden in Was macht "Git Pull - Albase"? .

31
23 дек. Die Antwort wird von Sazzad Hissain Khan am 23. Dezember gegeben. 2015-12-23 18:41 '15 am 18:41 2015-12-23 18:41

Ich habe die anderen Antworten zusammengefasst. Sie können git pull ohne Fehler ausführen:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Warnung Dieses Skript ist sehr leistungsfähig, sodass Sie Ihre Änderungen verlieren können.

27
07 авг. die antwort wird von Robert Moon 07 aug gegeben. 2015-08-07 06:03 '15 am 6:03 2015-08-07 06:03

Ich hatte ein ähnliches Problem. Ich musste das tun:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Die Antwort wird von Ryan 14. Januar gegeben 2011-01-14 18:18 '11 am 18:18 2011-01-14 18:18

Basierend auf meinen eigenen Erfahrungen dieser Art ist die von Strahinja Kustudic angebotene Lösung bei weitem die beste. Wie bereits erwähnt, werden bei einem Hard Reset alle nicht getesteten Dateien entfernt. Dazu gehören möglicherweise viele Dinge, die Sie nicht löschen möchten, z. B. Konfigurationsdateien. Sicherer, Sie müssen nur die Dateien löschen, die hinzugefügt werden müssen. In diesem Zusammenhang möchten Sie wahrscheinlich auch nach lokal geänderten Dateien suchen, die aktualisiert werden müssen.

Deshalb habe ich das Kustudic-Skript aktualisiert, um genau das zu tun. Ich habe auch einen Tippfehler behoben (der im Original fehlt).

26
27 февр. Antwort von Rolf Kaiser am 27. Februar 2013-02-27 17:43 '13 am 17:43 2013-02-27 17:43

Ich glaube, dass es zwei mögliche Ursachen für den Konflikt gibt, die separat gelöst werden müssen, und soweit ich das beurteilen kann, bezieht sich keine der obigen Antworten auf beide:

  • Lokale Dateien, die nicht überwacht werden, müssen manuell (sicherer) oder, wie in anderen Antworten vorgeschlagen, entfernt werden, um git clean -f -d

  • Lokale Commits, die sich nicht im Remote-Zweig befinden, müssen ebenfalls gelöscht werden. IMO ist der einfachste Weg, dies zu erreichen: git reset --hard origin/master (ersetzen Sie den "master" durch jeden Zweig, an dem Sie gerade arbeiten, und führen Sie zuerst git fetch origin ).

23
12 дек. Die Antwort wird bis zum 12. Dezember gegeben. 2011-12-12 22:54 '11 um 22:54 Uhr 2011-12-12 22:54

Ein einfacher Weg:

 git checkout --theirs /path/to/file.extension git pull origin master 

Dadurch wird Ihre lokale Git-Datei überschrieben.

20
05 мая '15 в 11:03 2015-05-05 11:03 Die Antwort wird gegeben maximus 69 05 May '15 at 11:03 2015-05-05 11:03

Es scheint, dass sich die meisten Antworten hier auf den master Zweig konzentrieren. Manchmal gibt es jedoch Fälle, in denen ich an zwei verschiedenen Stellen an demselben Zweig von Funktionen arbeite, und ich möchte, dass einer von ihnen einen in dem anderen widerspiegelt, ohne viel durch den Reifen zu springen.

Aufgrund der Kombination der RNA- Antwort und der Antwort auf eine ähnliche Frage hatte ich eine hervorragende Arbeit:

 git fetch git reset --hard @{u} 

Führen Sie es vom Zweig aus aus, und es wird nur Ihren lokalen Zweig auf die Upstream-Version zurückgesetzt.

Dies kann bequem im git ( git forcepull ) git forcepull :

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Oder in der .gitconfig Datei:

 [alias] forcepull = "!git fetch ; git reset --hard @{u}" 

Genieße es!

19
25 февр. Die Antwort gibt JacobEvelyn am 25. Februar. 2014-02-25 20:19 '14 um 20:19 2014-02-25 20:19

Ich hatte das gleiche Problem und aus irgendeinem Grund würde git clean -f -d das nicht tun. Deshalb: Wenn Ihre Datei von Git ignoriert wird (über den .gitignore-Eintrag, denke ich), macht es sich immer noch Sorgen, die Datei zu überschreiben und die Verbindung zu trennen, aber das Netz löscht sie nicht, wenn Sie nicht -x hinzufügen. -x .

19
03 авг. Antworten Tierlieb 03 aug. 2011-08-03 12:23 '11 am 12:23 2011-08-03 12:23

Ich habe es gerade selbst entschieden:

18
03 дек. Antwort von Simon B. 03 Dez. 2010-12-03 18:00 '10 um 18:00 Uhr 2010-12-03 18:00

Ich habe eine seltsame Situation, die weder git clean noch git reset funktioniert. Ich muss die in Konflikt stehende Datei aus dem git index mit dem folgenden Skript für jede nicht aufgespürte Datei entfernen:

 git rm [file] 

Dann kann ich ganz gut ziehen.

17
19 сент. Antwort von Chen Zhang am 19. September 2011-09-19 17:18 '11 um 17:18 2011-09-19 17:18

Ich kenne eine viel einfachere und weniger schmerzhafte Methode:

 $ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp 

Das!

16
05 сент. die antwort ist gegeben ddmytrenko 05 sep . 2015-09-05 21:23 '15 um 21:23 2015-09-05 21:23

Diese vier Teams arbeiten für mich.

 git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master 

Nach dem Ausführen dieser Befehle prüfen / herausziehen

 git pull origin master 

Ich habe viel versucht, aber in diesen Teams endlich Erfolg erzielt.

13
20 марта '14 в 7:24 2014-03-20 07:24 Die Antwort wird von vishesh chandra am 20. März 14 um 07:24 gegeben. 2014-03-20 07:24

Trotz der ursprünglichen Frage können die ersten Antworten Probleme für Leute verursachen, die ein ähnliches Problem haben, aber ihre lokalen Dateien nicht verlieren möchten. Siehe beispielsweise Kommentare von Al-Punk und crizCraig.

Die nächste Version korrigiert Ihre lokalen Änderungen im tmp ( tmp ), prüft den tmp (der tmp master ) und führt die Aktualisierungen zusammen. Sie können dies mit stash tun, aber ich fand es in der Regel einfacher, nur den Branch / Merge-Ansatz zu verwenden.

 git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master 

wo wir davon ausgehen, dass ein anderes Repository origin master .

12
22 окт. Die Antwort wird am 22. Oktober von Snowcrash gegeben . 2014-10-22 20:31 '14 um 20:31 2014-10-22 20:31

Tu es einfach

 git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname 

Auf diese Weise vermeiden Sie alle unerwünschten Nebeneffekte, z. B. das Löschen von Dateien oder Verzeichnissen, die Sie behalten möchten usw.

12
19 окт. Antwort von user2696128 19. Okt. 2015-10-19 12:54 '15 um 12:54 2015-10-19 12:54

Zeiger und Kopf auf origin/master zurücksetzen, aber den Arbeitsbaum nicht zurücksetzen:

 git reset origin/master 
11
15 февр. Die Antwort wird von user811773 am 15. Februar gegeben. 2013-02-15 16:41 13 um 16:41 Uhr 2013-02-15 16:41

Anforderungen:

  • Verfolgen Sie lokale Änderungen, sodass niemand sie verliert.
  • Machen Sie das lokale Repository mit dem Remote-Quell-Repository kompatibel.

Lösung:

  • Lokale Änderungen ausblenden
  • Holen Sie sich mit sauberen Dateien und ignorieren .gitignore und hartes Zurücksetzen auf den Ursprung .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. Antwort gegeben vezenkov 02 Sep 2015-09-02 02:00 '15 um 2:00 2015-09-02 02:00

Ich habe alle Antworten gelesen, suchte aber nach einem Befehl. Das habe ich getan. Git Alias ​​zu .gitconfig hinzugefügt

 [alias] fp = "!f(){ git fetch ${1} ${2}  git reset --hard ${1}/${2};};f" 

Führen Sie den Befehl aus

 git fp origin master 

ist äquivalent zu

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 Die Antwort wird von Venkat Kotra am 8. Juli 16 um 16:11 Uhr 2016-07-08 16:11 gegeben
  • 1
  • 2