Gitを使っていると、「直前のコミットをやり直したい」「一つ前の状態に戻したい」と思うことがよくあります。例えば、間違ったファイルを追加してしまったり、コミットメッセージを修正したくなったりすることもあるでしょう。
そんなときに便利なのが、Gitの 「コミットを戻す」 機能です。しかし、戻し方にはいくつかの方法があり、状況に応じて使い分ける必要があります。
本記事では、 git reset
や git 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 status
でChanges not staged for commit
になる)
再度コミットしたい場合
git add .
git commit -m "修正後のコミットメッセージ"
–hard オプション(完全に元に戻す)
使いどころ
- 直前のコミットも、ファイルの変更も完全に削除したいとき
- 間違った変更をなかったことにしたい場合
git reset --hard HEAD~1
実行後
- 直前のコミットが削除される
- ステージングされていた変更も消える
- ワークツリーのファイル変更もすべて消える(復元不可)
※--hard
を実行する前に、重要な変更がないか確認しましょう!
事前に git status
や git 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
は「親ブランチ(通常main
やmaster
)を残す」ことを意味する-m 2
にすると、マージされた側のブランチを基準にする
git revert の注意点
reset
と違い、履歴が改変されないため、チーム開発でも安全に使える- すでにプッシュしたコミットの取り消しには
reset
ではなくrevert
を使う べき revert
は 新しいコミットを作る ので、完全に履歴をなかったことにしたい場合には適さない(その場合はgit reset
)
git revert
については、こちらでも解説しています。ぜひ参考にしてみてください。
git checkout / git switch を使う(過去の状態に一時的に戻る)
git checkout
や git 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 checkout
やgit switch
間違ったコミットをしても、Gitの強力な履歴管理機能を活用すれば、安心して修正できます。
今回紹介した方法を活用し、快適なGitライフを送りましょう!
また、Gitには他にも便利なコマンドがたくさんあります。今後もさらにGitを活用したい方は、ぜひ公式ドキュメントや関連情報をチェックしてみてください!
コメント