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: 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

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

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):

Änderungen entstagen:

$ git reset --mixed HEAD~1

Alle Änderungen verwerfen:

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

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 durch drop 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

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

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:

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.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: