Wie kann ich alle lokalen Änderungen in einem von Git verwalteten Projekt auf den vorherigen Status zurücksetzen?


1913

Ich habe ein Projekt, in dem ich lief git init. Nach mehreren Commits habe ich festgestellt git status, dass alles auf dem neuesten Stand ist und es keine lokalen Änderungen gibt.

Dann nahm ich mehrere aufeinanderfolgende Änderungen vor und erkannte, dass ich alles wegwerfen und zu meinem ursprünglichen Zustand zurückkehren wollte. Wird dieser Befehl es für mich tun?

git reset --hard HEAD

Antworten:


3388

Wenn Sie Änderungen an Ihrer Arbeitskopie rückgängig machen möchten, gehen Sie folgendermaßen vor:

git checkout .

Wenn Sie Änderungen am Index rückgängig machen möchten (dh die Sie hinzugefügt haben), tun Sie dies. Warnung: Dadurch werden alle Ihre nicht gedrückten Commits zum Master zurückgesetzt! ::

git reset

Wenn Sie eine von Ihnen festgeschriebene Änderung rückgängig machen möchten, gehen Sie folgendermaßen vor:

git revert <commit 1> <commit 2>

Wenn Sie nicht verfolgte Dateien entfernen möchten (z. B. neue Dateien, generierte Dateien):

git clean -f

Oder nicht verfolgte Verzeichnisse (z. B. neue oder automatisch generierte Verzeichnisse):

git clean -fd

133
fwiw wird nach so langer Zeit git checkout path/to/filenur die lokalen Änderungen aufpath/to/file
Matijs

29
+1 auf den Antworten unten auch git clean -f (um die nicht verfolgten Änderungen zu entfernen) und -fd (um auch nicht verfolgte Verzeichnisse zu entfernen)
ptdev

3
und wenn Sie auch Ihre nicht verfolgten Dateien bereinigen möchten, lesen Sie diese stackoverflow.com/questions/61212/…
Surasin Tancharoen

9
git checkout .und git reset [--hard HEAD]funktionierte nicht, ich musste ein tun git clean -fd, um meine Änderungen rückgängig zu machen.
BrainSlugs83

7
git resetsetzt Ihre Änderungen nicht zurück, git reset --hardtut das.
Cerin

388

Hinweis: Möglicherweise möchten Sie auch ausführen

git clean -fd

wie

git reset --hard

Entfernt keine nicht verfolgten Dateien, wobei git-clean alle Dateien aus dem verfolgten Stammverzeichnis entfernt, die nicht unter Git-Tracking stehen. WARNUNG - Seien Sie vorsichtig damit! Es ist hilfreich, zuerst einen Trockenlauf mit git-clean durchzuführen, um zu sehen, was gelöscht wird.

Dies ist auch besonders nützlich, wenn Sie die Fehlermeldung erhalten

~"performing this command will cause an un-tracked file to be overwritten"

Dies kann auftreten, wenn Sie mehrere Dinge tun. Eine davon ist das Aktualisieren einer Arbeitskopie, wenn Sie und Ihr Freund beide eine neue Datei mit demselben Namen hinzugefügt haben, diese jedoch zuerst in die Quellcodeverwaltung übernommen hat und Sie sich nicht darum kümmern, Ihre nicht verfolgte Kopie zu löschen .

In dieser Situation hilft Ihnen ein Trockenlauf auch dabei, eine Liste der Dateien anzuzeigen, die überschrieben werden würden.


13
Der Befehl zum Bereinigen der Datei lautet "git clean -f". Nicht verfolgte Verzeichnisse werden mit "git clean -d" entfernt
Jonathan Mitchell

35
git clean -fd (Kraft ist erforderlich für -d)
electblake

14
-n oder --dry-run sind die Flags für den Trockenlauf.
Stephenbez

2
git clean -ffd, wenn Sie ein anderes Git-Repository in Ihrem Git-Repository haben. Ohne double f würde es nicht entfernt werden.
Trismegistos

148

Erneut klonen

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ Löscht lokale, nicht gepusste Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt verfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht die in aufgelisteten Dateien / Verzeichnisse .gitignore(wie Build-Dateien).
  • ✅ Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore
  • 😀 Sie werden diesen Ansatz nicht vergessen
  • 😔 Verschwendet Bandbreite

Es folgen weitere Befehle, die ich täglich vergesse.

Reinigen und zurücksetzen

git clean --force -d -x
git reset --hard
  • ❌ Löscht lokale, nicht gepusste Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt verfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht die in aufgelisteten Dateien / Verzeichnisse .gitignore(wie Build-Dateien).
  • ✅ Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Sauber

git clean --force -d -x
  • ❌ Löscht lokale, nicht gepusste Commits
  • ❌ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ❌ Stellt verfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht die in aufgelisteten Dateien / Verzeichnisse .gitignore(wie Build-Dateien).
  • ✅ Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Zurücksetzen

git reset --hard
  • ❌ Löscht lokale, nicht gepusste Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt verfolgte Dateien wieder her, die Sie gelöscht haben
  • ❌ Löscht die in aufgelisteten Dateien / Verzeichnisse .gitignore(wie Build-Dateien).
  • ❌ Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Anmerkungen

