12
8

More than 3 years have passed since last update.

git fsck でcommitせずに消えたファイルを救出する

Last updated at Posted at 2021-01-21

概要

git fsckは,「データベース内のオブジェクトの接続性と有効性を検証する」(参考)

データベースに存在するが,git add したのにgit resetしてしまったなどで消えた宙ぶらりんのオブジェクトをとりだせる.

自分の状況

git: Version 2.30.0 
$ git add .
$ git reset --hard HEAD^

手が滑ってgit addしたのにgit resetしてしまった.
だからコミットできない.

$ git commit -m "hoge"
On branch master
Your branch is up to date with 'gitlab/master'.

nothing to commit, working tree clean

commitしていないからreflog使った救出もできない.

$ git reflog
5b916dc (HEAD -> master, gitlab/master) HEAD@{0}: reset: moving to HEAD^
d060d9a HEAD@{1}: commit: hoge
.
.
.

解決法

git fsckで消えたオブジェクトを見てみる.
--lost-foundのオプションを加えると,
「ぶら下がっているオブジェクトを .git/lost-found/commit/ または .git/lost-found/other/ に書き出します.オブジェクトが blob の場合は、オブジェクト名ではなく中身がファイルに書き込まれます.」(参考)
なるほど.

$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (77/77), done.
dangling commit 6a18de2e9c91d3357d7471b21a64bf7527d1e66a
dangling commit d060d9a81fe3d99bed3c519b4b41344849c40879
dangling blob 367187e5464b8e6e6faf7d21a702f0db31e6ff75
dangling commit 82997ff88a9542f69adf508066ae54e040478b28
dangling commit bbb9a5b0c0c3bd925fb160f348fa83a1a9dc68b8
dangling commit 555ec3c89716f7ab13f36443767bb4b0bce33bf0
dangling commit 6f0af95012d05fbc38bb8ddb7338bd8b0b240c48
dangling blob b33e342cdfdd49475a8ed114ff965373a851279f
dangling blob c9e63be87b5ff5c776db55708fae89e74ba613ed
dangling blob db425d36d2d0941731250c49e949c76623c3d0e8
dangling blob 6f531c6fbecb40ef9f8035e137075523f240c016
dangling blob f6cb583b7649358e7b23347eb037c72275590de8

中身を見るために一番下のハッシュを次のようにcatしてみる.

$ git cat-file -p f6cb583b7649358e7b23347eb037c72275590de8

出力された内容は,たしかに直前に編集して消えたものだった.
git fsckで出力されるdanglingにおいて,新しい宙ぶらりんのオブジェクト(ハッシュ)は一番下に追加されるようだ.
--lost-foundで書き込まれたファイルを探す.

$ ls .git/lost-found/other/
367187e5464b8e6e6faf7d21a702f0db31e6ff75  b33e342cdfdd49475a8ed114ff965373a851279f  db425d36d2d0941731250c49e949c76623c3d0e8
6f531c6fbecb40ef9f8035e137075523f240c016  c9e63be87b5ff5c776db55708fae89e74ba613ed  f6cb583b7649358e7b23347eb037c72275590de8

f6cb583b7649358e7b23347eb037c72275590de8があった.なので,

$vi .git/lost-found/other/f6cb583b7649358e7b23347eb037c72275590de8

で消えたファイルを開いてコピぺして戻した.

12
8
1

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
12
8