«前の日記(2016-12-15 (Thu)) 最新 次の日記(2017-08-01 (Tue))» 編集

雑記帳


2016-12-21 (Wed) [長年日記]

[git] stageしてcommitする前に消してしまったファイルを復活させる

作業中に、誤って必要なファイルを消してしまった。不要なファイルをgit rmしようとして、ついうっかり別の必要なファイルをgit rmしてしまった。しかも、そのファイルは新規の未コミットで、git addを使ってstageした状態のファイルだった。実際に削除する前に警告が出たものの、気がつかずに消してしまった後に気がついて、慌ててしまった。

しかし、幸いgit addしていたため、objectとしては残っているはずと思って、探そうと思った。そして見つけたのがこれ。

利用したのは、resolvedされている長い方の回答ではなく、もう一つの方。下記のようなスクリプトが書いてある。

for b in $(git fsck --lost-found | grep blob | awk '{print $3}'); do git cat-file -p $b | grep -q ${UNIQUE_CODE} && echo $b; done

これは、git fcsk --lost-foundを使って、commitからは辿れないオブジェクトを探す。それらをgit cat-fileして、UNIQUE_CODE に指定した、探しているコードに含まれているはずのテキストをgrepするというもの。

このコードを使って、消してしまったobjectのhash値が得られるので、git cat-file -p <hash> を実行して、中身を取り出すことができる。これで取り戻すことができた。

こういうことができるのが、gitのいいところである。