git commitを消去する方法まとめ【revert, reset】

commitのコメントを間違えた!
以前のcommitをなかったことにしたい!

エンジニアであれば、誰でもそのような操作がしたくなるときがありますよね。

gitは、強力なバージョン管理ツールですが、使い方を間違えると一気にわけがわからなくなります。

今回は基礎的な内容ですが、commitを修正したいと考えたときの3つの修正方法を考えてみたいと思います。

commitを消す


gitのcommitを消す方法には主にresetとrevertの2つ、修正するにはrebaseとamendといった方法があります。

今回は直前のcommitをなかったことにするということで、resetとrevertについてお話していきます。

git reset

commitを修正する方法の一つとしてgit resetコマンドがあります。

git resetコマンドには、–soft, –mixed, –hardの3種類があります。

直前のコミットだけを消す

おそらく業務上、最も使いたいと思うのは「ファイルの修正は残しておきたいけど、commitを削除したい」というケースではないでしょうか。

そのようなケースでは、

$ git commit --soft HEAD~

を使います。

このコマンドは、直前のcommitを消去するもののインデックス、ファイルの変更は残します。(インデックスなどについてはこちらを参照)

変更ファイルもaddされた状態ですので、まさにcommitだけを消したいケースに適用できるコマンドなのです。

おそらくcommitを消す中でも最も使用頻度が高いコマンドではないでしょうか。

直前のcommitとaddを消す

続いて、先程のcommitを消すことに加えてaddも消したい!と考えたときには、

$ git commit --mixed HEAD~

を使います。

使用するケースとしては、適当に全てのファイルをaddしてそのままcommitしたけれど、commitされてはまずいファイルが入っていたときなどでしょうか。

もしくは、そもそもaddを消したいというときにも利用できますね。

直前のコミットだけでなく修正をなかったことにする

なんかファイルをいろいろ修正したけれど、仕様の変更や顧客の要求などによって、まるっと機能がなくなるなんてこともあるかもしれません。

commitもしたけれど、そもそもファイル修正も全部いらなくなったというときには、

$ git reset --hard HEAD~

を使います。

上記コマンドを使えば、一発でファイルを変更する前の状態まで戻ってくれます。

gitのステージングは、ワーキングディレクトリ、ステージングエリア、作業ディレクトリとありますよね。

git resetコマンドの3つのオプションは、この3つのステージングと対応して状態を戻してくれるコマンドと言えるのです。

間違えてgit reset –hardしてしまった場合


ついでに、間違えてgit reset –hardしてしまい、ファイルの修正なども全部なくなってしまった!というケースを考えてみましょう。

git reset –hardはそもそもの変更履歴を消去してしまうため、通常、ログを出力してくれるgit logコマンドでもlogを出力してくれません。

ですので、そういうときには、

$ git reflog

コマンドを使いましょう。git reflogコマンドはHEADのログを持っているため、git logでは出力してないログも出力してくれます。

git reflogコマンドでは、git resetで消去したものも含めたログが出力されます。

その中から元に戻りたいcommitを見つけて、再度git reset HEAD@{戻りたい数字}コマンドを打つことで元に戻ることができます。

多くのケースでは、

$ git reset --hard HEAD@{1}

で問題ないかと思います。

git revertとの違い


ここまで、git resetについてお話してきましたが、とgit revertはどのようなコマンドなのでしょうか。

git revertは、「取り消すcommitを削除するcommitを追加する」という動作になります。

使い方としては、

$ git revert [commit id]

として使います。

ですから、基本的な動作としてはgit revertはgit reset –hardと動作自体は変わりません。

唯一の違いがあるのは、commitを元に戻した履歴が残るかどうか?という点です。

git revertを使用したあとにgit logでログを出力してもらえればわかりますが、git resetのときにはログが残りませんが、git revertのときにはログが残ります。

commitログを残したいかどうか?を基準としてgit resetと合わせて活用していきたいところですね。

まとめ

今回は、commitを消去する方法についてお話しました。

一口にcommitを消去するといっても、動作としては数パターンあるため慣れないうちはややこしいと感じられるかもしれませんね。

実際に利用していくのが最も近道になると思われるので、どんどん使っていきましょう。

SNSでもご購読できます。

コメントを残す

*