先日、関わっているプロジェクトで不要なファイルを整理していたら、3000行も削除してしまっていました。
不要なファイルを整理しまくってたら3000行も削ることになってしまった。破壊活動だ…。 pic.twitter.com/XiHOtplGuo
— F.Shibusawa (@smartponzu) 2018年10月4日
既存のコードをリファクタリングしたり、要らないなと思ったファイルは容赦なく削除したりしてると、masterとの差分がとんでもないことになります。「どのファイルを削除したんだっけ?」って思って git diff --name-only
とかしても変更分と削除分が混ざってめちゃ見にくいです。
そんな時に、 --diff-filter=*
オプション!
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...) changed (T), are Unmerged (U), are Unknown (X), or
have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if there is any file
that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected.
Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
Note that not all diffs can feature all types. For instance, diffs from the index to the working tree can never have Added entries (because the set of paths included in the diff is limited by what is in
the index). Similarly, copied and renamed entries cannot appear if detection for those types is disabled.
変更した差分だけみたい時
$ git diff upstream/master --diff-filter=M
削除した差分だけみたい時
$ git diff upstream/master --diff-filter=D
リネームした差分だけみたい時
$ git diff upstream/master --diff-filter=R
なお、逆に特定の差分を除外したいなんて時もあると思います。そんな時は、
Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
とあるように、小文字を指定してあげればOKです。
例えば、削除した差分だけ除外したい時は、
$ git diff upstream/master --diff-filter=d
のように書けばOKです。まあ便利。
ぜひ3000行くらい削除して「もう何をどんくらい削除したか分からん!」ってときに使ってみてください。