Testfall zur Bestätigung aller oben genannten Punkte (Bash oder Sh verwenden):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Siehe auch

  • git revert neue Commits zu machen, die vorherige Commits rückgängig machen
  • git checkout um zu früheren Commits zurückzukehren (möglicherweise müssen Sie zuerst die obigen Befehle ausführen)
  • git stashwie git resetoben, aber Sie können es rückgängig machen

Entschuldigen Sie, dass Sie die obigen Antworten gestohlen haben. Ich benutze diese Referenz ständig und poste hauptsächlich für mich.
William Entriken

1
Ich bin mir ziemlich sicher, dass die erste Option ( Neu klonen ) tatsächlich "lokale, nicht gepusste Commits löschen" :)
Marandil

1
@styfle ✅ ist etwas, was es tut, ❌ ist etwas, was es nicht tut
William Entriken

3
@FullDecent Es ist etwas verwirrend zu lesen. "❌ Löscht KEINE lokalen, nicht gepushen Commits". Das heißt, es wird NICHT gelöscht. Das doppelte Negativ bedeutet, dass es löscht?
Styfle

1
Info -x Flag in git clean -f -d -x: Wenn die Option -x angegeben ist, werden auch ignorierte Dateien entfernt. Dies kann zum Beispiel nützlich sein, um alle Build-Produkte aus GIT-Dokumenten zu entfernen
Alex

82

Wenn Sie alle Änderungen rückgängig machen UND mit dem aktuellen Remote-Master auf dem neuesten Stand sein möchten (z. B. stellen Sie fest, dass sich der Master-HEAD vorwärts bewegt hat, seit Sie ihn abgezweigt haben und Ihr Push "abgelehnt" wird), können Sie verwenden

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

Es scheint wichtig zu spezifizieren originin git reset --hard origin/master(das funktioniert) - ohne es (dh git reset --hard) nichts verändert zu sein scheint.
Jake

Ich hatte einige lokale Änderungen und konnte sie durch keinen Befehl, den ich zurückgesetzt habe, entfernen - harter Ursprung / Master und es war auch in der Lage, die Änderungen des Masters zu übernehmen
abhishek ringsia

50

Schau in Git-Reflog. Es werden alle Zustände aufgelistet, an die es sich erinnert (Standard ist 30 Tage), und Sie können einfach den gewünschten auschecken. Zum Beispiel:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

Vielen Dank William, für Git Reflog. Ich habe meinen Baum auf die alte Version zurückgesetzt und bin mir nicht sicher, wie ich auf die aktuelle Version zurückgreifen soll. Dein Git Reflog hat mich gerettet. Noch einmal vielen Dank.
Palaniraja

1
hat mich auch gerettet! In meinem Fall war mein Abenteuer mit git rebase -ischief gelaufen (es wurden einige Commits aufgrund eines Bearbeitungsfehlers gelöscht). Dank diesem Tipp bin ich wieder in einem guten Zustand!
paneer_tikka

Was meinst du mit 30 Tagen Standard !?
Mohe TheDreamy

@ MoheTheDreamy Ich meine, dass es ein Zeitlimit gibt. Schließlich löscht der Garbage Collector nicht erreichbare Referenzen, wenn ihr Alter diese Grenze überschreitet. Die Standardeinstellung war (und ist vielleicht immer noch) 30 Tage. Daher sind ältere Referenzen möglicherweise nicht verfügbar.
William Pursell

36

GEFAHR VORAUS: (Bitte lesen Sie die Kommentare. Wenn Sie den in meiner Antwort vorgeschlagenen Befehl ausführen, werden möglicherweise mehr gelöscht, als Sie möchten.)

Um alle Dateien einschließlich der Verzeichnisse vollständig zu entfernen, musste ich sie ausführen

git clean -f -d

13
Um jedem den Schmerz zu ersparen, den ich gerade durchgemacht habe: Dadurch werden auch .gitignore-d-Dateien gelöscht!
Landons

Entschuldigung, wenn ich dir Ärger gemacht habe. Damals habe ich nur versucht, alles in diesem Ordner zurückzusetzen und zu löschen. Ich erinnere mich nicht an die genauen Umstände, aber das "-d" war das einzige, was für mich funktionierte. Ich hoffe ich habe dir nicht zu viel Schmerz verursacht :-)
Tobias Gassmann

1
keinen Schaden angerichtet. Ich hatte Backups, aber dies rechtfertigt wahrscheinlich einen Haftungsausschluss;)
Landons

35

Nachdem ich eine Reihe von Antworten gelesen und ausprobiert habe, habe ich verschiedene Randfälle gefunden, die bedeuten, dass sie manchmal die Arbeitskopie nicht vollständig bereinigen.

Hier ist mein aktuelles Bash-Skript dafür, das die ganze Zeit funktioniert.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Aus dem Stammverzeichnis der Arbeitskopie ausführen.


10
Letzter Befehl gibt mirerror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
Es hat bei mir funktioniert, als ich das "-" herausgenommen habe. git checkout HEAD
Jester

