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. P. >
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.
-
git checkout b3d92c5
Überprüfen Sie das letzte verwendbare Commit. -
git checkout -b repair
Erstellen Sie einen neuen Zweig, an dem gearbeitet werden soll. -
git cherry-pick 77b9b82
Führen Sie Commit 3 aus. -
git cherry-pick 2c6a45b
Führen Sie Commit 1 durch. -
git checkout master
Checkout-Master. -
git reset --hard b3d92c5
Setzen Sie den Master auf das letzte verwendbare Commit zurück. -
git merge repair
Führen Sie unseren neuen Zweig auf dem Master zusammen. -
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!