はじめに
Gitを使っていると、誤って削除したファイルやコミットを戻したいと思うことがありませんか?
tab
を押してると、「git reset --hard
してしまったぁ〜!!」なんてこともあるかもしれません(脳死ポチポチ絶対ダメ)
実は、git add
を一度でも行っていれば、データを復元できる可能性が高いのです。
Gitの神機能Blobオブジェクト
Gitの内部では、git add
を実行すると、ファイルの内容はBlobオブジェクトとしてGitのオブジェクトデータベースに保存されます。これは、ファイルが一度でも Git の追跡対象になると、その内容が完全に失われることはないことを意味します。
Gitオブジェクトの仕組み
Gitには4つの主要なオブジェクトがあり、互いに密接に関連しています:
- Blob Object: ファイルの実際の内容を保存
- Tree Object: ディレクトリ構造とファイル名を管理
- Commit Object: プロジェクトのスナップショットを記録
- Tag Object: 特定のコミットに名前を付ける
失われたデータを取り戻す:git fsck
git fsck
git fsck
は、どこからも参照されていないオブジェクト(ダングリングオブジェクト)を見つけ出す、いわば「データレスキュー隊長」のようなコマンドです。
git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob <blob_hash>
復元の実践ステップ
1. 対象のblobを特定
下記のコマンドで自身の復元したいコードを探します。
# ダングリングオブジェクトを探す
git fsck --lost-found
# 出力例
# Checking object directories: 100% (256/256), done.
# dangling blob <blob_hash>
# ダングリングオブジェクトの内容を確認
git cat-file -p <blob_hash>
2. ファイルとして復元
1.
で復元したい内容を見つけたら、以下のコマンドを実行してみましょう。
たったこれだけ!
# ダングリングBlobをファイルに復元
git show <dangling-blob-hash> > recovered_file.txt
実際に復元できるか試してみよう
# ファイルを作成してgit addする
echo "test content" > testfile.txt
git add testfile.txt
# ファイルを削除
rm testfile.txt
# ダングリングオブジェクトを確認
git fsck
# オブジェクトを確認
git cat-file -p <dangling-blob-hash>
# オブジェクトをファイルとして復元
git show <dangling-blob-hash> > recovered_file.txt
終わりに
実は、git add
は単なるステージングコマンドではありません!
それは、あなたの大切なコードを安全に保存するための最初の一歩であり、最も信頼できる入り口なのです。
こまめなcommit
ができなくても、git add
が あなたのコードを守るかもしれません!