Löschen eines Git-Commits

Wenn Sie mit Git arbeiten, werden Sie feststellen, dass Commits manchmal entfernt werden müssen, da sie einen Fehler verursacht haben oder überarbeitet werden müssen.

Wenn dies der Fall ist Das letzte Commit ist sehr einfach. Führen Sie einfach Folgendes aus:

git reset HEAD^

Dadurch wird das letzte Commit beendet, alle Änderungen an den Dateien bleiben jedoch erhalten.

Wenn Sie mehr als nur das letzte Commit löschen müssen, können Sie zwei Methoden verwenden. Das erste ist die Verwendung von Rebase. Auf diese Weise können Sie ein oder mehrere aufeinanderfolgende Commits entfernen. Das andere ist Cherry-Pick, mit dem Sie nicht aufeinanderfolgende Commits entfernen können.

Beispiel für ein Git-Protokoll

Nummer Hash Nachricht festschreiben Autor
1 2c6a45b (HEAD) Hinzufügen einer öffentlichen Methode Zugriff auf die geschützte Methode Tom
2 ae45fab Aktualisierungen der Datenbankschnittstelle Auftragnehmer 1
3 77b9b82 Verbessern der Datenbankschnittstelle Auftragnehmer 2
4 3c9093c Zusammengeführter Entwicklungszweig zum Master Tom
5 b3d92c5 Hinzufügen eines neuen Ereignis-CMS-Moduls Paul
6 7feddbb Hinzufügen von CMS-Klassen und -Dateien Tom
7 a809379 Projekt zu Git hinzufügen Tom

Verwenden von Rebase

Mit dem obigen Git-Protokoll möchten wir die folgenden Commits entfernen. 2 & 3 (ae45fab & 77b9b82). Da es sich um aufeinanderfolgende Commits handelt, können wir rebase verwenden.

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

zB zum Entfernen von Commits 2 & 3 oben

git rebase --onto repair~3 repair~1 repair

Verwenden von Cherry Pick

Schritt 1: Suchen Sie das Commit vor dem Commit Sie möchten git log

entfernen. Schritt 2: Überprüfen Sie, ob git checkout <commit hash>

Schritt 3 festgeschrieben ist : Erstellen Sie einen neuen Zweig mit Ihrem aktuellen Checkout-Commit. git checkout -b <new branch>

Schritt 4: Jetzt müssen Sie das Commit nach dem entfernten Commit hinzufügen. git cherry-pick <commit hash>

Schritt 5: Wiederholen Sie nun Schritt 4 für alle anderen Commits, die Sie behalten möchten.

Schritt 6: Sobald alle Commits zu Ihrem neuen Zweig hinzugefügt wurden und haben wurde begangen. Überprüfen Sie, ob alles im richtigen Zustand ist und wie vorgesehen funktioniert. Überprüfen Sie noch einmal, ob alles festgeschrieben wurde: git status

Schritt 7: Wechseln Sie zu Ihrem defekten Zweig git checkout <broken branch>

Schritt 8: Führen Sie nun einen Hard-Reset für den fehlerhaften Zweig auf das Commit durch, bevor Sie den git reset --hard <commit hash>

Schritt 9: Zusammenführen Ihres fester Zweig in diesen Zweig git merge <branch name>

Schritt 10: Schieben Sie die zusammengeführten Änderungen zurück zum Ursprung. WARNUNG: Dadurch wird das Remote-Repo überschrieben! git push --force origin <branch name>

Sie können den Vorgang ausführen, ohne einen neuen Zweig zu erstellen, indem Sie Schritt 2 & 3 durch Schritt 8 ersetzen Schritt 7 nicht ausführen & 9.

Beispiel

Angenommen, wir möchten Commits entfernen 2 & 4 aus dem Repo.

  1. git checkout b3d92c5 Überprüfen Sie das letzte verwendbare Commit.
  2. git checkout -b repair Erstellen Sie einen neuen Zweig, an dem gearbeitet werden soll.
  3. git cherry-pick 77b9b82 Führen Sie Commit 3 aus.
  4. git cherry-pick 2c6a45b Führen Sie Commit 1 durch.
  5. git checkout master Checkout-Master.
  6. git reset --hard b3d92c5 Setzen Sie den Master auf das letzte verwendbare Commit zurück.
  7. git merge repair Führen Sie unseren neuen Zweig auf dem Master zusammen.
  8. git push --hard origin master Schieben Sie den Master auf das Remote-Repo.

Schlussbemerkung

Git-Rebase & Cherrypick sind gefährlich, aber mächtig Lösungen, die nur als letzte verwendet werden sollten Option und nur von jemandem durchgeführt werden, der weiß, was er tut. Beachten Sie, dass beide Lösungen negative Auswirkungen auf andere Benutzer haben können, die an demselben Repository / Zweig arbeiten.

Denken Sie schließlich daran, vorsichtig zu sein und viel Glück zu haben!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.