Git

間違えてコミットした時に取り消す方法

間違えてgit commitをしてしまった時に取り消す方法を解説します。コミットを取り消す際の注意点と状況に応じたコミットの取り消し方も併せて解説します。

コミットを取り消す方法は2つある

Gitにはコミットを取り消すコマンドが用意されています。代表的なものとしてgit revertgit 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 revertgit resetの概要と使い方について解説してきました。どちらのコマンドも「コミットを取り消す」という点は同じです。ではどちらを使えば良いのでしょうか。

コミットがpushする前であればgit resetを使用し、pushした後であればgit revertを使用しましょう。

コミットのpush前と後で使い分ける理由は、git reset履歴に残らないからです。

例えばgit resetをリモートリポジトリにpush後のコミットに対して実行すると他の作業者に影響が出てしまう可能性があります。

反対にgit revertはコミットとして履歴に残るので、リモートリポジトリにpush後のコミットに対して実行してもその前にエラーが出て止まってくれますし、push前に気付いた際にpullする事が出来ます。

まとめ

Gitに慣れていないと間違えて操作した時に焦りますが、対処方法を覚えてしまえばこちらのものです。練習して徐々に慣れていきましょう。

最後までお読み頂きありがとうございました!

関連記事