git clean
Erfahren Sie, was der Befehl git clean macht, wie er sich von git reset unterscheidet und welche Optionen es gibt.

Was git clean bewirkt
Der Befehl git clean entfernt nicht verfolgte Dateien aus Ihrem Arbeitsverzeichnis. Eine nicht verfolgte Datei ist eine Datei, die auf dem Datenträger vorhanden ist, aber von Git noch nicht beobachtet wird – das heißt, sie wurde noch nie mit git add hinzugefügt und befindet sich nicht im Index.
Dadurch unterscheidet sich git clean von seinen Nachbarn unter den Rückgängig-Befehlen:
- git reset verschiebt die Branch-Spitze und kann verfolgte Änderungen aus dem Staging-Bereich entfernen.
- git checkout stellt verfolgte Dateien in einem früheren Zustand wieder her.
git cleanlöscht die Dateien, die Git überhaupt nicht verfolgt.
Zusammen decken sie den gesamten Arbeitsbaum ab: reset/checkout behandeln verfolgte und vorgemerkte Inhalte, clean kümmert sich um den Rest. Ein typischer Anwendungsfall ist das Bereinigen von Build-Artefakten, generierten Dateien oder Experimentrückständen, sodass Sie mit einer sauberen Kopie des committeten Baums beginnen.
git cleanist unwiderruflich. Es löscht Dateien direkt aus dem Dateisystem, nicht in einen wiederherstellbaren Bereich wie den Stash. Es gibt keingit clean-Rückgängig. Zeigen Sie immer zuerst mit einem Probelauf (-n) eine Vorschau an.
Das folgende Beispiel richtet ein Repository mit einer verfolgten und mehreren nicht verfolgten Einträgen ein, damit Sie den Unterschied erkennen können:
Ein Beispiel-Repository einrichten
mkdir test_directory
cd test_directory/
git init .
#Initialized empty Git repository in /Users/kev/code/test_directory/.git/
echo "tracked file" > ./test_tracked_file
git add ./test_tracked_file
echo "untracked" > ./test_untracked_file
mkdir ./test_untracked_dir && touch ./test_untracked_dir/file
git status
#On branch master
#No commits yet
#Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
# new file: test_tracked_file
#Untracked files:
# (use "git add <file>..." to include in what will be committed)
# test_untracked_dir/
# test_untracked_fileNach diesem Ablauf haben Sie ein frisches Repository mit einer vorgemerkten Datei, test_tracked_file, sowie einer nicht verfolgten Datei (test_untracked_file) und einem nicht verfolgten Verzeichnis (test_untracked_dir). git status meldet diese in getrennten Abschnitten – genau die Aufteilung, auf die es git clean ankommt. Alles Folgende arbeitet auf diesem Repository.
Warum Force erforderlich ist
Führen Sie den nackten Befehl aus, und Git verweigert die Ausführung:
git clean
#fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to cleanDa die Löschung dauerhaft ist, führt Git den Befehl nur aus, wenn Sie sich mit -f (force), -n (Probelauf) oder -i (interaktiv) dafür entscheiden. Sie können den Standard mit der git config-Einstellung clean.requireForce ändern, aber ihn aktiviert zu lassen ist die sichere Wahl.
Häufige Optionen und Verwendung
Das Verhalten von git clean wird fast ausschließlich durch eine Handvoll kurzer Flags gesteuert, die sich frei kombinieren lassen.
-n: Probelauf (Vorschau)
Das Flag -n (oder --dry-run) listet auf, was entfernt werden würde, ohne dabei etwas zu löschen. Machen Sie dies zu Ihrem standardmäßigen ersten Schritt.
git clean -n
#Would remove test_untracked_fileDie Ausgabe nennt test_untracked_file. Beachten Sie, dass das nicht verfolgte Verzeichnis nicht aufgeführt ist, weil git clean standardmäßig Verzeichnisse ignoriert (siehe -d unten).
-f: Löschung erzwingen
Das Flag -f (oder --force) führt die Löschung tatsächlich durch. Es ist erforderlich, sofern clean.requireForce nicht auf false gesetzt ist.
git clean -f
#Removing test_untracked_filetest_untracked_file ist nun verschwunden; ein anschließendes git status listet sie nicht mehr auf. Standardmäßig wirkt git clean -f auf jede nicht verfolgte Datei im aktuellen Verzeichnis. Dateien, die von .gitignore erfasst werden, werden in Ruhe gelassen, sofern Sie nicht -x hinzufügen (s. u.).
Um die Operation auf einen bestimmten Ort zu beschränken, übergeben Sie einen Pfad:
git clean -f path/to/dir-d: Nicht verfolgte Verzeichnisse einbeziehen
Standardmäßig überspringt git clean nicht verfolgte Verzeichnisse. Fügen Sie -d hinzu, um diese ebenfalls zu entfernen. Kombinieren Sie es mit -n für eine Vorschau und dann mit -f zum Ausführen:
git clean -dn
#Would remove test_untracked_dir/
#Would remove test_untracked_file
git clean -df
#Removing test_untracked_dir/
#Removing test_untracked_fileMit -d listet der Probelauf nun das Verzeichnis zusätzlich zur nicht verfolgten Datei auf, und der erzwungene Durchlauf entfernt beide – löscht das Verzeichnis und alles darin.
-x: Ignorierte Dateien einbeziehen
Normalerweise respektiert git clean die .gitignore-Datei. Das Flag -x weist es an, auch ignorierte Dateien zu löschen – Dinge wie node_modules/, Build-Ausgaben oder Editor-Ordner wie .idea/. Dies ist wirkungsvoll und leicht zu bereuen, also führen Sie immer zuerst einen Probelauf durch.
git clean -xn
#Would remove .idea/
#Would remove build/-x lässt sich mit den anderen Flags kombinieren. Die folgende Kombination bereinigt nicht verfolgte Dateien, nicht verfolgte Verzeichnisse und ignorierte Dateien in einem Schritt – das Äquivalent von „diesen Checkout auf genau das zurücksetzen, was committet ist":
git clean -xdfKurzreferenz
| Befehl | Wirkung |
|---|---|
git clean -n | Vorschau der entfernbaren nicht verfolgten Dateien |
git clean -f | Nicht verfolgte Dateien löschen |
git clean -df | Nicht verfolgte Dateien und Verzeichnisse löschen |
git clean -xf | Nicht verfolgte und ignorierte Dateien löschen |
git clean -xdf | Alles nicht Committete löschen (Dateien, Verzeichnisse, Ignoriertes) |
git clean -i | Löschungen interaktiv durchgehen |
Interaktiver Modus
Wenn Sie unsicher sind, was genau entfernt werden soll, führen Sie git clean im interaktiven Modus mit dem Flag -i aus. Dies ist der sicherste Weg, einen unübersichtlichen Arbeitsbaum zu bereinigen, da nichts gelöscht wird, bis Sie es bestätigen. Das folgende Beispiel fügt auch -d hinzu, sodass Verzeichnisse einbezogen werden. Git zeigt die Kandidaten und dann eine What now>-Eingabeaufforderung mit sechs Befehlen an:
git clean -di
#Would remove the following items:
# test_untracked_dir/ test_untracked_file
#*** Commands ***
# 1: clean 2: filter by pattern 3: select by numbers
# 4: ask each 5: quit 6: help
#What now>Hier ist, was jeder Befehl bewirkt.
6 — help. Geben Sie 6 ein, um eine Beschreibung jedes Befehls auszugeben:
What now> 6
#clean - start cleaning files and directories
#filter by pattern - exclude items from deletion
#select by numbers - select items to be deleted by numbers
#ask each - confirm each deletion (like "rm -i")
#quit - stop cleaning
#help - this screen
#? - help for prompt selection1 — clean. Löscht die aktuell aufgelisteten Einträge und beendet dann:
What now> 1
#Removing test_untracked_dir/
#Removing test_untracked_file2 — filter by pattern. Ermöglicht es Ihnen, Einträge per Glob zu ausschließen. Hier entfernt das Muster *_file die Datei test_untracked_file aus der Löschliste, sodass nur das Verzeichnis in der Warteschlange verbleibt:
What now> 2
#test_untracked_dir/ test_untracked_file
#Input ignore patterns>> *_file
#test_untracked_dir/3 — select by numbers. Verfeinert die Liste nach Elementnummer statt nach Muster. Git nummeriert jeden Kandidaten und Sie geben die zu behaltenden Nummern ein:
What now> 3
# 1: test_untracked_dir/ 2: test_untracked_file
#Select items to delete>>4 — ask each. Geht jeden Kandidaten mit einer y/N-Eingabeaufforderung durch, ähnlich wie rm -i. Antworten Sie mit N, um einen Eintrag zu behalten:
What now> 4
#Remove test_untracked_dir/ [y/N]? N
#Remove test_untracked_file [y/N]? N5 — quit. Verlässt den interaktiven Modus, ohne etwas zu löschen:
What now> 5
#Bye.git clean vs. Stashing und Resetting
git clean berührt nur nicht verfolgte Dateien, also greifen Sie darauf zurück, wenn Sie Arbeit wegwerfen möchten, anstatt sie zu speichern. Wenn Sie die Änderungen möglicherweise später wiederhaben möchten, bevorzugen Sie stattdessen eine dieser Optionen:
- git stash — legt verfolgte Änderungen (und mit
-uauch nicht verfolgte Dateien) beiseite, sodass Sie sie später wiederherstellen können. Reversibel. - git reset — verschiebt die Branch-Spitze und entfernt verfolgte Änderungen aus dem Staging-Bereich oder verwirft sie.
- git checkout — stellt verfolgte Dateien in ihrem committeten Zustand wieder her.
Ein üblicher vollständiger Reset eines Arbeitsbaums besteht darin, reset für verfolgten Inhalt mit clean für nicht verfolgten Inhalt zu kombinieren:
git reset --hard # discard tracked changes
git clean -xdf # remove untracked and ignored filesNach diesen beiden Befehlen entspricht das Arbeitsverzeichnis genau dem letzten Commit, ohne zurückgebliebene Dateien jedweder Art.