不要なコミットを消したい
状況
プルリク出してレビューをお願いしようと、リモートの作業ブランチにプッシュした。直後に、不要なコミットが混ざっていたことに気づいたので特定のコミットを消したい。
解決策
-
git log
ローカルでまず不要なコミットのidを調べる -
git revert 不要なコミットのid
ローカルからコミットを削除(履歴は残る) -
git push origin リモートのブランチ名
リモートのコミットを上書きして不要なコミットを削除(履歴は残る)
この4ステップで完了。
git revert の流れ
コミットの履歴を確認
$ git log
コミットの履歴を見ることができます。コミットのid以外にも、Authorや日付、コミットメッセージも見ることができる。ここで消したいコミットのidを特定して、revertの際に指定してあげます。
revertコマンド
$ git revert コミットid
冒頭ではコミットを削除
と簡単に書いてしまいましたが、正しく表現すると指定したコミットを打ち消すコミットを新たに作る
という処理です。何にもなかったことにするわけではありません。
このあたりは運用ルール的なこともあるかと思いますが、個人的には消した履歴も残っててくれる方がありがたいので、この方法が良いです。
revertを実行すると、上記の通りコミットを新たに作るのですが、その際のコミットメッセージは元のままにすることもできますし、変更することも可能です。
revertしてコミットしない(複数コミットを一気に処理)
$ git revert コミットid -n
消したいコミットが複数ある場合は、-n
のオプションをつけると、コミットされずにrevertだけされます。一番最後にまとめてコミットできるので便利です。
完全に消したいとき
$ git reset コミットid
完全になかったことにする場合は、git reset
コマンドを使います。ただし履歴で遡れないので注意が必要です。
変更をリモートにプッシュ
$ git push origin リモートブランチ
ローカルでの変更をリモートにプッシュして上書きします。作業を打ち消すコミットをプッシュすることになるので、当然リモートにも履歴が残ります。
はじめてgit revert使った
はじめて使ったので、復習ついでにまとめました。gitはまだまだ使ったことないコマンド多いです。たまにやらかした時しかググって使わないので、使ったものはまとめていこうと思いました。
コミットを取り消す前に、もし誰かが作業を進めている可能性がある場合は、確認しないといけないですね。今回はゆるっとできる状況だったので問題なく取り消し作業できました。