Daten aus der Git-Historie entfernen

Wie man die Commit-Historie bearbeitet ohne alles kaputt zu machen (hoffentlich)

#Git#Sonstiges

How to git rebase

Das Versionierungstool git ist in vielen Situationen nützlich. Das liegt unter anderem daran, dass jeder noch so unwichtige Zwischenstand eines Projekts als commit in der git-Historie festgehalten wird und dort jederzeit mithilfe des Commands git checkout abgerufen werden kann. Lästig wird dies jedoch, wenn sich Dateien oder einzelne Zeilen in das Projekt eingeschlichen haben, die nachträglich und restlos entfernt werden sollen. Zum Beispiel, wenn ein Projekt veröffentlicht werden soll, und in einigen Commits Daten enthalten sind, die nicht für die Öffentlichkeit bestimmt sind. Dann reicht es natürlich nicht, diese im HEAD des aktuellen Branches zu löschen und die Änderung zu commiten, da die unliebsamen Daten in allen vorherigen Commits noch vorhanden sind, die nach ihrem Hinzufügen erstellt wurden.

In solchen Fällen muss die commit-Historie manipuliert werden. Dies ist ohne weiteres möglich, aber bietet auch die Möglichkeit, das Projekt nachhaltig kaputt zu machen.

Anleitung

  1. git rebase -i <hash>~1

    Startet den Rebase.<hash> sei durch den Hash des Commits zu ersetzen, in dem das Problem entstanden ist, in welchem also zum Beispiel die vertraulichen Daten hinzugefügt wurden. Das ~1 verweist auf den Commit vor dem genannten.

  2. edit statt pick
    Je nach Einstellung öffnet sich jetzt ein Texteditor, in dem alle Commits vom Problem-Commit bis zum aktuellen aufgelistet sind. Beim Problem-Commit muss nun edit statt pick eingetragen werden, damit im folgenden die Änderungen dieses Commits angepasst werden können.
  3. git add .
    Nun können alle gewünschten Änderungen getätigt und wie gewohnt z.B. mit diesem Command geaddet und mit
  4. git commit --amend comitted werden.
  5. git rebase --continue setzt den Rebase fort, zum Beispiel bis zum nächsten Commit, bei dem edit gewählt wurde. Alle Konflikte, die durch die getätigte Änderung entstehen, können nun wie andere Merge-Konflikte auch gelöst und mithilfe von Schritt 3, 4 und 5 übernommen werden. Tritt an irgendeiner Stelle ein Problem auf, kann der gesamte Rebase stattdessen mit git rebase --abort abgebrochen werden.

Kommentare

Noch Fragen?