【Git】一つ前のコミットに戻す方法を解説!状況別に使い分けよう

スポンサーリンク

Gitを使っていると、「直前のコミットをやり直したい」「一つ前の状態に戻したい」と思うことがよくあります。例えば、間違ったファイルを追加してしまったり、コミットメッセージを修正したくなったりすることもあるでしょう。

そんなときに便利なのが、Gitの 「コミットを戻す」 機能です。しかし、戻し方にはいくつかの方法があり、状況に応じて使い分ける必要があります。

本記事では、 git resetgit revert などを使って、一つ前のコミットに戻す方法を詳しく解説します。それぞれの使い方や違いを理解し、適切な方法を選べるようになりましょう!

git reset を使う(ローカルの変更を巻き戻す場合)

git reset は、直前のコミットを取り消し、変更をステージ(インデックス)やワークツリーに残すかどうかを選べるコマンドです。ローカルリポジトリの履歴を書き換えるため、他の人と共有する前の作業に適しています。

git reset の3つのオプション

  • --soft
  • --mixed
  • --hard

–soft オプション(コミットだけを取り消す)

使いどころ

  • 直前のコミットをやり直したいとき
  • ファイルの変更はそのまま残したいとき
git reset --soft HEAD~1

実行後

  • 直前のコミットが取り消される
  • ステージング(git add した状態)は維持される

そのまま修正して再コミットする場合

git commit -m "修正後のコミットメッセージ"

–mixed オプション(コミット + ステージを取り消す)

使いどころ

  • コミットも git add も取り消したい
  • でも、ファイルの変更内容はワークツリーに残したい
git reset --mixed HEAD~1

実行後

  • 直前のコミットが取り消される
  • ステージングされていたファイルがアンステージ状態(git statusChanges not staged for commit になる)

再度コミットしたい場合

git add .
git commit -m "修正後のコミットメッセージ"

–hard オプション(完全に元に戻す)

使いどころ

  • 直前のコミットも、ファイルの変更も完全に削除したいとき
  • 間違った変更をなかったことにしたい場合
git reset --hard HEAD~1

実行後

  • 直前のコミットが削除される
  • ステージングされていた変更も消える
  • ワークツリーのファイル変更もすべて消える(復元不可)

--hard を実行する前に、重要な変更がないか確認しましょう!
事前に git statusgit diff で変更内容を確認すると安全です。

git reset の注意点

  • git resetローカルでしか有効 なので、 すでにプッシュしたコミットには使わない こと!
  • プッシュ後に reset すると、リモートと履歴がずれてトラブルのもとになります。
    • もし reset --hard した後にプッシュしたい場合は、git push --force が必要(※慎重に!)

git reset はローカル作業の修正に便利ですが、すでにプッシュしたコミットには revert を使う方が安全です。
次のセクションでは git revert の使い方を紹介します!

git revert を使う(pushしたコミットを修正する場合)

git revert は、過去のコミットを 打ち消す新しいコミットを作成する コマンドです。履歴を保持したまま変更を取り消せるため、 すでにプッシュしたコミットを修正したい場合に最適 です。

git revert の特徴

✅ 履歴を残したまま変更を取り消せる
✅ チーム開発でも安全に使用できる
git reset のように履歴を改変しないので、リモートリポジトリとの不整合が起きない

git revert の基本的な使い方

直前のコミットを取り消すには、以下のコマンドを実行します。

git revert HEAD

実行後

  • HEAD(直前のコミット)の内容を打ち消す新しいコミットが作成される
  • これにより、変更を元に戻しつつ、履歴はそのまま残る

そのままcommitさせる場合

エディタが開いたら、そのまま git commit で確定するか、-m オプションでメッセージを指定できます。

git revert HEAD -m "前のコミットを取り消しました"

特定のコミットを取り消す

1つ前のコミットではなく、過去の特定のコミットを取り消す場合は、-m オプションをつけて、どの親ブランチを残すか指定する必要があります。例えば、git log で以下のようなマージコミットがあったとします。

b3c1d5f Merge branch 'feature-x'

このマージコミットを取り消すには、以下のように実行します。

git revert -m 1 b3c1d5f
  • -m 1 は「親ブランチ(通常 mainmaster)を残す」ことを意味する
  • -m 2 にすると、マージされた側のブランチを基準にする

git revert の注意点

  • reset と違い、履歴が改変されないため、チーム開発でも安全に使える
  • すでにプッシュしたコミットの取り消しには reset ではなく revert を使う べき
  • revert新しいコミットを作る ので、完全に履歴をなかったことにしたい場合には適さない(その場合は git reset

git revert については、こちらでも解説しています。ぜひ参考にしてみてください。

git checkout / git switch を使う(過去の状態に一時的に戻る)

git checkoutgit switch を使うと、 過去のコミットの状態に一時的に戻る ことができます。
これは、過去の状態を確認したいときや、一時的にブランチを分けて作業したいときに便利です。

過去の状態を確認する(git checkout)

コミット履歴を確認し、過去のコミットIDを取得します。

git log --oneline

例えば、以下のような履歴があった場合、

d1e3f45 最新のコミット
a2b7c89 修正: バグ修正
f5a3c9d 追加: 新機能
c8d9f21 初回コミット

過去のコミット a2b7c89 に戻って一時的に内容を確認したい場合、以下のコマンドを実行します。

git checkout a2b7c89

実行後

  • リポジトリの状態が a2b7c89 のコミット時点に戻る
  • このままだと「detached HEAD」状態になる(ブランチがないため、新しいコミットは履歴に残らない)

このまま変更を加えてコミットすると履歴に影響を与えるので、 新しいブランチを作成するのが安全 です。

安全に過去の状態で作業する(git switch -c)

過去の状態を元に 新しいブランチを作成して作業する こともできます。
これにより、履歴を壊さずに過去のコミットを活用できます。

git switch -c old-state a2b7c89

または、git checkout を使う場合、

git checkout -b old-state a2b7c89

実行後

  • a2b7c89 の状態を元に old-state という新しいブランチが作成される
  • このブランチで作業すれば、元の履歴を壊さずに変更を加えられる

まとめ

Gitで「一つ前のコミットに戻したい」と思ったとき、状況によって適切な方法を選ぶことが重要です。

  • ローカル作業をやり直したいなら git reset
  • すでにプッシュしたコミットを取り消すなら git revert
  • 過去の状態を一時的に確認したいなら git checkoutgit switch

間違ったコミットをしても、Gitの強力な履歴管理機能を活用すれば、安心して修正できます。
今回紹介した方法を活用し、快適なGitライフを送りましょう!

また、Gitには他にも便利なコマンドがたくさんあります。今後もさらにGitを活用したい方は、ぜひ公式ドキュメントや関連情報をチェックしてみてください!

Git
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました