Wie kann ich nicht festgeschriebene Änderungen einschließlich Dateien und Ordnern zurücksetzen?


1071

Gibt es einen git-Befehl, um alle nicht festgeschriebenen Änderungen in einem Arbeitsbaum und Index zurückzusetzen und auch neu erstellte Dateien und Ordner zu entfernen?



1
Nun, ich habe all die abwechslungsreichen und schwer zu merkenden Antworten unten gelesen, mit ihren Vorbehalten und Randfällen und "hat nicht funktioniert, wenn Sie xxx haben", und habe mich daran gehalten, das gesamte Repo zu löschen und es zu klonen, um alle bearbeiteten und hinzugefügten Dateien zu entfernen . Ist auch nur zwei Befehle. rm -r projectdir; Git-Klon xxx. Für mich ist dies eine häufige Operation - schauen Sie sich ein Repo an, um damit herumzuspielen, und möchten Sie dann zu einer sauberen Kasse zurückkehren, damit ich anfangen kann, es zu ändern. Nicht großartig, funktioniert aber zu 100%. In der Hoffnung, eines Tages einen einfachen Befehl dafür hinzuzufügen.
John Little

Antworten:


1771

Sie können diese beiden Befehle ausführen:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
Es ist eine gute Idee, 'git clean -nd' auszuführen, um eine Vorschau der Änderungen anzuzeigen, bevor Sie git clean ausführen, um sicherzustellen, dass keine nicht verfolgten Dateien oder Verzeichnisse entfernt werden, die Ihnen wichtig sind.
jpw

79
Speichern Sie jemandem eine Reise zu den Dokumenten: -f ist Kraft, -d ist Entfernen von Verzeichnissen, -n ist Trockenlauf (auch - Trockenlauf; Ausgabe anzeigen, ohne noch etwas zu tun)
Aaron Campbell

12
git clean -ifür einen interaktiven Modus.
Galath

Meine nicht bereitgestellten Dateien wurden nicht zurückgesetzt, ich musste sie zuerst bereitstellen.
Aron Lorincz

4
@IgorGanapolsky Du bist wahrscheinlich mitten in einem Zusammenführungskonflikt. Versuche zu rennen git merge --abort.
Htanata

555

Wenn Sie die Änderungen nur im aktuellen Arbeitsverzeichnis rückgängig machen möchten, verwenden Sie

git checkout -- .

Und davor können Sie die Dateien auflisten, die zurückgesetzt werden, ohne tatsächlich etwas zu unternehmen, um zu überprüfen, was passieren wird, mit:

git checkout --

1
Wenn ich das versuche, erhalte ich "error: pathspec '." stimmte nicht mit einer oder mehreren bekannten Dateien überein.
Mike K

34
Was ist der Unterschied zwischen diesem und git reset --hard?
Felipe Almeida

104
'git reset --hard' macht sowohl inszenierte als auch nicht inszenierte Änderungen rückgängig, während 'git checkout -'. wird nur nicht bereitgestellte Änderungen rückgängig machen
dividierenByZero

Aber wenn Sie checkout verwenden und Dateien geändert haben, gibt der cmd zurück, dass ich die Zusammenführung durchführen muss, auch wenn ich diese Änderungen nur
Vinicius Monteiro

7
git checkout - listet einfach die Dateien auf, die zurückgesetzt werden (keine Aktion, nur Liste). Dies ist nützlich, wenn Sie sehen möchten, welche Dateien betroffen sind, bevor Sie git checkout ausführen.
Krish Srinivasan

107

Verwenden Sie "git checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen

git checkout -- app/views/posts/index.html.erb

oder

git checkout -- *

Entfernt alle Änderungen, die an nicht bereitgestellten Dateien im Git-Status vorgenommen wurden, z

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *funktioniert bei mir nur, wenn ich mich in dem Verzeichnis befinde, in dem sich die geänderten Dateien befinden. Um alle Dateien im gesamten Repository git checkout -- :/
auszuchecken

In git checkout -- *wird der Stern durch die Shell mit allen Dateien und Verzeichnissen im aktuellen Verzeichnis ersetzt. Also sollte es in Unterverzeichnisse gehen. Für mich geht das. Aber dank der Hervorhebung der Syntax ": /", die meiner Meinung nach sauberer ist.
mcoolive

53

Eine nicht triviale Möglichkeit besteht darin, diese beiden Befehle auszuführen:

  1. git stash Dadurch werden Ihre Änderungen in den Stash verschoben und Sie kehren in den Status HEAD zurück
  2. git stash drop Dadurch wird der zuletzt im letzten Befehl erstellte Stash gelöscht.

3
Dies funktioniert nicht für nicht festgeschriebene Änderungen, sondern nur für festgeschriebene Änderungen.
b0xxed1n

4
Ich habe es für nicht festgeschriebene Änderungen verwendet und es funktioniert.
Paul D. Eden

