git: mache alle Änderungen des Arbeitsverzeichnisses rückgängig, einschließlich neuer Dateien

1151

So löschen Sie alle Änderungen aus dem Arbeitsverzeichnis, einschließlich neuer nicht verfolgter Dateien. Ich weiß, dass dies der git checkout -fFall ist, aber es werden keine neuen nicht verfolgten Dateien gelöscht, die seit dem letzten Festschreiben erstellt wurden.

Hat jemand eine Idee, wie das geht?

Aler
quelle
1
@ Joel & Wayfarer: Warum versuchst du es nicht git help resetundgit help clean
SHernandez
3
Einen Alias ​​dafür in deiner Git-Konfiguration zu
erstellen

Antworten:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Verwenden Sie das -nFlag , um zu sehen, was zuvor gelöscht wird, ohne es tatsächlich zu löschen (dies ist im Grunde ein Testlauf). Wenn Sie bereit sind, tatsächlich zu löschen, entfernen Sie das -nFlag:

git clean -nfd

BKSpurgeon
quelle
16
Hinweis: git reset --hard entfernt bereitgestellte Änderungen sowie Änderungen des Arbeitsverzeichnisses. Außerdem ist git clean -f -d wahrscheinlich ein besseres Gegenteil zum Hinzufügen einer neuen nicht verfolgten Datei. Aufgrund der Frage kann der Fragesteller mit seinem aktuellen Satz ignorierter Dateien ziemlich zufrieden sein.
CB Bailey
7
Lesen Sie die nächste Antwort und achten Sie auf den Schalter -x. (Es könnte auch Ihre lokale Konfiguration wie Passwort / Datenbank-Einstellungsdateien entfernen. ZB database.yml)
Boris
9
Dieser -x-Schalter ist in diesem Fall unnötig und etwas gefährlich.
Tim Gautier
66
git clean -fxdkann tatsächlich WIRKLICH gefährlich sein, wenn Sie nicht wissen, was Sie tun. Möglicherweise löschen Sie einige sehr wichtige nicht verfolgte Dateien wie Ihre Datenbank usw. dauerhaft. Seien Sie vorsichtig.
Mason Stewart
10
Beachten Sie, dass dadurch git clean -f -dauch Dateien aus ignorierten Ordnern gelöscht werden. Alle lokalen Protokolle und solche Dinge werden also verschwunden sein. Normalerweise ist es kein großes Problem, aber es ist besser zu wissen.
Cyriel
299

Sicherste Methode, die ich häufig verwende:

git clean -fd

Syntaxerklärung gemäß /docs/git-cleanSeite:

  • -f(Alias ​​:) --force. Wenn die Git-Konfigurationsvariable clean.requireForce nicht auf false gesetzt ist, lehnt git clean das Löschen von Dateien oder Verzeichnissen ab, sofern nicht -f, -n oder -i angegeben wird. Git weigert sich, Verzeichnisse mit dem Unterverzeichnis oder der Datei .git zu löschen, es sei denn, ein zweites -f wird angegeben.
  • -d. Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien. Wenn ein nicht verfolgtes Verzeichnis von einem anderen Git-Repository verwaltet wird, wird es standardmäßig nicht entfernt. Verwenden Sie die Option -f zweimal, wenn Sie ein solches Verzeichnis wirklich entfernen möchten.

Wie in den Kommentaren erwähnt, ist es möglicherweise vorzuziehen, git clean -ndeinen Trockenlauf durchzuführen, der Ihnen sagt, was gelöscht werden soll, bevor Sie ihn tatsächlich löschen.

Link zur git cleanDokumentseite: https://git-scm.com/docs/git-clean

Heath Dutton
quelle
124
Ich immer git clean -nd .vor dem tatsächlichen Löschen von Dateien mitgit clean -fd .
tbear
14
Warum? Können Sie bitte das Detail erklären?
Greg B
31
Per git clean -n Option ist eigentlich ein Trockenlauf, der nichts entfernt, sondern nur zeigt, was getan wird.
RNickMcCandless
2
@tbear, können Sie immer tun , eine leere add -A+ commit -a+ revert headerste vor git clean. Das Überprüfen jedes einzelnen Löschvorgangs lässt sich für wichtige Szenarien einfach nicht skalieren. Auch Trockenlauf ist kein Wundermittel: Was ist, wenn Sie bei der Überprüfung etwas verpasst oder einen Fehler gemacht haben?
Pacerier
1
Dadurch werden Dateien entfernt, Änderungen werden jedoch nicht rückgängig gemacht.
Donquijote
202

