間違ってpushしたコミットを打ち消す方法 git revertの使い方

  • 2023.02.08
  • Git
間違ってpushしたコミットを打ち消す方法 git revertの使い方

間違ったコミットをリモートにプッシュしてしまったとき、とても焦りますよね。そんなときに便利なコミットを打ち消すコマンド、git revertの使い方について調べたので、まとめました。

git revertとは

git revertとは、以前のコミットを打ち消すためのコミットを作成するコマンドです。

少しわかりづらいですが、コミットを以前の状態に戻したコミットを作成します。コミットをなかったことにはせず、コミットを打ち消したという履歴が残ります。

どのコミットまで戻るか、どこのコミットを打ち消すかを指定することが可能です。

git revert は元に戻すコマンドの一種だと考えることもできます。ただし、通常の元に戻す操作とは異なる動作をします。プロジェクト履歴において、そのコミットがなかったことにするのではなく、そのコミットによって加えられた変更を打ち消し、その結果を含む新しいコミットを追加します。これは Git の履歴を保全するためであり、バージョン履歴の完全性の維持とコラボレーションの信頼性の確保のために重要です。

https://www.atlassian.com/ja/git/tutorials/undoing-changes/git-revert

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をすると履歴が汚くなりがちなので、綺麗にまとめる方法についても調べてみたいと思います。

まい

フロントエンドエンジニア目指して、勉強中です。

Gitカテゴリの最新記事