gitのconfig推奨設定
設定可能な項目を調べたければgit-config(1)にだいたい書いてある。個別のコマンドには CONFIGURATION セクションがある。
Gitの開発者がどんなオプションを設定しているのかはHow Core Git Developers Configure Gitでひとつの事例が紹介されていた。とてもいい内容なので忘れた頃に読み直すといい。
init.defaultBranch
Section titled “init.defaultBranch”デフォルトのブランチ名を設定する。
init.defaultRefFormat
Section titled “init.defaultRefFormat”デフォルトのストレージフォーマットを設定する。以下にある extension.refStorage も参照。
init.defaultObjectFormat
Section titled “init.defaultObjectFormat”デフォルトのハッシュアルゴリズムを設定する。以下にある extension.objectFormat も参照。
UI: 一般
Section titled “UI: 一般”column.ui
Section titled “column.ui”各種オブジェクトを一覧するときにマルチカラム化するかどうかの設定を行うオプション。スペースまたはカンマで区切った文字列を認識するので auto,column は正しい設定。
- always, never, auto: いつカラム化するか
- column, row, plain: どの順番でレイアウトするか
- dense, nodense: 列のサイズを不均等にするか
git tag や git branch など一覧を出力するコマンドすべてに影響する。
branch.sort
Section titled “branch.sort”ブランチを一覧するとき、どの順番で並び替えをするかの設定を行うオプション。2025年時点では以下のキー名を利用できる。
- **objectsize
- authordate
- committerdate
- creatordate
- taggerdate
- version:refname (または v:refname)
デフォルトは昇順だが、先頭に - を指定すると降順になる。
tag.sort
Section titled “tag.sort”基本は branch.sort と同じ。タグ名の場合、objectsize 等のキー名はタグ自身を指すが、頭に * を付けるとタグが参照する先のオブジェクトを対象とする。
commit.verbose
Section titled “commit.verbose”このオプションを true に設定すると、コミットメッセージを編集するときのテンプレートに、変更した差分情報が含まれるようになる。デフォルトでは変更のあったファイル名しか含まれない。
help.autoCorrect
Section titled “help.autoCorrect”歴史的な色々があったのだろうが、真偽値と考えうる値(1, 0, false, on, yesなど)は有効にするかどうかを設定し、2 以上の数値はディレイする時間を設定する。このとき単に 1 だけでは100ミリ秒待機する。
それ以外は never と immediate と prompt がある。
UI: 差分表示
Section titled “UI: 差分表示”diff.algorithm
Section titled “diff.algorithm”差分計算のアルゴリズムを設定する。
- myers
- minimal
- patience
- histogram
diff.colorMoved
Section titled “diff.colorMoved”コードブロックが移動したことを色で識別可能にするかどうかのモードを設定するオプション。おそらく互換性のために true を使えるようになっているが、明示的にモードを設定するほうがいいと思う。
- no: 色分けしない
- default: zebra と同じ
- plain: 色分けを行う、このとき color.diff.newMoved または color.diff.oldMoved を使う
- blocks: 色分けを行うが、最低でも20文字以上必要
- zebra: blocks と同じだが (new|old)MovedAlternative も使うらしい
- dimmed-zebra: zebra に対してさらに色の加減が変わるらしい
diff.mnemonicPrefix
Section titled “diff.mnemonicPrefix”git diff で差分を表示するとき、通常はファイル名の頭に a/ または b/ が固定で使われる。このオプションを有効にすると、ソース元の状態に応じていくつかの文字を選択的に使うようになる。
- i/ … インデックス
- w/ … 作業ディレクトリ
- c/ … コミット
- o/ … オブジェクト
プリフィックスを見るだけで何と何を比較したのか判断できるようになって便利らしい。
diff.renames
Section titled “diff.renames”git diff または類似のコマンドでファイル名のリネームを検出するオプション。
CPU負荷は多少上がるらしいが、有効にしておいても困らないだろう。
diff.conflictStyle
Section titled “diff.conflictStyle”コンフリクトしたときの表示方法を設定するオプション。
- merge
- diff3
- zdiff3
diff3 と zdiff3 はほぼ同じだけど zdiff3 のほうが無駄な表示が少し少ないらしい。
Gitのマージ戦略オプションは設定がない。
rerere.enabled
Section titled “rerere.enabled”Gitのコンフリクト自動解消機能を有効にするかどうかのオプション。このオプションを true にすると解決内容を記録するようになるが、コンフリクト時に自動適用するかどうかは rerere.autoUpdate で決定する。
rerere.autoUpdate
Section titled “rerere.autoUpdate”rerere.enabled で記録した解決内容を、コンフリクト発生時に自動適用するかどうかを決めるオプション。
rebase.autoSquash
Section titled “rebase.autoSquash”git rebase のとき —autosquash オプションを自動的に設定するかどうか。
何度か —autosquash を忘れてfixupコミットが残ったままになったことがあるので有効にしておいてもいいだろう。
rebase.autoStash
Section titled “rebase.autoStash”rebase.autoSquash と同様に —autostash オプションを有効にする。
これを有効にすると、git rebase の前に git stash を行って未コミットな変更を退避しておき、リベースが終わったら変更を元に戻すような動作となるらしい。
rebase.updateRefs
Section titled “rebase.updateRefs”レビューについて感じることでも書いたように大きな差分は妥当なレビューを行えないので、大きな変更を細かく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 ブランチが参照しているため一緒に更新されるだろう。
push.default
Section titled “push.default”git push で refspec を省略した場合に何を使うのか設定するオプション。Git 2.0からは simple がデフォルト値になった。
- nothing
- current
- upstream (または tracking)
- simple
- matching
色々あるけど、複数のブランチをまとめてプッシュしたいケースは多くないと思うので simple でいいと思う。
push.autoSetupRemote
Section titled “push.autoSetupRemote”このオプションを true に設定すると、プッシュ対象ブランチに上流ブランチが設定されてなければ自動的に設定される。
push.followTags
Section titled “push.followTags”このオプションを true に設定すると、ローカルにあってリモートにないタグをすべて送信するようになる。タグのプッシュ漏れを防ぐためには有用らしい。
fetch.prune
Section titled “fetch.prune”このオプションを true に設定すると、git fetch のとき —prune オプションが与えられた状態と同じ動作になるのでリモートから消えたブランチ等がローカルからも消される。
リモートごとに設定を変更したい場合は fetch.{remoteName}.prune オプションも利用できる。
fetch.pruneTags
Section titled “fetch.pruneTags”基本的に fetch.prune と同じ。
fetch.all
Section titled “fetch.all”このオプションを true に設定すると、すべてのリモートから更新を取得するようになる。
セキュリティ
Section titled “セキュリティ”transfer.credentialsInUrl
Section titled “transfer.credentialsInUrl”リモートのURLに秘匿情報を含んでいる場合の挙動を設定する。以下の3つからどれかを選択する。
- allow (default)
- warn
- die
通常利用でパスワードをURLに含むことはほとんど無いので warn か die でいいと思う。
extensions
Section titled “extensions”core.repositoryFormatVersion を 1 に設定すると 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).
extensions.objectFormat
Section titled “extensions.objectFormat”ハッシュアルゴリズムを設定する。git-init(1)の —object-format= オプションで設定する。
- sha1
- sha256
デフォルト値は以下のどちらかで設定できる。
- init.defaultObjectFormat
- GIT_DEFAULT_HASH
extensions.compatObjectFormat
Section titled “extensions.compatObjectFormat”相互運用のためのハッシュアルゴリズムを設定する。この値は extensions.objectFormat と異なる値にしなければならない。
extensions.refStorage
Section titled “extensions.refStorage”オブジェクトの管理方法を設定する。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