Skip to content

gitのconfig推奨設定

設定可能な項目を調べたければgit-config(1)にだいたい書いてある。個別のコマンドには CONFIGURATION セクションがある。

Gitの開発者がどんなオプションを設定しているのかはHow Core Git Developers Configure Gitでひとつの事例が紹介されていた。とてもいい内容なので忘れた頃に読み直すといい。

デフォルトのブランチ名を設定する。

デフォルトのストレージフォーマットを設定する。以下にある extension.refStorage も参照。

デフォルトのハッシュアルゴリズムを設定する。以下にある extension.objectFormat も参照。

各種オブジェクトを一覧するときにマルチカラム化するかどうかの設定を行うオプション。スペースまたはカンマで区切った文字列を認識するので auto,column は正しい設定。

  • always, never, auto: いつカラム化するか
  • column, row, plain: どの順番でレイアウトするか
  • dense, nodense: 列のサイズを不均等にするか

git taggit branch など一覧を出力するコマンドすべてに影響する。

ブランチを一覧するとき、どの順番で並び替えをするかの設定を行うオプション。2025年時点では以下のキー名を利用できる。

  • **objectsize
  • authordate
  • committerdate
  • creatordate
  • taggerdate
  • version:refname (または v:refname)

デフォルトは昇順だが、先頭に - を指定すると降順になる。

基本は branch.sort と同じ。タグ名の場合、objectsize 等のキー名はタグ自身を指すが、頭に * を付けるとタグが参照する先のオブジェクトを対象とする。

このオプションを true に設定すると、コミットメッセージを編集するときのテンプレートに、変更した差分情報が含まれるようになる。デフォルトでは変更のあったファイル名しか含まれない。

歴史的な色々があったのだろうが、真偽値と考えうる値(1, 0, false, on, yesなど)は有効にするかどうかを設定し、2 以上の数値はディレイする時間を設定する。このとき単に 1 だけでは100ミリ秒待機する。

それ以外は neverimmediateprompt がある。

差分計算のアルゴリズムを設定する。

  • myers
  • minimal
  • patience
  • histogram

コードブロックが移動したことを色で識別可能にするかどうかのモードを設定するオプション。おそらく互換性のために true を使えるようになっているが、明示的にモードを設定するほうがいいと思う。

  • no: 色分けしない
  • default: zebra と同じ
  • plain: 色分けを行う、このとき color.diff.newMoved または color.diff.oldMoved を使う
  • blocks: 色分けを行うが、最低でも20文字以上必要
  • zebra: blocks と同じだが (new|old)MovedAlternative も使うらしい
  • dimmed-zebra: zebra に対してさらに色の加減が変わるらしい

git diff で差分を表示するとき、通常はファイル名の頭に a/ または b/ が固定で使われる。このオプションを有効にすると、ソース元の状態に応じていくつかの文字を選択的に使うようになる。

  • i/ … インデックス
  • w/ … 作業ディレクトリ
  • c/ … コミット
  • o/ … オブジェクト

プリフィックスを見るだけで何と何を比較したのか判断できるようになって便利らしい。

git diff または類似のコマンドでファイル名のリネームを検出するオプション。

CPU負荷は多少上がるらしいが、有効にしておいても困らないだろう。

コンフリクトしたときの表示方法を設定するオプション。

  • merge
  • diff3
  • zdiff3

diff3zdiff3 はほぼ同じだけど zdiff3 のほうが無駄な表示が少し少ないらしい。

Gitのマージ戦略オプションは設定がない。

Gitのコンフリクト自動解消機能を有効にするかどうかのオプション。このオプションを true にすると解決内容を記録するようになるが、コンフリクト時に自動適用するかどうかは rerere.autoUpdate で決定する。

rerere.enabled で記録した解決内容を、コンフリクト発生時に自動適用するかどうかを決めるオプション。

git rebase のとき —autosquash オプションを自動的に設定するかどうか。

何度か —autosquash を忘れてfixupコミットが残ったままになったことがあるので有効にしておいてもいいだろう。

