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?

MEM
quelle
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
htanata
quelle
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 --
Ramashish Baranwal
quelle
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
Zarne Dravitzki
quelle
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.
Glumgold
quelle
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).

Fr0sT
quelle
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

Josnidhin
quelle
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.

rauben
quelle
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
kgandroid
quelle
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'

TheKojuEffect
quelle
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
Haritsinh Gohil
quelle
-2

Normalerweise benutze ich diesen Weg, der gut funktioniert:

mv fold/file /tmp
git checkout fold/file
Thinkhy
quelle
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
Jason Lemay
quelle
-3

Verwenden:

git reset HEAD filepath

Zum Beispiel:

git reset HEAD om211/src/META-INF/persistence.xml
Aniket
quelle