Einen Commit mit interaktivem Rebase entfernen
Für komplexere Verlaufsmanipulationen, wie das Entfernen eines Commits aus der Mitte eines Branches, können Sie den interaktiven Rebase (git rebase -i) verwenden. Dies ist ein sehr mächtiger Befehl, der den Commit-Verlauf umschreibt, daher sollte er mit Vorsicht verwendet werden, insbesondere bei Branches, die mit anderen Entwicklern geteilt werden.
Unser Ziel ist es, den Commit mit der Nachricht "fix: Add a temporary file that should be removed" zu entfernen. Wenn wir uns den aktuellen Log ansehen, ist dieser Commit nun HEAD~3.
Starten Sie den interaktiven Rebase-Prozess:
git rebase -i HEAD~4
Dieser Befehl öffnet Ihren Texteditor (standardmäßig vim) mit einer Liste der letzten 4 Commits.
pick fd5a181 fix: Add a temporary file that should be removed
pick 5f27a4d docs: Update documentation in file1
pick 284be6f chore: Add last-commit file again
pick 8a460c5 Revert "feat: Add file2.txt"
## Rebase 9403080..8a460c5 onto 9403080 (4 commands)
#
## Commands:
## p, pick <commit> = use commit
## d, drop <commit> = remove commit
## ...
Um den Commit zu entfernen, ändern Sie das Wort pick in drop (oder d) für die Zeile, die "fix: Add a temporary file that should be removed" enthält.
Ändern Sie dies:
pick fd5a181 fix: Add a temporary file that should be removed
Zu diesem:
drop fd5a181 fix: Add a temporary file that should be removed
Drücken Sie in vim i, um in den Einfügemodus zu wechseln, nehmen Sie Ihre Änderungen vor, und drücken Sie dann Esc, um den Einfügemodus zu verlassen. Speichern und beenden Sie, indem Sie :wq eingeben und Enter drücken. Git wird die verbleibenden Commits auf den neuen Verlauf anwenden.
Überprüfen Sie den Log, um das Ergebnis zu sehen:
git log --oneline --graph
Der "schlechte" Commit ist nun aus dem Verlauf verschwunden.
* a5b4c3d (HEAD -> master) chore: Add last-commit file again
* f9e8d7c docs: Update documentation in file1
* 1e2d3f4 Revert "feat: Add file2.txt"
* 5e1a3b2 feat: Add file2.txt
* 1b4c0a9 feat: Add file1.txt
Überprüfen Sie auch die Dateien im Verzeichnis. Die Datei bad-commit-file.txt wurde entfernt.
ls