rebase.autoSquash と同様に —autostash オプションを有効にする。

これを有効にすると、git rebase の前に git stash を行って未コミットな変更を退避しておき、リベースが終わったら変更を元に戻すような動作となるらしい。

レビューについて感じることでも書いたように大きな差分は妥当なレビューを行えないので、大きな変更を細かくPRしたいときは一連の変更であっても細かくPRを作成するよう注意している。例えば以下のような場合

gitGraph
commit
branch a
checkout a
commit
commit
branch b
checkout b
commit
branch c
checkout c
commit
commit

ここで、もし a をレビューして変更が必要になったとすると、3つのブランチに同じ操作を行う必要があって非常に面倒なので、こういうときに —update-refs を使えるらしい。

具体的には、リベースで変更されるコミットを参照する他のブランチがあれば、それも一緒に更新されるので、c ブランチで b のコミットを書き換えた場合、b ブランチも同じコミットを参照しているため更新対象となる。また、これは推測だが a ブランチの末尾にコミットを追加したとき、b ブランチでリベースを行うのだが、ここでも同じコミットを c ブランチが参照しているため一緒に更新されるだろう。

git pushrefspec を省略した場合に何を使うのか設定するオプション。Git 2.0からは simple がデフォルト値になった。

  • nothing
  • current
  • upstream (または tracking)
  • simple
  • matching

色々あるけど、複数のブランチをまとめてプッシュしたいケースは多くないと思うので simple でいいと思う。

このオプションを true に設定すると、プッシュ対象ブランチに上流ブランチが設定されてなければ自動的に設定される。

このオプションを true に設定すると、ローカルにあってリモートにないタグをすべて送信するようになる。タグのプッシュ漏れを防ぐためには有用らしい。

このオプションを true に設定すると、git fetch のとき —prune オプションが与えられた状態と同じ動作になるのでリモートから消えたブランチ等がローカルからも消される。

リモートごとに設定を変更したい場合は fetch.{remoteName}.prune オプションも利用できる。

基本的に fetch.prune と同じ。

このオプションを true に設定すると、すべてのリモートから更新を取得するようになる。

リモートのURLに秘匿情報を含んでいる場合の挙動を設定する。以下の3つからどれかを選択する。

  • allow (default)
  • warn
  • die

通常利用でパスワードをURLに含むことはほとんど無いので warndie でいいと思う。

core.repositoryFormatVersion1 に設定すると extensions キーを設定できる。

gitrepository-layout(5)には extensions が必要ないのなら 0 にするべきと書いてある。

Note that if no extensions are specified in the config file, then core.repositoryformatversion SHOULD be set to 0 (setting it to 1 provides no benefit, and makes the repository incompatible with older implementations of git).

ハッシュアルゴリズムを設定する。git-init(1)—object-format= オプションで設定する。

  • sha1
  • sha256

デフォルト値は以下のどちらかで設定できる。

  • init.defaultObjectFormat
  • GIT_DEFAULT_HASH

相互運用のためのハッシュアルゴリズムを設定する。この値は extensions.objectFormat と異なる値にしなければならない。

オブジェクトの管理方法を設定する。Gitのバックエンドはreftableもある。

  • files
  • reftable

途中で変更する手段がないので、git-init(1)またはgit-clone(1)—ref-format= オプションで設定しなければならない。

デフォルト値は以下のどちらかで設定できる。

  • init.defaultRefFormat
  • GIT_DEFAULT_REF_FORMAT
[diff]
algorithm = histogram
mnemonicPrefix = true
renames = true
[push]
default = simple
autoSetupRemote = true
followTags = true
[fetch]
prune = true
pruneTags = true
all = true
[rebase]
autoSquash = true
autoStash = true
updateRefs = true
[commit]
verbose = true
[rerere]
enabled = true
autoupdate = true
[core]
# fsmonitor = true
# untrackedCache = true
[merge]
# (just 'diff3' if git version < 2.3)
# conflictstyle = zdiff3
[pull]
# rebase = true