6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

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を少なくとも1回実行している場合にのみ有効です。
  • 長期間経過すると、ガベージコレクションによってオブジェクトが削除される可能性があります。
  • リモートリポジトリにプッシュしていない場合に最も効果的です。

実際に復元できるか試してみよう

# ファイルを作成して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が あなたのコードを守るかもしれません!

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?