gitでブランチから辿れないcommitやblobを探し出す方法

いつも忘れるので、備忘録として書いとく。

特に、addしたけどreset --hardで消した時にいつも忘れる。

ブランチから辿れないobjectを表示する方法

fsck --lost-foundで一覧を表示できる。

$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (88/88), done.
dangling commit 0ae497f3455bb72de64ba5618f9dc6db32d449d0
dangling commit 15a084122e04c4219806059d3ac6b7a79bca9a29
dangling blob 23d0df1dbb0881569f1f7b5fe72c758e7ea5159d
dangling blob 3478c8236e83a196a81ea3675b6f77a98c7b4d73
dangling commit 4bf454d485479e62331e6225f9dbddb4e94adba5
(中略)

commitを探す方法

$ git fsck --lost-found | grep commit | awk '{print $3}'

これでsha1が表示できるので、適当にタグ付けたりすればGUIツールで探しやすい。

$ for sha1 in `git fsck --lost-found | grep commit | awk '{print $3}'`
do
  git tag tmp_$sha1 $sha1
done

見つけたら、cherry-pickなり、checkoutで救い出す。

blobを探す方法

とりあえずファイルにする。

$ mkdir blob
$ for sha1 in `git fsck --lost-found | grep blob | awk '{print $3}'`
do
  git show $sha1 > blob/$sha1
done

後は、grepするなりで頑張る。