【git】commitの取り消し方法を詳しく解説【reset・revertの違い】
gitにcommitしたのだけど、コードが間違ってた!commitを戻す(取り消す)方法はないかな?
gitの初心者や、gitに慣れていない方の中には、上記ような問題に直面したことがあるかもしれません。
例えば変更したコードに不正なコードが混ざっていて、それをcommit・pushしたことによってアプリケーションが動かなくなってしまうことや、単に間違えてcommitしてしまうこともザラにあります。
commitを戻すという方法は、共同開発では非常に重要です。強引な方法であれば、いくつかコミットを戻す方法はありますが、正しい知識を持ってcommitを戻さないと、リポジトリを破壊してしまう可能性もあります。
そこで今回は、
- commitを戻す方法(pushする前)
- commitを戻す方法(pushした後)
について紹介したいと思います。
とても簡単なので、ぜひ正しい知識を身につけて問題を対処できるようになりましょう。
今回の内容では、コードエディターはVSCodeを想定しています。また、commit・pushの最低限の知識も必要になります。まだよくわかっていないという方は、以下の記事も合わせてご覧ください。
commitを戻す方法(pushする前)
まずは、commitしたがまだpushはしていない状況でのcommitを戻す方法を解説しようと思います。pushをしていないということは、そのcommitはまだリモートリポジトリには反映されていないということになります。つまりVScode上でローカルリポジトリのコミットを戻せばいいということになりまね。
リセット
そのような状況で使うgitコマンドは、次のようなコマンドです。
git reset
このリセットコマンドを使うことでローカルリポジトリ上でのコミットを戻すことができます。ただし、このコマンドを単体で使うのではなくオプションを記述することで、使用可能になります。
- --soft
- --mixed
- --hard
それぞれのオプションを解説します。
--soft
まずはこのオプション。コマンドは以下の通りです。
git reset --soft HEAD^
HEAD^ は最新のcommitのこと。
つまり、一番新しいcommitを戻したいときに使用します。
このオプションをつけるとresetしたときに、コミットしたはずの1番新しいファイルの更新データが、「ステージング」段階に戻ってきます。
--mixed
次にこのオプション。コマンドの記述方法は以下の通りです。
git reset --mixed HEAD^
このオプションは、先ほどの--softとは異なり、戻ってくるファイルの変更が「ステージング段階」ではなく「変更」段階に戻ってきます。
--hard
最後にこのオプションです。コマンドの記述方法は以下の通りです。
git reset --hard HEAD^
このコマンドは、--softや--mixedと異なり取り消されるcommitのファイル変更が「ステージング」にも「変更」にも戻ってきません。つまり、commitを取り消した後に戻ってきたファイルを変更するといったことができません。完全に破棄です。正しい記述も存在したcommitだとしても、返ってきません。つまり。使用には少々注意が必要です。完全に不必要なコミットを取り消す場合以外は使用しないようにしましょう。
commitの範囲
次にcommitの範囲について解説します。
上記で解説したコマンドでは
HEAD^
を使用しましたが、他にもオプションがあります。
- 数字で戻すコミットを指定する
- コミット番号まで戻す
それぞれ解説します。
数字で戻すコミットを指定する
まずはこのオプションです。戻したいcommitが複数あるとします。HEAD^を何度もすれば戻すことができますが、少々面倒ですね。そこで以下のコマンドを使用します。
git reset --オプション HEAD~3
このコマンドは、最新順に3つcommitを戻すというコマンドです。HEAD^なら3回行った場合と同じ状況になります。
コミット番号まで戻す
次に紹介する方法が次のコマンドです。
git reset --オプション コミット番号
コミット番号の部分に、戻したいcommitの中で一番古いcommitの番号を指定します。そうするとそのcommitまでresetすることができます。あまり考えられないですが、resetする大量にある場合には戻る回数を数える必要もないため、便利なコマンドです。
以上が、ローカルリポジトリでcommitを戻す方法でした。コミットを戻した後は、またファイル変更を加えてcommitやpushを行うことができるため、作業も当然続けることができます。
commitを戻す方法(pushした後)
次にpushしてしまった後に、commitを戻す方法を紹介します。
pushしたということはリモートリポジトリにもcommitが反映されてしまっているため、先述したresetをするだけでは、リモートリポジトリに変更が反映されません。それどころか、ローカルリポジトリのみでresetしてしまうと、リモートリポジトリとローカルリポジトリの間に差分が生まれてしまい、pushができなくなってしまいます。push済みのcommitについては、resetではなく別のcommitを戻すコマンドがありますので紹介します。
リバート
pushしたcommitはリバートコマンドで戻すことができます。コマンドは次の通りです。
git revert HEAD^
このコマンドを使用することで、リモートリポジトリ・ローカルリポジトリ共にcommitを戻すことができます。
HEAD^ ではなくreset同様にコミット番号を指定することもできます。
git revert コミット番号
このコマンドを使えば、push済みでも安全にコミットを戻すことができます。pushしてしまった場合は、resetではなく必ずrevertを使うようにしてください。
最後に
ここまで、resetとrevertの方法について紹介してきました。
これらのコマンドは、知ってそうで知らなかったりするコマンドなのかなと思います。
私が初めて共同開発を行った時は、上記のコマンドすら知らず、pushしたときに不具合が出て本当に焦ったことがあります。ですが、上記のコマンドを知ってから、間違えてcommitしても戻すことができるため、安心感が生まれました。
これらのコマンドは共同開発だけでなく、当然個人開発でも必要になります。正しい知識を身につけて、安全なgit管理を行ってみてください。gitも知識が増えると楽しくなってきます。
ここまでお読みいただき、ありがとうございました。