git config --global init.defaultBranch mainCode language: CSS (css)
1. リポジトリの初期ブランチがmaster
VS Codeでリポジトリを作成したとき、初期ブランチがmasterになっていました。
最近はmainが標準になっているはずなのに、なぜmasterなのか。
実務上の解決策は同じです。
環境や配布元に依存させず再現性を担保したいなら、init.defaultBranchを明示的に設定するのが最も確実です。
git config --global init.defaultBranch mainCode language: CSS (css)
この設定を行えば、今後のgit initは常にmainになります1。
VS Codeで作成しようがターミナルで作成しようが、挙動が揃います。
1.1. 最初の仮説:VS Codeの設定?
実は以前、別のプロジェクトではmainになっていた記憶があります。
つまり、VS Codeで作ると「ときどきmaster、ときどきmain」になるということです。
この挙動の違いは何で決まるのでしょうか。
まず考えたのは「VS Codeが独自に初期ブランチ名を決めているのでは」という仮説です。
しかし、少し調べてみると、VS Codeは内部でgit initコマンドを呼び出しているだけでした。
つまり、初期ブランチ名を決めているのはVS CodeではなくGit側の可能性が高いのです。
そうなると、問題は「Gitがどうやって初期ブランチ名を決めているか」に移ります。
1.2. Gitの初期ブランチ設定を確認する
Gitがgit initを実行するとき、初期ブランチ名を決める要素は主に2つあります。
- 1つ目は
init.defaultBranchという設定項目です。
Git 2.28以降で導入されたもので、ユーザーが好きな初期ブランチ名を指定できます2。 - 2つ目は環境変数
GIT_DEFAULT_BRANCHで、こちらは設定ファイルよりも優先されます。
まず、これらの設定を確認しました。
git config --show-origin --get init.defaultBranch
Code language: JavaScript (javascript)
何も表示されません。グローバル設定も確認してみます。
git config --global init.defaultBranch
Code language: CSS (css)
これも何も返ってきませんでした。
環境変数も調べてみます。
echo $GIT_DEFAULT_BRANCH
Code language: PHP (php)
やはり空です。
念のため、Gitのバージョンも確認しておきます。
git version
結果はgit version 2.49.0でした。
かなり新しいバージョンです。
ここまでの確認で分かったのは、「ユーザーが明示的に初期ブランチ名を設定していない」ということです。
それなのにmasterになっているのはなぜでしょうか。
1.3. VS Codeを除外して検証する
原因を絞り込むため、VS Codeを完全に排除した環境で実験してみることにしました。
もしVS Codeが何か特別なことをしているなら、ターミナルから直接git initしたときは違う結果になるはずです。
テスト用のディレクトリを作成し、その中でgit initを実行してみます。
mkdir /tmp/git-default-branch-test
cd /tmp/git-default-branch-test
git init
Code language: JavaScript (javascript)
すると、Gitからヒントメッセージが表示されました3。
hint: Using 'master' as the name for the initial branch.
Code language: JavaScript (javascript)
現在のブランチ名を確認してみます。
git branch --show-current
結果はmasterでした。
この結果は重要です。VS Codeを使わず、素のgit initでもmasterが作られるということは、原因はVS Codeではなく、私の環境のGit自体の挙動にあることが確定しました。
2. なぜGit 2.49.0でmasterになるのか
次の疑問は「macOSで、しかもGit 2.49.0という新しいバージョンなのに、なぜmasterになるのか」という点です。
一般的には「最近のGitはmainがデフォルト」という印象がありますが、実際には「バージョンが新しい=必ずmain」ではありません。
未設定の場合、Gitの配布形態やビルド設定によって、デフォルトがmasterのまま残っているケースがあるのです。
そこで、実際にどのGitを使っているのかを調べることにしました。
3. Gitの配布元を特定する
まず、シェルがどのgitコマンドを解決しているのかを確認します。
which git
結果は/usr/local/bin/gitでした。
macOSでは、/usr/bin/gitはApple提供のGit(Xcode Command Line Tools由来)である可能性が高く、/usr/local/bin/gitはHomebrewでインストールしたGitである可能性が高い場所です4。
Homebrewが本当にこのGitを管理しているのか確認してみます。
brew list git
Code language: PHP (php)
出力には大量のパスが表示されましたが、その中に次のようなパスが含まれていました。
/usr/local/Cellar/git/2.49.0/...
これは決定的な証拠です。
HomebrewのCellarディレクトリ配下にインストールされたGitの実体を示しています。
つまり、使用中のGitはHomebrew経由で導入されたものです。
さらに、brew list gitの出力の先頭には.bottle/etc/gitconfigというファイルも含まれていました。これはHomebrew配布に付随するシステムレベルの設定ファイルです5。
4. 2つの可能性
ここまでで確定した事実を整理します。
- 使用中のGitはHomebrew由来
init.defaultBranchは設定されていないGIT_DEFAULT_BRANCHも設定されていない- それでも
git initするとmasterが作られる
つまり、masterになった理由は、設定値が原因ではなく、未設定時に使われるデフォルト値がmasterになっているためです。
このデフォルト値が決まる経路は大きく2つ考えられます。
1つは「Gitの未設定時デフォルトがそもそもmaster」という経路です。
Gitはバージョン2.28でinit.defaultBranchが導入されましたが、この設定が空の場合、歴史的な理由からmasterを使うという実装になっている可能性があります。
もう1つは「systemレベルのgitconfigでmasterが指定されている」という経路です6。
先ほど見つけた.bottle/etc/gitconfigにもしinit.defaultBranch=masterという記述があれば、ユーザー設定が空でもmasterが強制されます。
5. 残る論点と確認方法
現時点で「masterになった」という結果自体は、VS CodeではなくGit側で起きていることが完全に確定しています。残る論点は「masterを選ばせているのがどのレイヤーか」という点だけです。
これを確認するには、以下のコマンドでsystem設定を含むすべての設定ファイルを調べます。
git config --show-origin --list | grep init.defaultBranch
Code language: PHP (php)
または、systemレベルの設定を直接確認します。
git config --system --get init.defaultBranch
Code language: JavaScript (javascript)
もしここで何か値が返ってくれば、それがHomebrew配布のGitに含まれるシステム設定です。
どちらも何も返ってこなかったので、Gitの未設定時デフォルトがmasterであるということになります。
6. まとめ
最初は「VS Codeの設定のせいかも」と考えていましたが、実際に調べてみると、原因はまったく別の場所にありました。重要だったのは、当て推量で「macOSだから」「VS Codeだから」と決めつけず、実測とツールを使った確認で段階的に絞り込んでいったことです。
VS Codeを排除したgit initの実行、whichコマンドによるパス確認、brew listによる配布元特定。これらの手順を踏むことで、問題の本質が「Gitの未設定時デフォルト挙動」にあることが見えてきました。
技術的な問題を解決するとき、ツールやフレームワークのせいにするのは簡単です。しかし、一歩深く掘り下げて調べると、より根本的な理由が見つかることがあります。今回の調査は、そのことを改めて実感する機会になりました。
git config --global init.defaultBranch mainを設定しても、既存のリポジトリには影響しません。既存リポジトリのブランチ名を変更したい場合は、git branch -m master mainを使用します。また、この設定はあくまでローカル環境のgit initに影響するもので、GitHub等のリモートリポジトリのデフォルトブランチ設定とは別です。 – git v2.28でデフォルトブランチをmainに変更する- Git 2.28は2020年7月27日にリリースされ、
init.defaultBranch設定により初期ブランチ名をユーザーが自由に指定できるようになりました。それ以前のバージョンでは、初期ブランチ名はmasterとしてハードコードされていました。 – Git 2.28.0 でdefault branchをmaster以外に変更する方法 init.defaultBranch を試す - Git 2.28以降では、
init.defaultBranchが設定されていない場合、git init実行時に「Using ‘master’ as the name for the initial branch」というヒントメッセージが表示されます。これは未設定時のデフォルト動作を示すものです。 – Gitリポジトリ作成時のデフォルトブランチ名がmainとなるように設定する - Homebrewは、macOS IntelではデフォルトでGitを
/usr/local/bin/gitに、Apple Siliconでは/opt/homebrew/bin/gitにインストールします。これらのパスは、システムのPATH環境変数で/usr/binよりも優先されるため、Homebrew版のGitが使用されます。 – Git Installation and Configuration - Homebrewでインストールされたgitには、システムレベルの設定ファイル(
$(prefix)/etc/gitconfig)が含まれる場合があります。このファイルにinit.defaultBranchなどの設定が記述されていると、ユーザー設定やグローバル設定よりも優先されることがあります。ただし、一部のツール(VS Codeなど)では、このシステム設定が正しく読み込まれないケースも報告されています。 – Git: options in the system config file are ignored by Zed if using Homebrew git - Gitの設定には優先順位があり、local > global > system > デフォルト値の順で適用されます。同じキーに複数の値が設定されている場合、
git config --get-allで全ての値を確認できます。systemレベルの設定はgit config --systemで確認・変更できますが、macOSでは管理者権限が必要な場合があります。 – gitのデフォルトブランチ名が変わらない