W3docs

git rm

Erfahren Sie, was der Befehl git rm macht, welche Optionen er bietet, wie er sich von shell rm unterscheidet und wie Sie eine Entfernung rückgängig machen.

Der Befehl git rm entfernt eine oder mehrere Dateien aus einem Git-Repository. Diese Seite erklärt, was git rm tut, welche Optionen er akzeptiert, wie er sich vom rm der Shell unterscheidet, wie eine Entfernung rückgängig gemacht werden kann, und einige praktische Rezepte.

Was git rm macht

git rm entfernt getrackte Dateien – Dateien, die Git bereits kennt. Standardmäßig löscht er die Datei sowohl aus dem Arbeitsverzeichnis (die Dateien auf Ihrem Datenträger) als auch aus dem Staging-Index (dem Snapshot, den Git beim nächsten Commit aufzeichnen wird), und stagt diese Löschung, damit sie in Ihren nächsten Commit einfließt.

Ein paar Fakten, die Sie vorab wissen sollten:

  • git rm funktioniert nur mit getrackten Dateien. Er schlägt mit fatal: pathspec '...' did not match any files fehl, wenn Sie versuchen, eine ungetrackte Datei zu entfernen – Git hat diese Datei nicht verfolgt, sodass es nichts aufzuzeichnen gibt.
  • Er kann eine Datei nur aus dem Staging-Index entfernen (mit --cached), aber er kann eine Datei nicht nur aus dem Arbeitsverzeichnis entfernen – das ist ein einfaches Löschen, was der Shell-Befehl rm erledigt.
  • Er entfernt keine Branches, Tags oder Commits. Er berührt nur Dateien.
  • Die Entfernung ist erst nach einem Commit dauerhaft. Davor lässt sie sich leicht rückgängig machen (siehe git rm rückgängig machen).

git rm entfernt Dateien aus dem Arbeitsverzeichnis und dem Staging-Index

Ein typischer Arbeitsablauf sieht so aus:

git rm notes.txt        # deletes notes.txt and stages the deletion
git commit -m "Remove notes.txt"

Optionen des git rm-Befehls

OptionFunktion
<file>…Die zu entfernenden Pfade. Akzeptiert Datei-Globs wie *.txt.
-f, --forceÜberschreibt die Sicherheitsüberprüfung, die die Datei in HEAD mit dem Staging-Index und dem Arbeitsverzeichnis vergleicht. Erforderlich, wenn die Datei nicht committete Änderungen enthält.
-n, --dry-runFührt den Befehl aus, ohne tatsächlich etwas zu entfernen. Es werden nur die Dateien aufgelistet, die entfernt worden wären.
-rRekursiv. Erforderlich, um ein Verzeichnis zusammen mit seinem gesamten Inhalt zu entfernen.
--Trennt Optionen von Dateinamen. Verwenden Sie dies, wenn ein Dateiname als Option fehlinterpretiert werden könnte (zum Beispiel eine Datei mit dem Namen -f).
--cachedEntfernt die Datei nur aus dem Staging-Index. Die Kopie im Arbeitsverzeichnis bleibt unberührt.
--ignore-unmatchBeendet mit Status 0, auch wenn keine Dateien übereinstimmen. Nützlich in Skripten, die bei einem fehlenden Pfad nicht fehlschlagen sollen.
-q, --quietUnterdrückt die Ausgabe pro Datei, die git rm normalerweise ausgibt.

git rm rückgängig machen

git rm aktualisiert den Staging-Index und das Arbeitsverzeichnis, aber die Änderung ist erst nach einem Commit dauerhaft. Bis dahin können Sie die Datei mit gewöhnlichen Git-Befehlen wiederherstellen. Welcher Befehl benötigt wird, hängt davon ab, wie weit Sie zurückgehen möchten.

Bevor Sie die Entfernung committen

Um die Entfernung aus dem Index rückgängig zu machen, aber die Datei auf dem Datenträger gelöscht zu lassen, setzen Sie den Index-Eintrag auf HEAD zurück:

git reset HEAD <file>

