🔖

Gitで特定のコミットに強制的に戻す方法と、戻しすぎたときの対処法

に公開

※自分用のメモです

はじめに

Gitで開発をしていると「この変更、やっぱりなかったことにしたい」「あのコミットまで戻したい」と思う場面が出てきます。
今回は、特定のコミットに戻す方法を紹介します。
また、誤ってコミットを戻してしまっても、元に戻す方法も併せて紹介します。

ローカルリポジトリで特定のコミットに強制的に戻す

git reset --hard <コミットID>
  • --hard を付けることで、作業ディレクトリ(実際のファイル)とステージングエリア(インデックス)の両方が指定したコミットの状態に完全に上書きされます。

⚠️ 現在の変更内容はすべて失われるので注意が必要です

コミットIDの確認方法

まずは、戻したいコミットのIDを確認するために以下のコマンドを実行します。

git log

以下のように表示されます。
例えば、commit2では 2cb07fbがコミットIDです。
※Gitでは最初の数文字だけで一意に識別できればOKです。

commit 5fe60d238985aed7a17c077975ab193cb94e7e83 (HEAD -> main, origin/main, origin/HEAD)
Author: fd2025 <fd2025@example.com>
Date:   Wed Apr 16 13:35:30 2025 +0900

    commit3

commit 2cb07fb1a358d9a793c1de4ce5cb4bb2072b63e7
Author: fd2025 <fd2025@example.com>
Date:   Wed Apr 16 13:32:46 2025 +0900

    commit2

commit 36b2558835a3f0b9eb2a9f1d080648d9f58c7975
Author: fd2025 <fd2025@example.com>
Date:   Wed Apr 16 13:32:04 2025 +0900

    commit1

リモートリポジトリにも反映させたいとき

git push origin main --force
  • --force を使うことで、リモートリポジトリも変更履歴が上書きされます。
  • ただし、チームで共有しているブランチに対して行う場合は注意が必要です。自分だけが使っている環境や検証中のブランチであれば問題ないことが多いです。

戻しすぎたときに元に戻す方法

誤ってコミットを巻き戻してしまったとしても、git reflog を使えば以前の状態をたどることができます。
git reflog は一時的な操作履歴も記録しているので、誤ってresetした直後でもたいていのケースで戻せます。

git reflog

以下のように表示されます。

2cb07fb (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: reset: moving to 2cb07fb1a358d9a793c1de4ce5cb4bb2072b63e7
5fe60d2 HEAD@{1}: commit: commit3
...

表示された履歴から、戻したい状態の位置を確認したら、以下のように実行します。

git reset --hard HEAD@{1}
  • HEAD@{1} は、1つ前の操作時点の状態を指します。HEAD@{2}, HEAD@{3}…なども確認できます。

以下のコマンドでリモートリポジトリに反映します。

git push origin main --force

まとめ

Gitの操作は柔軟な反面、誤操作で履歴を書き換えてしまうと取り返しがつかないこともあります。
ただし reflog を活用すれば、巻き戻した履歴を復元できる可能性があるため、慌てずに状況を確認することが大切です。

今後も同じような場面があれば、この記事が自分や誰かの助けになれば嬉しいです。


🔗 関連記事

Discussion