S-JIS[2016-01-30] 変更履歴

Git rm

Gitのrmコマンドのメモ。


概要

ステージングと呼ばれる領域(コミットする対象を保持するもの)に、ファイルの削除を登録するのが「git rm」コマンド。


「git rm」によって、ファイルを削除する。(削除されたことをステージングする)

$ git rm ファイル名1 ファイル名2…
$ git rm -r ディレクトリー名

「git rm」に拠らずに削除されたファイル(UNIXのrmコマンドや、エディターの削除機能等で削除したファイル)は、ファイル名の補完が効かないので、指定するのが面倒。

削除されたファイル一覧は「git status」で表示されるので、それをコピーして「git rm」の引数に指定し直せばいいのだが、数が多いと面倒。

「git ls-files --delete」あるいは「git ls-files -d」を使うと(git管理下から)削除されたファイル一覧を表示することが出来るので、それを「git rm」の引数に指定すれば楽。

$ git rm $(git ls-files --deleted)

参考: あっきぃさんの『削除したファイルをコミットする Git


削除したファイルの内容を確認する方法

過去に削除したファイルの内容を参照するには、「git cat-file」あるいは「git show」を使う。

「git cat-file」や「git show」に、削除したファイルのパスリビジョン(コミットのハッシュ値)を指定すればファイルの内容を見ることが出来る。
「git show」はUNIXのlessコマンドでファイルを表示する。
「git cat-file」はファイルの内容を標準出力に出力するので、リダイレクトでファイルに保存することが出来る。

なのだが、ファイル名はまだしもパスを正確に覚えているとは限らないし、リビジョンに至っては知っている方が不自然(爆)
なので、まずはそれらを調べる必要が有る。


git log --statで探す方法

「git log --stat」で、リビジョン(コミットのハッシュ値)とそのコミットで変更(追加・削除)されたファイルの一覧が表示されるので、そこから該当ファイルを(目grepで)探す。
コミット数が多いと、探すのは大変だけど(苦笑)

$ git log --stat
〜
commit e6c75c8002b65882bf52b519ebf75d3f89bf7cbf
Author: hishidama <hishidama@mailaddress>
Date:   Sat Jan 30 20:20:50 2016 +0900

    Remove dir

 dir/test.txt |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
〜

これでファイルを削除した時のコミットのハッシュ値ファイルのパスが分かるので、それを使ってファイルの内容を表示する。

$ git cat-file -p e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt
あるいは
$ git show e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt

表示したいリビジョンとパスをコロン「:」で区切って指定する。
リビジョンの末尾に「^」が付いているのは、ひとつ前のリビジョンを意味している。つまりファイルが削除される前のリビジョンを指定していることになる。 表示したいのは、削除前の内容なので。


git log --name-statusとgit rev-listで探す方法

「git log --name-status」で、ファイルのパスと変更の種類(追加ならA、変更ならM、削除ならDが先頭に付いた状態)が表示される。
(grepに指定した「^D」は正規表現で、「先頭の文字列がD」という意味)

$ git log --name-status | grep ^D | grep test.txt
D       dir/test.txt

これで、ファイルのパスを確認することが出来た。

次に、コミットのハッシュ値を探す。

$ git rev-list -n 1 HEAD -- dir/test.txt
e6c75c8002b65882bf52b519ebf75d3f89bf7cbf

「git rev-list HEAD -- パス」で、そのファイルが今まで変更された全てのコミットのハッシュ値が表示される。「-n 1」を付けると、先頭ひとつだけ、つまり一番最新のハッシュ値が取れる。
今回は削除されたファイルを指定したので、最新のコミットとは、削除した時のコミットということになる。

これでファイルを削除した時のコミットのハッシュ値ファイルのパスが分かったので、ファイルの内容を表示できる。

$ git cat-file -p e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt
あるいは
$ git show e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt


Git目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま