Git: Wie entfernt man ungetrackte Dateien aus dem Arbeitsverzeichnis?
git clean entfernt Dateien, die git
nicht verfolgt. Es ist das richtige Werkzeug — und einer von zwei, drei
git-Befehlen, die wirklich Arbeit vernichten können. Also lohnt es sich,
bewusst damit umzugehen.
Erst schauen, dann löschen
user@pc:~$ git clean -nd
Would remove build/
Would remove untracked.txt
-n ist ein Trockenlauf — es zeigt an und löscht nichts. Mach das zum Reflex.
Für den echten Befehl gibt es kein Zurück, die zwei Sekunden sind gut angelegt.
Und dann löschen
user@pc:~$ git clean -fd
files after : .gitignore ignored.log tracked.txt
-f ist nötig, weil git sich ohne verweigert:
fatal: clean.requireForce is true and -f not given: refusing to clean
-d schließt Verzeichnisse ein. Ohne dieses Flag wäre build/ unangetastet
geblieben — clean arbeitet standardmäßig auf Dateien, und ein Verzeichnis, das
nur Ungetracktes enthält, wird übersprungen.
-x ist eine größere Sache, als es aussieht
Sieh dir an, was oben überlebt hat: ignored.log. Dateien, auf die eine Regel
in .gitignore passt, fasst ein einfaches git clean nicht an.
user@pc:~$ git clean -fdx
files after : .gitignore tracked.txt
-x entfernt auch die ignorierten Dateien. In einem echten Repository heißt das
.env, node_modules/, vendor/, Build-Caches, Editor-Zustand — also alles,
was du bewusst aus dem Repository herausgehalten hast, einschließlich der Dinge,
die lästig oder gar nicht wiederherzustellen sind.
-fdx ist für “gib mir einen jungfräulichen Stand” wirklich nützlich, deshalb
benutzt CI es. Auf dem eigenen Rechner führ vorher -ndx aus und lies die
Liste.
Es kümmert sich nur um Ungetracktes
Die naheliegende Annahme ist, clean liefere einen sauberen Baum. Tut es nicht:
tracked.txt after clean : keep modified
tracked.txt after restore : keep
Eine getrackte Datei, die du geändert hast, ist nicht ungetrackt — clean
ignoriert sie also vollständig. Diese Änderungen zu entfernen ist ein anderer
Befehl:
user@pc:~$ git restore . # Aenderungen an getrackten Dateien verwerfen
user@pc:~$ git clean -fd # ungetrackte Dateien entfernen
Beide Hälften zusammen sind das, was “alles zurücksetzen” tatsächlich bedeutet. Keiner der beiden erledigt die Aufgabe des anderen.
Es gibt nichts zurückzuholen
Jedes andere Rückgängigmachen in dieser Reihe hat ein Netz.
git reflog findet Commits nach einem
reset --hard, ein zwangsgelöschter Branch ist über seinen Hash erreichbar.
Bei ungetrackten Dateien gibt es nichts davon, und der Grund ist strukturell und keine fehlende Funktion: Sie waren nie im Index und nie in einem Commit, also ist nichts von ihnen je in der Objektdatenbank von git gelandet. Es gibt keine alte Fassung, zu der man zurückkehren könnte, weil git nie eine hatte.
Wenn du unsicher bist, parkt git stash --include-untracked sie stattdessen an
einer Stelle, aus der man sie zurückholen kann. Und git clean -i geht sie
interaktiv mit dir durch, was in einem Repository, das du nicht gut kennst, die
vernünftige Wahl ist.
Hinweis zu Netcup (Werbung)
Der deutsche Hoster Netcup bietet unter anderem günstige und zugleich leistungsstarke Webhosting Pakete, KVM-basierte Root Server und dezidierte Server an. Mit unseren Gutscheincodes kannst du noch mehr Geld sparen (6€ bei deiner ersten Bestellung, 30% Rabatt auf alle KVM-basierten Root Server, ...).