⌨️シェル・Git

Gitで直前のコミットを取り消す方法(reset の使い分け)

「コミットを間違えた」「直前のコミットをやり直したい」——そんなときはgit resetで取り消せます。ただし変更内容を「残すか・消すか」でコマンドが違います。使い分けを知れば、安全にコミットをやり直せます。

git reset --soft HEAD~1   # 変更を残す(ステージ済み)
git reset --mixed HEAD~1  # 変更を残す(ステージ解除)
git reset --hard HEAD~1   # 変更も消す(注意)
オプションコミット取り消し変更内容
--soft取り消す残る(ステージ済み)
--mixed取り消す残る(ステージ解除)
--hard取り消す消える

3つの使い分け

変更内容をどうしたいかで選びます。

変更を残したい
コミットだけ取り消して書き直したいなら --soft か --mixed。変更内容はそのまま残るので、修正して再コミットできます。
変更ごと消したい
コミットも変更も完全になかったことにするなら --hard。ただし変更が消えるため、慎重に使います。
コツ:迷ったら--soft か --mixed が安全。変更内容が手元に残るので、やり直しがききます。HEAD~1 の「1」は「1つ前まで戻す」という意味です。

使うときの注意

resetは強力なので扱いに注意します。

  • --hardは要注意…変更が消えて戻せないことがある。実行前に確認を。
  • 共有済みは避ける…他の人と共有(push済み)のコミットをresetすると混乱のもと。
  • HEAD~の数字…2にすると2つ前まで戻る。
注意:すでにpush(共有)したコミットのresetは避けるのが基本です。チームで作業中の場合、履歴の書き換えはトラブルになります。共有済みを取り消したいときは、revert など別の方法を検討しましょう。

まとめ

直前のコミット取り消しはgit reset。変更を残すなら --soft / --mixed、変更ごと消すなら --hard(要注意)です。迷ったら変更が残る --soft / --mixed が安全。push済みのコミットへのresetは避け、必要なら revert を使いましょう。

よくある質問

Gitで直前のコミットを取り消すには?
git reset を使います。変更を残すなら git reset --soft HEAD~1(または --mixed)、変更ごと消すなら git reset --hard HEAD~1 です。
--soft・--mixed・--hardの違いは?
いずれもコミットを取り消しますが、--softは変更がステージ済みで残り、--mixedはステージ解除で残り、--hardは変更も消えます。迷ったら残る前者が安全です。
HEAD~1の意味は?
「1つ前のコミットまで戻す」という意味です。数字を2にすると2つ前まで戻ります。直前のコミットを取り消すならHEAD~1を使います。
push済みのコミットをresetしていい?
避けるのが基本です。共有済みの履歴を書き換えるとチームで混乱します。共有済みのコミットを取り消したいときは revert など別の方法を検討しましょう。