8 中級 約 30 分

間違えた操作からの復元

誤コミット・誤削除・誤 reset など、よくあるミスから復元する手順を演習形式で学びます。

このチュートリアルでは、Git 操作でよくある「やってしまった」を、実際に復元する手順を演習形式で学びます。焦らず対処すればほとんどのミスは取り返せることを体験しましょう。

🛟 git reflog は命綱です

Git のほとんどの操作は、たとえ「消した」ように見えても .git 内にしばらく痕跡が残ります。git reflog は HEAD の移動履歴を記録しており、「もう戻れない」と思ったときの最初の確認先になります。パニックになる前に、まず git reflog を確認する癖をつけましょう。


演習 1:コミットメッセージを間違えた

typo のあるコミットメッセージでコミットしてしまい、まだ push していないとします。

問題: 直前のコミットのメッセージだけを「ログイン機能を追加」に修正するコマンドを書いてください(コミット内容自体は変更しない)。

答えを見る
git commit --amend -m "ログイン機能を追加"

--amend は直前のコミットを新しい内容で置き換えます。メッセージだけでなく、git add してから実行すればステージング内容も追加できます。

注意: --amend はコミットハッシュを変更します。すでに push 済みのコミットに対して行うと、リモートと履歴が食い違うため、共有ブランチでは避けてください。


演習 2:誤って git reset —hard してしまった

直前のコミットを消すつもりで git reset --hard HEAD~1 を実行したところ、実は2つ前まで戻ってしまい、必要なコミットまで消えてしまったとします。

問題: git reflog を使って、消えてしまったコミットを見つけて復元する手順を書いてください。

答えを見る
# 1. reflog で reset 前の HEAD の位置を確認する
git reflog
f9e8d7c HEAD@{0}: reset: moving to HEAD~2
e4f5g6h HEAD@{1}: commit: 必要なコミット
a1b2c3d HEAD@{2}: commit: その前のコミット
# 2. reset で消える前のコミット(e4f5g6h)に戻す
git reset --hard e4f5g6h

git reset --hard はブランチのポインタを動かすだけで、対象のコミット自体が即座に消滅するわけではありません。reflog に記録が残っている間(デフォルトで90日程度)は git reset --hard <戻りたいコミット> で復元できます。


演習 3:ブランチを誤って削除した

マージ済みだと思って git branch -D feature/important を実行したところ、実はマージされていない作業が残っていたとします。

問題: git reflog を使って削除したブランチの最終コミットを見つけ、ブランチとして復元する手順を書いてください。

答えを見る
# 1. reflog から該当ブランチの操作履歴を探す
git reflog
a1b2c3d HEAD@{3}: checkout: moving from feature/important to main

checkout: moving from feature/important to ... のような行から、削除される直前にそのブランチが指していたコミットハッシュ(a1b2c3d)がわかります。

# 2. そのコミットから同名のブランチを再作成する
git checkout -b feature/important a1b2c3d

これで feature/important ブランチが、削除前と同じ状態で復元されます。


演習 4:ファイルを誤って削除してコミットした

不要だと思って削除したファイルをコミットして push した後、実は必要なファイルだったと判明したとします。

問題: そのコミットの変更を打ち消す新しいコミットを作成するコマンドを書いてください(push 済みのため履歴は書き換えない)。

答えを見る
# 該当コミットのハッシュを確認
git log --oneline

# そのコミットの内容を打ち消す新しいコミットを作成
git revert a1b2c3d

git revert は履歴を書き換えず、削除を取り消す(=ファイルを復活させる)新しいコミットを追加します。すでに他の人と共有しているブランチに対しても安全に使えます。

削除されたファイル1つだけを個別に復元したい場合は、以下のように特定コミットからファイルだけを取り出す方法もあります。

git checkout a1b2c3d~1 -- path/to/deleted-file.js
git commit -m "誤って削除したファイルを復元"

演習 5:巨大ファイルを誤コミットした

node_modules/ のような巨大なディレクトリを .gitignore に入れ忘れたまま、うっかりコミットしてしまったとします(まだ push していない場合)。

問題: そのコミットを取り消しつつ、以後同じミスを防ぐ手順を書いてください。

答えを見る
# 1. 直前のコミットを取り消す(変更内容はステージング状態のまま残す)
git reset --soft HEAD~1

# 2. 巨大ファイル・ディレクトリをステージングから外す
git restore --staged node_modules/

# 3. 今後追跡しないよう .gitignore に追加
echo "node_modules/" >> .gitignore
git add .gitignore

# 4. 改めてコミットする
git commit -m "依存パッケージのインストールと .gitignore の整備"

すでに push 済みの場合、単に取り消すコミットを追加しても Git の履歴上には巨大ファイルのデータが残り続けます。リポジトリサイズの問題として本格的に対処する場合は git filter-repo などの専用ツールが必要になりますが、これは高度な操作なので、まずは「push する前に気づく」ことが最も重要です。


まとめ

コミットメッセージを直したい(直前 & 未push)        → git commit --amend
reset --hard で消えたコミットを戻したい              → git reflog → git reset --hard <hash>
削除したブランチを復元したい                          → git reflog → git checkout -b <branch> <hash>
push 済みの変更を打ち消したい                         → git revert <hash>
コミット前の巨大ファイルを取り消したい(未push)      → git reset --soft + .gitignore

どのケースでも共通するのは、まず git reflog で「今どこにいるか・どこに戻れるか」を確認してから行動するという姿勢です。慌てて追加の操作をする前に、現状を把握しましょう。