KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

直前のコミットを取り消したい!

git定番のやつを解説です。

Gitを使っていて、「あ、やっぱり直前のコミット取り消したい!」と思うことは誰しもが経験するはずです。今回は、そんなときに使える定番の方法を解説します。誤ったコミットをなかったことにする方法から、内容はそのままでメッセージだけ修正する方法まで、シチュエーション別に説明します。

1. 直前のコミットを「なかったこと」にする

一番よくある「さっきのコミット、やっぱりなかったことにしたい!」というケース。

コマンド

git reset --soft HEAD~1

解説

  • git reset: リセットコマンドです。
  • --soft: コミットだけをなかったことにして、作業ディレクトリのファイル変更はそのまま残すオプションです。
  • HEAD~1: 直前の1つ前のコミットに戻す指定です。

使う場面

  • 直前のコミットメッセージを修正したいとき
  • 変更内容はそのままで、再度コミットしたいとき

注意点: git reset --softは履歴を巻き戻すため、公開リポジトリでの使用は要注意です。すでにリモートにプッシュしている場合は、後述のgit revertを使いましょう。


2. 直前のコミットを「完全になかったこと」にする

「コミットもなかったことにして、変更もすべてなかったことにしたい」という場合は、--hardオプションを使います。

コマンド

git reset --hard HEAD~1

解説

  • git reset: リセットコマンドです。
  • --hard: コミットも変更ファイルもすべてなかったことにするオプションです。
  • HEAD~1: 直前の1つ前のコミットに戻す指定です。

使う場面

  • 「やっぱりこの変更は不要だ」となったとき
  • 変更内容をすべて破棄したいとき

注意点: --hardオプションは変更内容もすべて消してしまいます。誤って実行すると取り返しがつかないことがあるので、慎重に使いましょう。


3. 直前のコミットメッセージだけを修正する

「内容はそのままで、コミットメッセージだけ変更したい!」という場合もよくあります。

コマンド

git commit --amend

解説

  • git commit --amend: 直前のコミットメッセージを修正するためのコマンドです。

コマンドを実行すると、テキストエディタ(通常はvim)が開き、メッセージの編集ができます。変更が完了したら、保存して閉じればOKです。

使う場面

  • 「コミットメッセージにタイプミスがあった」とき
  • 「もっとわかりやすいメッセージに変えたい」とき

注意点: これもすでにリモートにプッシュしている場合は注意が必要です。公開リポジトリで履歴を書き換えると、他のメンバーとコンフリクトする可能性があるからです。


4. 直前のコミットを「取り消し」つつ「変更は残す」

「コミットは取り消したいけど、作業内容はそのまま残しておきたい」という場合は、git resetを使う方法のほかに、git restoreも有効です。

コマンド

git reset HEAD~1

解説

  • git reset: リセットコマンドです。
  • HEAD~1: 直前の1つ前のコミットに戻す指定です。

このコマンドは、変更内容をステージングから外してワークツリーに戻すだけです。変更内容はファイルにそのまま残るため、すぐに再編集が可能です。

使う場面

  • 「コミットをやり直したいが、ファイルの変更はそのまま使いたい」とき
  • 「複数のファイルを別々のコミットに分けたい」とき

5. すでにプッシュしたコミットを取り消す

リモートにプッシュした後に取り消したい場合は、git revertが安全な方法です。

コマンド

git revert HEAD

解説

  • git revert: 新しいコミットを作成して、指定したコミットの変更を打ち消すコマンドです。
  • HEAD: 直前のコミットを指定しています。

このコマンドは、リモートリポジトリでも使えます。元のコミットを残しつつ、その変更を打ち消す新しいコミットが作られます

使う場面

  • すでにリモートにプッシュしてしまったとき
  • 履歴を改変したくないとき

注意点: これも履歴が増えるので、必要以上に多用しないようにしましょう。


まとめ

やりたいこと コマンド 変更内容 コミット履歴 作業ディレクトリのファイル
直前のコミットをなかったことに git reset --soft HEAD~1 なし 巻き戻す 残る
直前のコミットも変更もなかったことに git reset --hard HEAD~1 なし 巻き戻す 破棄
直前のコミットメッセージだけ修正 git commit --amend なし 上書き そのまま
コミットだけ取り消し変更は残す git reset HEAD~1 なし 巻き戻す 残る
プッシュしたコミットを取り消す git revert HEAD 取り消す 履歴に残す そのまま

Gitの「直前のコミットを取り消す」方法は、やりたいことに応じてさまざまな手段があります。履歴の変更がローカル限定かリモートに影響するかで、適切な方法を選びましょう。特に、公開リポジトリではgit revertが最も安全な選択肢です。自分の作業内容やチームの開発フローに応じて、これらの方法を使い分けてください!