Git Commits sicher aus dem Verlauf entfernen
Es passiert schnell: versehentlich landen unerwünschte Änderungen oder vertrauliche Informationen in einem Git-Repository – lokal oder auf einem Remote-Server. Zum Glück stellt Git leistungsfähige Werkzeuge bereit, mit denen sich der Commit-Verlauf gezielt anpassen lässt. So kannst du Fehler korrigieren, sensible Daten entfernen und deine Historie bereinigen. Diese Anleitung zeigt dir verschiedene Möglichkeiten, wie du Commits sicher und effektiv löschen kannst – sowohl in lokalen als auch in geteilten Repositories.
Kurzübersicht der wichtigsten Befehle
Hier findest du eine kompakte Liste gängiger Git-Kommandos:
# Kompakte Commit-Historie anzeigen
$ git log --oneline
# Letzten Commit rückgängig machen (inkl. Änderungen verwerfen)
$ git reset --hard HEAD~1
# Einen bestimmten Commit via Rebase entfernen
$ git rebase -i HEAD~N
# Gelöschten Commit wiederherstellen
$ git reflog
$ git reset --hard HEAD@{n}
# Datei oder Verzeichnis dauerhaft aus Git-Historie löschen
$ git filter-repo --path <path> --invert-paths
Commits in Git anzeigen
Mit Git kannst du die Historie entweder kompakt oder ausführlich anzeigen lassen. So findest du gezielt die Commits, die du ändern oder entfernen möchtest.
Befehlsübersicht
git log [OPTIONS]
git log
: Zeigt alle Commits mit Hash, Autor, Zeitstempel und Nachricht.--oneline
: Zeigt jeden Commit in einer Zeile mit Hash und Message.
Kompakte Ansicht der Commit-Historie
$ git log --oneline
Beispielausgabe:
e2369629 removed requirement.txt file
2e39f29b Used Poetry for dependency management
2f7490ae modularized my code
de4c0fb8 Updated the ReadME file
39b41a37 Concluded unit testing
1acecd8c minor
5a1f681e Added a dockerfile, updated the readme and added a requirements.txt file
97c43fa3 remove comm.md
1f20c89f first commit
Ausführliche Commit-Historie
$ git log
Beispielausgabe:
commit e23696290557c029add5490d81bb305dc506f61c
Author: johndoe <johndoe@gmail.com>
Date: Sun Sep 1 20:03:36 2024 +0100
removed requirement.txt file
commit 2e39f29b49447219bc32a7fbdd6e8a5834b83911
Author: johndoe <johndoe@gmail.com>
Date: Sun Sep 1 20:00:50 2024 +0100
Used Poetry for dependency management
Mit den Pfeiltasten kannst du durch die Ausgabe scrollen. q
beendet die Ansicht.
Letzten Commit zurücknehmen
Um den letzten Commit rückgängig zu machen, nutzt du den Befehl git reset
. Je nach Reset-Variante werden Änderungen behalten, entstaged oder verworfen.
Befehlsübersicht
git reset [--soft | --mixed | --hard] HEAD~N
--soft
: Änderungen bleiben gestaged.--mixed
: Änderungen werden entstaged, bleiben aber lokal.--hard
: Alle Änderungen werden komplett gelöscht.
Beispiele
Änderungen behalten (gestaged):
$ git reset --soft HEAD~1
Änderungen entstagen:
$ git reset --mixed HEAD~1
Alle Änderungen verwerfen:
$ git reset --hard HEAD~1
Bestimmten Commit aus der Historie löschen
Um einen älteren Commit gezielt zu entfernen, kannst du eine interaktive Rebase verwenden und den Commit manuell löschen.
Befehlsübersicht
$ git rebase -i HEAD~N
Beispiel: Die letzten 8 Commits bearbeiten
pick 5fce205e Enhanced the ReadMe
pick 8404786f minor
pick f5879bb9 minor
pick c26abc6b minor
pick b1db91c2 minor
pick f18e3944 minor
pick ba58ebeb Used Poetry for dependency management
pick 8169d159 removed requirement.txt file
So funktioniert’s:
i
drücken, um in den Einfügemodus zu gelangen.pick
durchdrop
ersetzen beim gewünschten Commit.Esc
drücken, dann:wq
eingeben und Enter drücken.
Erfolgreiche Rückmeldung:
Successfully rebased and updated refs/heads/main.
Gelöschte Commits wiederherstellen
Wenn ein Commit durch ein Reset oder Rebase verloren geht, kannst du ihn oft über das Git-Reflog rekonstruieren. Dieses verfolgt, auf welche Commits HEAD in der Vergangenheit verwiesen hat.
Befehle zur Wiederherstellung
- Nach einem Hard Reset:
git reset --hard HEAD@{n}
- Nach einem Mixed Reset:
git reset --mixed HEAD@{n}
- Nach einem Soft Reset:
git reset --soft HEAD@{n}
Reflog-Einträge anzeigen
$ git reflog
Beispielausgabe:
7a9a8b2f HEAD@{0}: rebase (finish): returning to refs/heads/main
7a9a8b2f HEAD@{1}: rebase (pick): Used Poetry for dependency management
59c2d68e HEAD@{2}: rebase (start): checkout HEAD~8
8dbe3b9a HEAD@{3}: reset: moving to HEAD~1
Commit vor der Wiederherstellung anzeigen
$ git show HEAD@{3}
Zurücksetzen auf einen Reflog-Eintrag
$ git reset --hard HEAD@{3}
Zurücksetzen auf eine bestimmte Commit-ID
$ git reset --hard 8dbe3b9a
Vorschau des Commits anzeigen:
$ git show 8dbe3b9a
Dateien dauerhaft aus der Git-Historie entfernen
Um eine Datei oder ein Verzeichnis aus allen vergangenen Commits zu löschen, musst du die Historie umschreiben. Nur das Entfernen aus dem Staging-Bereich reicht nicht aus.
Für zukünftige Commits entfernen
$ git rm --cached <path-to-file>
$ git rm -r --cached <path-to-directory>
Aus gesamter Historie löschen (empfohlen)
$ git filter-repo --path <path> --invert-paths
git filter-repo zum Umschreiben der Historie nutzen
git filter-repo
ersetzt das ältere git filter-branch
und bietet bessere Geschwindigkeit, Stabilität und Bedienkomfort beim dauerhaften Entfernen von Dateien oder Ordnern aus der Git-Vergangenheit. Das Tool ist nicht standardmäßig in Git enthalten und muss separat installiert werden.
Schritt-für-Schritt: Dateien und Ordner mit git filter-repo löschen
Tool installieren
$ pip3 install git-filter-repo
Repository sichern
$ cp -r <your-repository-name> <your-repository-name-backup>
Datei aus der Historie löschen
$ git filter-repo --path <path-to-file> --invert-paths
Überprüfen, ob Datei vollständig entfernt wurde
$ git log --all -- <path-to-file>
Wenn keine Ausgabe erscheint, war das Löschen erfolgreich.
Verzeichnis aus der Historie löschen
$ git filter-repo --path <path-to-directory> --invert-paths
Überprüfen, ob Verzeichnis entfernt wurde
$ git log --all -- <path-to-directory>
Keine Ausgabe bedeutet, dass das Verzeichnis erfolgreich aus der Historie gelöscht wurde.
Fazit
In diesem Leitfaden hast du verschiedene Methoden kennengelernt, um Git-Commits gezielt zu entfernen oder wiederherzustellen. Du weißt jetzt, wie man mit git reset
Commits rückgängig macht, mit git rebase
gezielt einzelne Commits löscht, mit git filter-repo
Dateien oder Verzeichnisse dauerhaft aus der Historie entfernt und gelöschte Commits mithilfe von git reflog
wiederfindet.
Wichtig: In gemeinsam genutzten Repositories solltest du stattdessen git revert
verwenden, um Änderungen rückgängig zu machen, ohne die Historie umzuschreiben. Das Umschreiben sollte nur bei lokalen oder privaten Branches erfolgen, um Konflikte zu vermeiden.