Verwenden Sie für alle nicht bereitgestellten Dateien:

git checkout -- .

Das .am Ende ist wichtig.

Sie können durch .einen Unterverzeichnisnamen ersetzen , um nur ein bestimmtes Unterverzeichnis Ihres Projekts zu löschen. Das Problem wird hier speziell angesprochen .

Brunnen
quelle
7
@Vincent: Mit - werden Tippfehler vermieden, indem dem Befehl checkout mitgeteilt wird, dass keine weiteren Parameter angegeben sind. Ohne sie könnten Sie mit einem neuen Zweig enden, anstatt den aktuellen zurückzusetzen!
Igor Rodriguez
2
Dies ist der sicherste Weg, entfernt jedoch keine nicht verfolgten Dateien (neu hinzugefügte Dateien).
TinkerTenorSoftwareGuy
5
Dadurch werden gelöschte, jedoch nicht festgeschriebene Dateien nicht wiederhergestellt.
Cerin
Nur zu deiner Information. Das habe ich verpasst. Stellen Sie sicher, dass Sie sich in dem Verzeichnis befinden, in dem Sie die nicht bereitgestellten Änderungen löschen möchten. Zum Beispiel hatte ich Änderungen in 2 verschiedenen Dateien an verschiedenen Orten in einem Zweig, dh: src/app/work/filename.jsund ../app/working/test/filename.js. Nur die Verwendung git checkout -- .auf dem Zweig löschte nur die erste Datei ( ohne die führende ../ ). Also musste ich cd ../in das zweite Speicherortverzeichnis, um die zweite Datei mit diesem Befehl zu löschen.
Chris22
57

Schauen Sie sich den git cleanBefehl an.

git-clean - Entfernen Sie nicht verfolgte Dateien aus dem Arbeitsbaum

Bereinigt den Arbeitsbaum durch rekursives Entfernen von Dateien, die nicht der Versionskontrolle unterliegen, beginnend mit dem aktuellen Verzeichnis.

Normalerweise werden nur Dateien entfernt, die Git nicht bekannt sind. Wenn jedoch die Option -x angegeben ist, werden auch ignorierte Dateien entfernt. Dies kann beispielsweise nützlich sein, um alle Build-Produkte zu entfernen.

Greg Hewgill
quelle
Ich habe versucht git clean -iund "sauber" aus dem Menü gewählt - dies entfernte schließlich neue Dateien.
Sany
43

Folgendes funktioniert:

git add -A .
git stash
git stash drop stash@{0}

Bitte beachten Sie, dass dadurch sowohl Ihre nicht bereitgestellten als auch Ihre bereitgestellten lokalen Änderungen verworfen werden. Sie sollten also alles festschreiben, was Sie behalten möchten, bevor Sie diese Befehle ausführen.

Ein typischer Anwendungsfall: Sie haben viele Dateien oder Verzeichnisse verschoben und möchten dann zum ursprünglichen Zustand zurückkehren.

Credits: https://stackoverflow.com/a/52719/246724

Donquijote
quelle
1
Warum verweisen Sie statt nur auf stash @ {0} git stash drop?
Maikel
Ehrlich gesagt, ich erinnere mich nicht :)
Donquixote
Dieser hat funktioniert. Stellen Sie als Hinweis sicher, dass Sie sich im Home-Verzeichnis befinden ( git add -A .). Ich habe 30 m verloren, weil es keine Dateiübereinstimmung gab. Vielen Dank!
user9869932
Ich habe diesen Ansatz verwendet, und er hat seine Vorzüge. Seitdem habe ich jedoch festgestellt, dass die von jfountain und Heath Dutton vorgeschlagenen Lösungen besser zu dem ursprünglichen Problem passen, IMHO.
HeyZiko
2
Git Stash Drop Stash @ {0} löscht den neuesten Stash, wenn Sie Git Stash gemacht haben, würde es alle
Stashes löschen, die
42

