Humanity

Edit the world by your favorite way

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

stackoverflow.com

git grep の -n, -E を省略

こういう「いつもこのオプション指定してるけど省略できないかな?」って時は man git-grep して運良く用意されてると config のキーと説明が書いてあるのでおすすめです。

diff の a/..., b/... を表示させない

表示させないことで Vimgf, <C-w>f 等で飛べるようになって捗る。

git config --global diff.noprefix true

git diff 等でリネームを検知

git config --global diff.renames true

git blame で特定コミットを無視する(コードスタイルの修正は無視、等々)

具体的にはこういう場合に使います。

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

ちなみにそのコミットしかない場合(そのコミットで追加された場合)は無視指定したコミットも表示されます。


上記と意味合いは違いますが *1GitHub の blame のページでも似たような事はできるようです。

*1:無視するコミットを指定するのではなく、無視したいコミット以前の blame を表示する