Um die Datei vollständig wiederherzustellen – sowohl im Staging-Index als auch im Arbeitsverzeichnis – verwenden Sie den modernen Befehl git restore:

git restore --staged --worktree <file>

Die älteren Entsprechungen git reset HEAD <file> gefolgt von git checkout -- <file> funktionieren noch immer, aber git restore ist die empfohlene Methode in aktuellem Git.

Nachdem Sie die Entfernung committet haben

Wenn Sie bereits einen Commit erstellt haben, der die Löschung aufzeichnet, lebt die Datei nur noch in der Historie. Suchen Sie einen sicheren Punkt mit git reflog und stellen Sie die Datei aus einem Commit wieder her, in dem sie noch vorhanden war:

git restore --source=HEAD~1 <file>

Git rm vs rm

Der Shell-Befehl rm und git rm löschen beide Dateien vom Datenträger, aber Git behandelt sie sehr unterschiedlich.

Wenn Sie den einfachen Shell-Befehl rm auf eine getrackte Datei anwenden, stellt das Git-Repository fest, dass die Datei fehlt, und zeigt die Löschung als nicht gestagete Änderung an. Sie müssen dann noch git add (oder git add -u) ausführen, um sie vor dem Commit im Staging-Index aufzuzeichnen.

git rm erledigt beide Schritte auf einmal: Er löscht die Datei und stagt die Löschung, sodass sie sofort für den nächsten Commit bereit ist.

# Shell rm — deletion is unstaged, needs git add afterwards
rm notes.txt
git add notes.txt

# git rm — deletion is staged in one step
git rm notes.txt

Dateien nur aus dem Index entfernen

Ein häufiger Anwendungsfall ist das Aufbewahren einer Datei auf dem Datenträger, während Git sie nicht mehr verfolgen soll – zum Beispiel eine Konfigurationsdatei oder ein Build-Artefakt, das Sie versehentlich committet haben und jetzt ignorieren möchten. Verwenden Sie --cached:

git rm --cached secrets.env

Die Datei verbleibt in Ihrem Arbeitsverzeichnis; nur die getrackte Kopie wird entfernt. Fügen Sie den Pfad anschließend zu .gitignore hinzu, damit er nicht erneut hinzugefügt wird.

Beispiele

Alle .txt-Dateien in einem Ordner entfernen (Platzhalter):

git rm folder/\*.txt

Der Backslash vor * verhindert, dass Ihre Shell den Glob expandiert, sodass Git selbst ihn über die getrackten Dateien unter folder/ expandiert. Das trifft auch Pfade in Unterverzeichnissen, nicht nur direkte Unterelemente.

Dateien mit nicht committeten Änderungen erzwungen entfernen:

git rm -f git-*.sh

Ohne -f weigert sich git rm, eine Datei zu löschen, deren Arbeitsverzeichnis- oder gestageter Inhalt von HEAD abweicht, um Sie vor Datenverlust zu schützen. Das Force-Flag überschreibt diese Prüfung.

Eine Entfernung vorab anzeigen, ohne etwas zu löschen:

git rm -r --dry-run logs/

Dies listet die Dateien auf, die unter logs/ entfernt werden würden, sodass Sie den Umfang bestätigen können, bevor Sie den Befehl tatsächlich ausführen.

Mit shell rm gelöschte Dateien entfernen

Wenn Sie mehrere getrackte Dateien mit dem Shell-Befehl rm gelöscht haben und alle davon im nächsten Commit aufzeichnen möchten, stagen Sie alle Löschungen auf einmal:

git add -u
git commit -m "Remove obsolete files"

git add -u stagt Aktualisierungen an bereits getrackten Dateien, einschließlich Löschungen. Alternativ können Sie eine Liste der gelöschten Pfade erstellen und sie per Pipe an git rm --cached übergeben:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

--diff-filter=D wählt nur gelöschte Pfade aus, und das -z / -0-Paar verwendet NUL-Trennzeichen, sodass Dateinamen mit Leerzeichen sicher behandelt werden.

Übungen

Übung
Was sind die Funktionen und Optionen des Befehls 'git rm'?
Was sind die Funktionen und Optionen des Befehls 'git rm'?
Was this page helpful?