Git 小技集
- 追記 (2020/03/04): git grep の -n, -E を省略
- 追記 (2020/03/??): Git 小技集にタイトルを変えた。これまで Git 関連で運用してきて残った tips を載せる記事にすることに
- 追記 (2020/04/08):「git blame で特定コミットを無視する(コードスタイルの修正は無視、等々)」を追加
gitconfig
config/.gitconfig at 34455e0a0de426c9a79d7cf76ad0d6fc2c374fd6 · tyru/config · GitHub
特定サブコマンドの出力をページャに渡したい or 渡したくない
git config で変えられる。
わざわざ ls = !"git ls-files | less"
って alias を設定してたけど ls = ls-files
でよくなった。
# ページャに渡す git config --global pager.<command> true # ページャに渡さない git config --global pager.<command> false
git grep の -n, -E を省略
$ git config --global grep.lineNumber true
— tyru (@_tyru_) 2020年3月4日
$ git config --global grep.patternType extended
でまた git grep が便利になってしまった (-n, -E を省略)
こういう「いつもこのオプション指定してるけど省略できないかな?」って時は man git-grep して運良く用意されてると config のキーと説明が書いてあるのでおすすめです。
diff の a/...
, b/...
を表示させない
表示させないことで Vim の gf
, <C-w>f
等で飛べるようになって捗る。
git config --global diff.noprefix true
git diff 等でリネームを検知
git config --global diff.renames true
git blame で特定コミットを無視する(コードスタイルの修正は無視、等々)
具体的にはこういう場合に使います。
コードフォーマッターが存在しなかったリポジトリのコードにコードフォーマッターを入れてコミットするとオリジナルのline by lineのauthor情報が上書きされてblameやりにくくなる問題,皆さんどうされてますか
— 諦観が全てを解決する (@moznion) 2020年4月7日
--ignore-revs-file
で1行ごとにコミットハッシュを記述したファイルを渡すことで無視するコミットを指定できます。((より具体的には行頭・行末のスペースは無視され、空行、 #
で始まるコメント行も書けるようです https://git-scm.com/docs/git-fsck#Documentation/git-fsck.txt-fsckskipList https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt))
--ignore-rev
というのもあるようです。こちらはファイルではなく直接引数で無視するコミットを指定します。複数指定も可能でした (--ignore-rev {rev1} --ignore-rev {rev2}
)。
# 無視するコミットを改行区切りで指定 $ git log --grep 'cosmetic' --pretty=%H >.git-blame-ignore-revs $ git blame --ignore-revs-file=.git-blame-ignore-revs {file}
ちなみに1行で書く場合こんな感じ。
$ git blame --ignore-revs-file=<(git log --grep 'cosmetic' --pretty=%H) {file}
コミットメッセージでなく commit author で無視したり、色々組み合わせられる。
$ git blame --ignore-revs-file=<(git log --author 'tyru' --pretty=%H) {file}
ちなみに上記 twitter のリプライツリーで知りましたが、blame.ignoreRevsFile でファイルを指定すれば自動的に --ignore-revs-file
に指定されたようになるようです。cosmetic なコミットを列挙しておいてリポジトリに追加しておくとよさそうですね。
また git-hyper-blame というのもあるようで (--ignore-revs-file
追加前のツール?)、これだと .git-blame-ignore-revs
というファイルを自動的に見てくれるので同じことができるそうです(今は標準で使えるようになったので必要なさそう)。
なのでおそらく慣習的に、 .git-blame-ignore-revs
というファイルを置いておいて blame.ignoreRevsFile
に指定するのが良いっぽい。
# 無視するコミットを改行区切りで指定 $ git config blame.ignoreRevsFile .git-blame-ignore-revs
ちなみにそのコミットしかない場合(そのコミットで追加された場合)は無視指定したコミットも表示されます。
上記と意味合いは違いますが *1、GitHub の blame のページでも似たような事はできるようです。
例えばこういうblameのviewで, "view blame prior to this change" をたどるとその変更をどんどん追っていけるのかなとhttps://t.co/9bWFoIpdUZ pic.twitter.com/644kgZlpyp
— 諦観が全てを解決する (@moznion) 2020年4月7日
これ実質
— tyru (@_tyru_) 2020年4月7日
git blame {その行に表示されたコミットハッシュ}~ {ファイル}
のページを表示してるだけですね。
CLI でやるならこれで遡れるのか(そもそもコミット指定したことがなかった)
*1:無視するコミットを指定するのではなく、無視したいコミット以前の blame を表示する