MeWrite Docs

git reset --hard で消した変更を復元したい

git reset --hardで失われたコミットや変更を復元する方法

概要

git reset --hard を実行して、必要なコミットや変更を誤って消してしまった場合の復元方法です。Stack Overflowで700万回以上閲覧されている人気の質問です。

エラー状況

1
2
3
4
5
6
7
# 誤ってハードリセットしてしまった
git reset --hard HEAD~3

# または
git reset --hard origin/main

# 変更がすべて消えた...

解決策

1. コミット済みの変更を復元(reflog)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# reflogで過去の操作履歴を確認
git reflog

# 出力例:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# d4e5f6g HEAD@{1}: commit: 重要な変更
# h7i8j9k HEAD@{2}: commit: 機能追加

# 復元したいコミットに戻る
git reset --hard HEAD@{1}

# または特定のコミットIDを指定
git reset --hard d4e5f6g

2. ブランチとして復元

1
2
3
4
5
# 失ったコミットを新しいブランチとして復元
git branch recover-branch HEAD@{1}

# または
git checkout -b recover-branch d4e5f6g

3. cherry-pickで特定のコミットのみ復元

1
2
# 現在のブランチに特定のコミットを適用
git cherry-pick d4e5f6g

4. ステージング済み(未コミット)の変更を復元

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# git addしていた場合、blobとして残っている可能性がある
git fsck --lost-found

# dangling blobを確認
ls .git/lost-found/other/

# 内容を確認
git show <blob-hash>

# ファイルに復元
git show <blob-hash> > recovered-file.txt

5. 未ステージングの変更(復元困難)

1
2
3
4
5
# git addしていなかった変更は基本的に復元不可
# ただし、IDEの履歴やバックアップを確認

# VS Code: File > Revert File
# IntelliJ: Local History > Show History

reflogの有効期限

1
2
3
4
5
6
7
8
# デフォルトでは90日間保持
git config gc.reflogExpire

# 期限を延長
git config gc.reflogExpire 180.days

# reflogを確認
git reflog expire --expire=now --all  # 危険:期限切れを即時削除

予防策

1. リセット前にバックアップブランチを作成

1
2
3
# 安全なリセット手順
git branch backup-before-reset
git reset --hard HEAD~3

2. git reset –softを検討

1
2
3
4
5
# コミットは取り消すが、変更はステージングに残す
git reset --soft HEAD~3

# コミットは取り消すが、変更はワーキングツリーに残す
git reset --mixed HEAD~3  # デフォルト

3. エイリアスを設定

1
2
3
4
5
# 安全なresetエイリアス
git config --global alias.safe-reset '!git branch backup-$(date +%Y%m%d%H%M%S) && git reset'

# 使用方法
git safe-reset --hard HEAD~3

よくある間違い

origin/mainにリセットした場合

1
2
3
4
5
6
# ローカルの変更がすべてoriginと同じになった
git reset --hard origin/main

# 復元
git reflog
git reset --hard HEAD@{1}  # reset前の状態

別のブランチにリセットした場合

1
2
3
4
5
6
# 間違ってdevelopにリセット
git reset --hard develop

# 復元
git reflog
git reset --hard HEAD@{1}

関連コマンド

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 直前のコミットを取り消し(変更は保持)
git reset --soft HEAD~1

# 特定ファイルのみリセット
git checkout HEAD -- file.txt

# stashに保存してからリセット
git stash
git reset --hard HEAD~3
git stash pop  # 必要なら復元

関連エラー

関連エラー

Git の他のエラー

最終更新: 2025-12-23