share facebook facebook2 twitter menu hatena pocket slack

2017.01.16 MON

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

磯辺 和彦

WRITTEN BY 磯辺 和彦

作業中に、誤って必要なファイルを消してしまった。不要なファイルを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のいいところである。

元記事はこちら

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

磯辺 和彦

磯辺 和彦

cloudpackに参加して以来、設計・構築・運用・開発・セキュリティなど様々な経験を経て、現在は主に社内インフラ関連を担当中。WEB+DB Press Vol.85に記事書きました。