【git】commitの取り消し方法を詳しく解説【reset・revertの違い】

【git】commitの取り消し方法を詳しく解説【reset・revertの違い】
記事内に広告が含まれています。
吹き出しのイメージ

gitにcommitをしたが、コードが間違っていた。commitを戻す(取り消す)方法はないかな。

開発において、例えば変更したコードに不正なコードが混ざっていて、それをcommit・pushしたことによってアプリケーションが動かなくなってしまうことや、単に間違えてcommitしてしまうことなどもザラにあります。

強引な方法であれば、いくつかコミットを戻す方法はありますが、正しい知識を持ってcommitを戻さないと、リポジトリを破壊してしまうおそれがあります。

そこで今回は、

  • commitを戻す方法(pushする前)
  • commitを戻す方法(pushした後)

について紹介したいと思います。

最後までご覧いただき、参考にしていただけると幸いです。

スポンサーリンク

commitを戻す方法(pushする前)

commitはしたが、まだpushはしていない状況でのcommitを戻す方法を紹介します。pushをしていないということは、そのcommitはまだリモートリポジトリには反映されていないということになります。つまりローカルリポジトリ上のコミットを戻せばいいということになります。

reset

そのような状況で使うgitコマンドは、次のコマンドです。

git reset

このresetコマンドを使うことでローカルリポジトリ上でのコミットを戻すことができます。次のオプションと合わせて使用します。

  • --soft
  • --mixed
  • --hard

それぞれのオプションを解説します。

--soft

まずはこのオプション。コマンドは以下の通りです。

git reset --soft HEAD^

HEAD^ は最新のcommitのこと。

つまり、一番新しいcommitを戻したいときに使用します。

このオプションをつけてresetすると、最新のコミットが「ステージング」段階に戻ってきます。

--mixed

次にこのオプション。コマンドの記述方法は以下の通りです。

git reset --mixed HEAD^

このオプションをつけてresetすると、先ほどの--softとは異なり、最新のコミットが「ステージング」段階ではなく「変更」段階に戻ってきます。

--hard

最後にこのオプションです。コマンドの記述方法は以下の通りです。

git reset --hard HEAD^

このコマンドは、--softや--mixedと異なり、最新のコミットが「ステージング」段階にも「変更」段階にも戻ってきません。完全にコミットが消えるので、使用には少々注意が必要です。本当に不必要なコミットを取り消す場合以外は、使用しないようにしましょう。

commitの範囲

次にcommitの範囲について解説します。

上記で解説したコマンドでは

HEAD^

を使用して、最新のコミットを指定しましたが、他にもオプションがあります。

  • 数字で戻すコミットを指定する
  • コミット番号まで戻す

それぞれ解説します。

数字で戻すコミットを指定する

まずはこのオプションです。戻したいcommitが複数あるとして、HEAD^を何度も実行すれば戻すことができますが、少々面倒ですね。そこで以下のコマンドを使用します。

git reset --オプション HEAD~3

このコマンドは、最新のコミットから3番目までのcommitを取り消します。HEAD^を3回行った場合と同じ状況になります。

コミット番号まで戻す

次にこのオプションです。

git reset --オプション コミット番号

コミット番号の部分に、取り消したいcommitの中で、一番古いcommit番号を指定します。実行すると、そのcommitまで全てresetされます。resetしたいコミットが大量にある場合には、戻る回数を数える必要もないため、便利なコマンドです。

以上が、ローカルリポジトリでcommitを取り消す方法でした。

スポンサーリンク

commitを戻す方法(pushした後)

次にpushしてしまった後に、commitを戻す方法を紹介します。

pushしたということはリモートリポジトリにもcommitが反映されてしまっているため、前述したresetをするだけでは、リモートリポジトリに変更が反映されません。それどころか、ローカルリポジトリのみでresetしてしまうと、リモートリポジトリとローカルリポジトリの間に差分が生まれてしまい、pushができなくなってしまいます。push済みのcommitについては、resetではなくrevertを使用します。

revert

pushしたcommitはrevertコマンドで戻すことができます。記述方法は次の通りです。

git revert HEAD^

このコマンドを使用することで、リモートリポジトリのcommitを戻すことができます。

HEAD^ではなく、コミット番号を指定して、そのコミットだけをrevertする方法もあります。

git revert コミット番号

これらのコマンドを使えば、push後でも安全にコミットを戻すことができます。pushしてしまった場合は、resetではなく必ずrevertを使うようにしてください。

スポンサーリンク

最後に

ここまで、resetとrevertの方法について紹介しました。

これらは共同開発に限らず、当然個人開発でも活用できます。正しい知識を身につけて、安全なgit管理を行ってみてください。

ここまでお読みいただき、ありがとうございました。

スポンサーリンク

シェアする

フォローする

応援する

リアル大学生 - にほんブログ村人気ブログランキング
もしこの記事が役に立ったなら、
こちらから ☕ を一杯支援いただけると喜びます

スポンサーリンク