間違ったコミットをリモートにプッシュしてしまったとき、とても焦りますよね。そんなときに便利なコミットを打ち消すコマンド、git revert
の使い方について調べたので、まとめました。
git revertとは
git revertとは、以前のコミットを打ち消すためのコミットを作成するコマンドです。
少しわかりづらいですが、コミットを以前の状態に戻したコミットを作成します。コミットをなかったことにはせず、コミットを打ち消したという履歴が残ります。
どのコミットまで戻るか、どこのコミットを打ち消すかを指定することが可能です。
https://www.atlassian.com/ja/git/tutorials/undoing-changes/git-revert
git revert
は元に戻すコマンドの一種だと考えることもできます。ただし、通常の元に戻す操作とは異なる動作をします。プロジェクト履歴において、そのコミットがなかったことにするのではなく、そのコミットによって加えられた変更を打ち消し、その結果を含む新しいコミットを追加します。これは Git の履歴を保全するためであり、バージョン履歴の完全性の維持とコラボレーションの信頼性の確保のために重要です。
git revertでコミットを打ち消す
直前のコミットの打ち消し
直前コミットを打ち消すコミットを作成します。
git revert HEAD
コミットを指定して打ち消し
コミットIDを指定して、revertします。
git revert <打ち消したいコミットのID>
git logでコミットIDを調べる
打ち消したいコミットのIDを調べるには、git log
を使います。
git log
git log
すると、下記のようなコミットの履歴が出てきますので、revertしたいcommitのIDを控えておきます。※全部控えなくても、7~10文字程度あれば、特定できます。
commit d33a81ea57144f1506f01fa30786adf34fc3bdbc
→ commitの後ろの番号を使います。
commit d33a81ea57144f1506f01fa30786adf34fc3bdbc (HEAD -> feature/lesson26-3, origin/feature/lesson26-3)
Author: *********** <sample@gmail.com>
Date: Wed Feb 8 21:59:34 2023 +0900
fix: Remove finally.
commit 5c8fe6bab98247e2b8e65b87083e487a5bcc530e
Author: *********** <sample@gmail.com>
Date: Tue Feb 7 09:19:51 2023 +0900
fix: Wrapping up the login process.
git revert d33a81ea571
範囲を指定して打ち消し
コミットIDとコミットIDの間に、..
をつけると 範囲を指定することができます。
下記の場合は、2つ分のコミットをrevertしています。コミット自体は、別々のrevertコミットが作成されることになります。
git revert d33a81ea571..5c8fe6bab98
revertコマンドを実行すると、自動で下記のようなコミットメッセージが入力済みのエディタが立ち上がります。何も変更がなければそのまま編集を完了します。
※上記で、複数のコミットを指定した場合、それぞれのエディタが立ち上がります。
Revert "fix: Remove finally."
This reverts commit 5c8fe6bab98247e2b8e65b87083e487a5bcc530e.
複数のコミットをまとめてrevertしたいとき
git revert
に-n
というオプションをつけると、コミットを作らずに、revertだけを行うことができます。3つのrevertをまとめて、ひとつのコミットにすることができます。
git revert -n d33a81ea571 //コミットをしないでrebaseだけする
git revert -n 5c8fe6bab98 //コミットをしないでrebaseだけする
git revert a33a81ea172 //ここでまとめてコミット
git revertの取り消し
revertしたけど、やっぱりやめたいとき。※revertしたコミットをpushする前に使います。
git revert --abort
打ち消すコミットをPush
エディタを編集完了したら、リモートにPushします。
git push origin <pushしたいブランチ名>
ここまで行うと、GitHubで見ると、下記のような形で、Revertのコミット履歴が残ります。
git revertのデメリット
git revertは、打ち消したコミットも当然ですが、先程のGitHubの履歴を見てもわかるように、打ち消したというコミット履歴として残るため、履歴が汚くなりがちです。
git rebaseを使って、コミット履歴を綺麗にする方法もあるので、こちらは別途調べてみようと思います。
その他の方法 git resetでコミットをなかったことにする
git reset
は、完全にコミットをなかったことにしてくれます。git reset
は、git revertと違い、commit を取り消したという履歴が残りません。
そのため、個人開発やリモートにpushする前にだけ、使うようにすると良さそうです。
共同開発の環境で、リモートにpushした後は、誰かがプルして開発を進めているかもしれないため、混乱を招くので、使わない方が良さそうです。
git reset <打ち消したいコミットID>
おわりに
今回は、間違ったコミットをpushしてしまったときに便利なgit revertの使い方についてまとめました。revertをすると履歴が汚くなりがちなので、綺麗にまとめる方法についても調べてみたいと思います。