間違えてgit commitをしてしまった時に取り消す方法を解説します。コミットを取り消す際の注意点と状況に応じたコミットの取り消し方も併せて解説します。
目次
コミットを取り消す方法は2つある
Gitにはコミットを取り消すコマンドが用意されています。代表的なものとしてgit revert
とgit reset
が使われる事が多いです。当記事ではこの2つのコマンドについて解説していきます。
git revertを使用する方法
git revert
は指定したコミットを無効化するコミットを作成して既存のコミットを取り消します。コミットを無かったことにするコミットを追加するので履歴に残ります。
git revertの使い方
git revert コミットID
git revert
は取り消したいコミットのコミットIDを指定して実行します。直前のコミットを打ち消したい場合はHEAD
を指定します。
git revert HEAD
git revert
を実行するとエディタが立ち上がり、revertするコミットのコミットメッセージの入力が求められます。
revertのコミットメッセージを編集しない場合は--no-edit
オプションを付けて実行してください。
git revert コミットID --no-edit
このコマンドを実行すると、revertするコミットに付いていたメッセージでコミットされます。
複数のコミットを取り消す
git revert
で複数のコミットを取り消す方法を解説します。
複数のコミットを取り消したい場合は、単純に取り消したいコミットの数だけrevertを実行する事で実現します。
git revert コミット1
git revert コミット2
git revert コミット3
ただこの方法だと取り消したいコミットの数が多い場合、その分revertを実行しなければならないので大変です。これを解決するにはGitのコマンドの省略記法を使います。
git revert コミットID..コミットID
コミットIDを「・・」で区切って書く事で範囲を指定出来ます。左側に書くコミットがスタート地点となり、右側に書くコミットまでの範囲が対象となります。
git revert bbc6334..bb70fd2
上のコードの例では「コミットIDがbbc6334のコミットからコミットIDがbb70fd2のコミットまで」という意味になります。実際に使用する際はgit log
などでコミット履歴を確認して行いましょう。
マージしたコミットを取り消す
git revert
でマージしたコミットを取り消すことも出来ます。
git revert -m 1 コミットID
git revert
に-m
オプションを付けて実行します。
マージコミットを打ち消す場合は、マージしたコミットかマージされたコミットのどちらの状態に戻すのかを指定する必要があります。
方法としては-m
の後に数字の「1」か「2」を付けて指定します。「1」と「2」はマージ元のコミットを指します。git log
で履歴を確認した際に、マージしている場合は下記の表示があります。
Merge: b32b8f7 ed4e0c9
左側のコミットIDが「1」で右側のコミットIDが「2」です。「1」はマージ元のコミットで「2」はマージするコミットです。
git resetを使用する方法
git reset
はブランチのコミットのHEADの位置を移動させてコミットを削除するコマンドです。どの範囲まで削除するのかをオプションで設定して使用します。下記の3つがよく使われるオプションです。
- git reset –soft
- git reset –mixed
- git reset –hard
この3つのオプションを順番に解説していきます。
git reset –soft
git reset --soft
はコミットの取り消しのみを行うコマンドです。どのコミットの位置までHEADを移動させるかをコミットIDで指定します。
// 指定したコミットの位置までHEADを移動させる
git reset --soft コミットID
戻したいコミットを指定して実行すると、コミット前のステージングにファイルが上がっている状態に戻ります。
ファイルの編集からやり直したい場合は戻したいコミットの1つ前のコミットを指定します。
git reset --soft HEAD^
HEAD^
は最新のコミットの1つ前のコミットを指します。1つ前のコミットに戻る事でファイルの編集からやり直せます。
git reset –mixed
git reset --mixed
は、コミットの取り消しとステージングに上げたファイルの削除を行います。
git reset --mixed コミットID
「複数のファイルを編集していたけどステージングから下ろしたい」という時に使えるコマンドです。(追加したファイルは削除はされません)
git reset –hard
git reset --hard
は、コミットの取り消しと同時にステージングと作業ディレクトリの変更も削除します。
git reset --reset コミットID
「そもそも必要がない変更だった」というような場合に使えるコマンドですが、新しく追加したファイルなども全て消えてしまうので使う際は注意しましょう。
git revertとgit resetはどちらを使えばいいのか
git revert
とgit reset
の概要と使い方について解説してきました。どちらのコマンドも「コミットを取り消す」という点は同じです。ではどちらを使えば良いのでしょうか。
コミットがpushする前であればgit reset
を使用し、pushした後であればgit revert
を使用しましょう。
コミットのpush前と後で使い分ける理由は、git reset
が履歴に残らないからです。
例えばgit reset
をリモートリポジトリにpush後のコミットに対して実行すると他の作業者に影響が出てしまう可能性があります。
反対にgit revert
はコミットとして履歴に残るので、リモートリポジトリにpush後のコミットに対して実行してもその前にエラーが出て止まってくれますし、push前に気付いた際にpullする事が出来ます。
まとめ
Gitに慣れていないと間違えて操作した時に焦りますが、対処方法を覚えてしまえばこちらのものです。練習して徐々に慣れていきましょう。
最後までお読み頂きありがとうございました!