4
git reset --hardSetzt verfolgte Dateien zurück (inszeniert oder nicht), git clean -f -dentfernt nicht verfolgte Dateien. git checkout -- HEADWarum brauchen wir das dann?
v.shashenko

Wir brauchen keinen doppelten Bindestrich. Muss ein Tippfehler sein.
Farax

35

einfach ausführen -

git stash

Es werden alle Ihre lokalen Änderungen entfernt. und Sie können es auch später verwenden, indem Sie - ausführen

git stash apply 

3
Die Verwendung git stash popwürde automatisch die oberste Änderung für Sie entfernen
Arrow Cen

8
git stash dropum den neuesten Status zu entfernen, ohne auf die Arbeitskopie anzuwenden.
Deerchao

Git Stash Apply fügt
keine

27

Ich bin auf ein ähnliches Problem gestoßen. Die Lösung besteht darin git log, nachzuschlagen, welche Version des lokalen Commits sich von der Remote unterscheidet. (ZB ist die Version 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Verwenden Sie dann git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec, um die Änderung rückgängig zu machen.


16

Ich habe nach einem ähnlichen Problem gesucht.

Wollte lokale Verpflichtungen wegwerfen:

  1. hat das Repository geklont (Git-Klon)
  2. auf dev branch umgestellt (git checkout dev)
  3. habe nur wenige Commits gemacht (git commit -m "commit 1")
  4. aber beschlossen, diese lokalen Commits wegzuwerfen, um zu Remote (origin / dev) zurückzukehren

Das Folgende auch:

git reset --hard origin/dev

Prüfen:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

Jetzt gehen lokale Commits verloren, zurück zum ursprünglichen geklonten Zustand, Punkt 1 oben.


1
danke, das ist das einzige, was für mich funktioniert hat - "git reset --hard origin"
Nisim Naim

froh zu wissen, dass es geholfen hat.
Manohar Reddy Poreddy

7

Möglicherweise möchten / müssen Sie Ihre Arbeit / Dateien nicht unbedingt in Ihrem Arbeitsverzeichnis speichern, sondern müssen sie einfach vollständig entfernen. Der Befehl git cleanerledigt dies für Sie.

Einige häufige Anwendungsfälle hierfür sind das Entfernen von Cruft , das durch Zusammenführungen oder externe Tools generiert wurde, oder das Entfernen anderer Dateien, damit Sie einen sauberen Build ausführen können.

Denken Sie daran, dass Sie bei diesem Befehl sehr vorsichtig sein sollten, da er dazu dient, Dateien aus Ihrem lokalen Arbeitsverzeichnis zu entfernen, die NICHT VERFOLGT sind. Wenn Sie nach dem Ausführen dieses Befehls plötzlich Ihre Meinung ändern, können Sie den Inhalt der entfernten Dateien nicht mehr sehen. Eine Alternative, die sicherer ist, ist die Ausführung

git stash --all

Dadurch wird alles entfernt, aber alles in einem Vorrat gespeichert. Dieser Vorrat kann später verwendet werden.

Wenn Sie jedoch wirklich alle Dateien entfernen und Ihr Arbeitsverzeichnis bereinigen möchten, sollten Sie ausführen

git clean -f -d

Dadurch werden alle Dateien und auch alle Unterverzeichnisse entfernt, die aufgrund des Befehls keine Elemente enthalten. Bevor Sie den git clean -f -dBefehl ausführen , sollten Sie ihn ausführen

git clean -f -d -n

Dies zeigt Ihnen eine Vorschau dessen, was nach der Ausführung entfernt wird git clean -f -d

Hier finden Sie eine Zusammenfassung Ihrer Optionen von den aggressivsten bis zu den am wenigsten aggressiven


Option 1 : Entfernen Sie alle Dateien lokal (am aggressivsten)

git clean -f -d

Option 2 : Vorschau der oben genannten Auswirkungen (Vorschau der aggressivsten)

git clean -f -d -n

Option 3 : Alle Dateien verstauen (am wenigsten aggressiv)

`git stash --all` 

6

Versuchen Sie dies, um alle Änderungen zurückzusetzen, die in der lokalen Verzweigung nicht festgeschrieben wurden

$ git reset --hard HEAD

Aber wenn Sie einen Fehler wie diesen sehen:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Sie können zum Ordner '.git' navigieren und dann die Datei index.lock löschen:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Führen Sie zum Schluss erneut den Befehl aus:

$ git reset --hard HEAD

0

Bei dieser Frage geht es mehr um das Zurücksetzen / Zurücksetzen eines breiteren Repositorys. Falls Sie jedoch daran interessiert sind, einzelne Änderungen rückgängig zu machen, habe ich hier eine ähnliche Antwort hinzugefügt:

https://stackoverflow.com/a/60890371/2338477

Antworten auf Fragen:

  • Wie man individuelle Veränderungen mit oder ohne Veränderung rückgängig macht, die in der Git-Geschichte erhalten bleiben

  • So kehren Sie zur alten Version zurück, um von demselben Status aus neu zu starten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.