Sie können dies in zwei Schritten tun:

  1. Geänderte Dateien zurücksetzen: git checkout -f
  2. Nicht verfolgte Dateien entfernen: git clean -fd
Gerard de Visser
quelle
3
+1 weil einfach. Auch weil es funktioniert und genau das tut, was OP will, ohne sie mit omg abzuschrecken, wird alles gelöscht.
Geekzster
30

Ich dachte es wäre ( Warnung: Folgendes wird alles auslöschen )

$ git reset --hard HEAD
$ git clean -fd

Die resetÄnderungen rückgängig zu machen. Die cleanbeliebige untracked entfernen f iles und d irectories.

Skube
quelle
Das funktioniert nicht, ich bekomme immer noch eine Konfliktwarnung, wenn ich git pulldanach mache : CONFLICT (content): Merge conflict in...Ich habe dies nur durch agit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Es werden alle nicht verfolgten Dateien gelöscht.

Santosh Kumar
quelle
4

git clean -izeigt Ihnen zuerst die zu löschenden Elemente und fährt nach Ihrer Bestätigung fort. Ich finde dies nützlich, wenn es um wichtige Dateien geht, die nicht versehentlich gelöscht werden sollten.

Sehen Sie git help cleanfür weitere Informationen, darunter auch einige andere nützliche Optionen.

Taiga
quelle
4

Wenn Sie alle Änderungen verwerfen möchten, können Sie eine der gültigen Optionen in einem Alias ​​in verwenden .gitconfig. Zum Beispiel:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Verwendungszweck: git discard

Agorreca
quelle
1
Dieser Alias ​​gefällt mir sehr gut
Flaggen
3

Eine alternative Lösung besteht darin, die Änderungen festzuschreiben und diese Festschreibungen dann zu entfernen. Dies hat zunächst keinen unmittelbaren Vorteil, eröffnet jedoch die Möglichkeit, in Blöcken festzuschreiben und ein Git-Tag für die Sicherung zu erstellen.

Sie können dies im aktuellen Zweig folgendermaßen tun:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Oder Sie können es auf freistehendem KOPF tun. (Vorausgesetzt, Sie starten im BRANCHNAME-Zweig):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Normalerweise schreibe ich jedoch in Blöcken fest und benenne dann einige oder alle Festschreibungen als "DISCARD: ...". Verwenden Sie dann die interaktive Rebase, um die schlechten Commits zu entfernen und die guten beizubehalten.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Dies ist ausführlicher, ermöglicht es jedoch, genau zu überprüfen, welche Änderungen Sie verwerfen möchten.

Die git lolundgit lola Verknüpfungen waren bei diesem Workflow sehr hilfreich.

Donquijote
quelle
3

Für einen bestimmten Ordner habe ich verwendet:

git checkout -- FolderToClean/*
Glauco Neves
quelle
3
Damit werden nicht verfolgte Dateien nicht gelöscht, wie OP angibt.
vonbrand
0

Dies ist wahrscheinlich eine Noob-Antwort, aber: Ich verwende TortoiseGit für Windows und es hat eine nette Funktion namens REVERT. Was Sie also tun, um Ihre lokalen nicht bereitgestellten nicht gepushten Änderungen zurückzusetzen, ist:

  1. Rufen Sie ein Kontextmenü für den gewünschten Ordner auf und wählen Sie Zurücksetzen. Es wird ein Popup zum Zurücksetzen angezeigt, in dem Sie geänderte Dateien zum Zurücksetzen / Wiederherstellen auswählen können.
  2. Wenn Sie auch hinzugefügte Dateien löschen möchten (die noch nicht in Git enthalten sind), klicken Sie auf Commit (aus demselben Kontextmenü). Das Popup-Fenster Commit wird angezeigt und die hinzugefügten Dateien werden angezeigt. Klicken Sie dann mit der rechten Maustaste auf die einzelnen Dateien und wählen Sie Löschen. Drücken Sie in diesem Popup jedoch nicht auf Commit btn, da Sie nicht festschreiben möchten, sondern nur hinzugefügte Dateien anzeigen und von hier löschen möchten.
Oleg Vorontsov
quelle