削除したファイルを復活させるGitサブコマンドを書いた

2022/07/18に公開

gitで過去のコミットで削除したファイルを復活させるサブコマンド git unrm を実装したのでその紹介。

https://github.com/yoichi/git-unrm

削除したファイルを探す

git log --name-status で表示されるファイルのうち、行頭に D と表示されているものが削除されたファイル。
オプション --diff-filter=D を付けるとファイル削除したコミットのみを抽出できる。

削除される前のコミット

ファイル削除したコミットの親コミットには削除される前のファイルが含まれている。親コミットを取得するにはコミットIDの後ろに ~ を付ける。

特定コミットのファイルを取り戻す

git restore--source=コミットID とファイルパスを与えると指定したコミットIDのファイルの内容が取得される。

git restore --source=削除したコミットID~ 削除したファイルパス

ファイルが存在していればスキップ

今回実装したサブコマンドでは、復活対象のファイルが存在していればスキップするようにしている。

作業ツリー内に同名ファイルが存在していた場合に上書きしないようにするためと、 git log で履歴を辿りつつ復活したファイルをさらに過去の履歴から上書きしてしまわないようにするためを兼ねている。

やらなかったこと

  • 特定のファイルだけ選んで復活させる機能は実装していない。作業ツリーが散らかったらごめんなさい。
  • 作業ツリーにファイルを復活させる以上のことはしてない。git add なり git commit なりあとはよしなに。

Discussion