7
@ b0xxed1n Beim Stashing dreht sich alles um nicht festgeschriebene Änderungen, und offensichtlich funktioniert es für sie.
TJ

git stash wurde erstellt, um die nicht festgeschriebenen Änderungen zu speichern, damit Sie sie speichern können, ohne sie festzuschreiben.
Rob

Git Stash führt zu folgendem Fehler:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

hat nicht geholfen, neue Dateien blieben. Was ich getan habe, ist das Löschen des gesamten Arbeitsbaums und dann

git reset --hard

Weitere Informationen zum Hinzufügen der -xBereinigungsoption finden Sie unter " Wie lösche ich mein lokales Arbeitsverzeichnis in Git? ".

git clean -fdx

Das Hinweis- -x Flag entfernt alle von Git ignorierten Dateien. Seien Sie also vorsichtig (siehe Diskussion in der Antwort, auf die ich mich beziehe).


Was ist -fdx? "Kraft, Verzeichnis und x ist?
Adi Prasetyo

Das @ AdiPrasetyo -x-Flag entfernt auch alle ignorierten Dateien. Es könnte ein unerwünschter Effekt sein, daher habe ich meine Antwort aktualisiert.
Fr0sT

Ich kann immer noch nicht zurückgreifen. Ich erhalte den Fehler: Fehler: Fehler beim Zusammenführen der Änderungen. Patch fehlgeschlagen bei 0003 Rückruf erstellen an Die Kopie des fehlgeschlagenen Patches befindet sich in:
IgorGanapolsky

13

Ich denke, Sie können den folgenden Befehl verwenden: git reset --hard


hhmm ... das habe ich gemacht, aber meine Dateien sind immer noch da. Soll ich danach etwas tun?
MEM

1
git reset setzt nur die nicht festgeschriebenen Änderungen im Arbeitsbaum zurück. Die neuen Dateien und Ordner werden nicht entfernt. Ich bin nicht sicher, wie ich das mit git machen soll
Josnidhin

1
Wenn wir also ein Systemverzeichnis ändern, indem wir neue Dateien und Ordner hinzufügen, und dann dieses Verzeichnis auf einen vorherigen Status zurücksetzen möchten (ohne diese Dateien und Ordner), können wir das mit git nicht tun? Das Beste, was wir tun können, ist, die Dateistatus zurückzusetzen. Aber sobald wir eine Datei erstellt haben, können wir diese Datei nur entfernen, wenn wir sie manuell ausführen.
MEM

6

Bitte beachten Sie, dass es möglicherweise noch Dateien gibt, die nicht zu verschwinden scheinen - sie sind möglicherweise unbearbeitet, aber git hat sie möglicherweise aufgrund von CRLF / LF-Änderungen als bearbeitet markiert. Überprüfen Sie, ob Sie in .gitattributesletzter Zeit einige Änderungen vorgenommen haben .

In meinem Fall habe ich der .gitattributesDatei CRLF-Einstellungen hinzugefügt und alle Dateien blieben aus diesem Grund in der Liste "Geänderte Dateien". Durch Ändern der Einstellungen für .gitattributes wurden diese ausgeblendet.


6

Wenn Sie eine nicht festgeschriebene Änderung haben (die nur in Ihrer Arbeitskopie enthalten ist), die Sie in Ihrer letzten Festschreibung auf die Kopie zurücksetzen möchten, gehen Sie wie folgt vor:

git checkout filename

Ich versuche dies nach einem nicht festgeschriebenen git rm filenameund es funktioniert nicht. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

Die Lösung für das Rückgängigmachen git rmistgit checkout master -- filename
falsePockets

3

Git 2.23 führte den git restoreBefehl zum Wiederherstellen von Arbeitsbaumdateien ein.

https://git-scm.com/docs/git-restore

So stellen Sie alle Dateien im aktuellen Verzeichnis wieder her

Git wiederherstellen.

Wenn Sie alle C-Quelldateien so wiederherstellen möchten, dass sie mit der Version im Index übereinstimmen, können Sie dies tun

Git wiederherstellen '* .c'


1
Es ist Git 2.23 , nicht 2.13
Phuclv

2

Sie können einfach den folgenden git-Befehl verwenden, mit dem alle nicht festgeschriebenen Änderungen in Ihrem Repository zurückgesetzt werden können:

git checkout .

Beispiel:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Normalerweise benutze ich diesen Weg, der gut funktioniert:

mv fold/file /tmp
git checkout fold/file

Dies ist genau das gleiche, was der Typ mit 357 "Likes" vorgeschlagen hat. Nur, dass Sie sogar eine Sicherungskopie der neu ausgecheckten Datei erstellen.
Matthias

-3

Ein sicherer und langer Weg:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Verwenden:

git reset HEAD filepath

Zum Beispiel:

git reset HEAD om211/src/META-INF/persistence.xml
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.