> 【git】VS Codeで
作ったリポジトリの初期ブランチが
masterになっていた?

git config --global init.defaultBranch mainCode language: CSS (css)

関連記事

1. リポジトリの初期ブランチがmaster

VS Codeでリポジトリを作成したとき、初期ブランチがmasterになっていました。
最近はmainが標準になっているはずなのに、なぜmasterなのか。

きっかけ VS Code git init master ? main なぜmasterになるのか? 最近はmainが標準のはず 環境によってmasterとmainが混在

実務上の解決策は同じです。
環境や配布元に依存させず再現性を担保したいなら、init.defaultBranchを明示的に設定するのが最も確実です。

解決策: 明示的に設定する git config –global init.defaultBranch main 今後のgit initは常にmain VS Code / ターミナル どちらでも挙動が統一
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つあります。

Git初期ブランチ設定を確認 init.defaultBranch 設定なし 環境変数 設定なし Git version 2.49.0 ユーザー設定は空 それでもmasterになる理由は?
  • 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したときは違う結果になるはずです。

VS Codeを除外して検証 Terminal git init master ブランチ作成 原因はVS Codeではない 素のgit initでもmasterが作られる → Git自体の挙動が原因

テスト用のディレクトリを作成し、その中で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コマンドを解決しているのかを確認します。

Git配布元を特定 which git /usr/local/bin/git brew list git /usr/local/Cellar/ git/2.49.0/… Homebrew経由でインストール
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の未設定時デフォルト挙動」にあることが見えてきました。

技術的な問題を解決するとき、ツールやフレームワークのせいにするのは簡単です。しかし、一歩深く掘り下げて調べると、より根本的な理由が見つかることがあります。今回の調査は、そのことを改めて実感する機会になりました。

  1. git config --global init.defaultBranch mainを設定しても、既存のリポジトリには影響しません。既存リポジトリのブランチ名を変更したい場合は、git branch -m master mainを使用します。また、この設定はあくまでローカル環境のgit initに影響するもので、GitHub等のリモートリポジトリのデフォルトブランチ設定とは別です。 – git v2.28でデフォルトブランチをmainに変更する
  2. Git 2.28は2020年7月27日にリリースされ、init.defaultBranch設定により初期ブランチ名をユーザーが自由に指定できるようになりました。それ以前のバージョンでは、初期ブランチ名はmasterとしてハードコードされていました。 – Git 2.28.0 でdefault branchをmaster以外に変更する方法 init.defaultBranch を試す
  3. Git 2.28以降では、init.defaultBranchが設定されていない場合、git init実行時に「Using ‘master’ as the name for the initial branch」というヒントメッセージが表示されます。これは未設定時のデフォルト動作を示すものです。 – Gitリポジトリ作成時のデフォルトブランチ名がmainとなるように設定する
  4. Homebrewは、macOS IntelではデフォルトでGitを/usr/local/bin/gitに、Apple Siliconでは/opt/homebrew/bin/gitにインストールします。これらのパスは、システムのPATH環境変数で/usr/binよりも優先されるため、Homebrew版のGitが使用されます。 – Git Installation and Configuration
  5. Homebrewでインストールされたgitには、システムレベルの設定ファイル($(prefix)/etc/gitconfig)が含まれる場合があります。このファイルにinit.defaultBranchなどの設定が記述されていると、ユーザー設定やグローバル設定よりも優先されることがあります。ただし、一部のツール(VS Codeなど)では、このシステム設定が正しく読み込まれないケースも報告されています。 – Git: options in the system config file are ignored by Zed if using Homebrew git
  6. Gitの設定には優先順位があり、local > global > system > デフォルト値の順で適用されます。同じキーに複数の値が設定されている場合、git config --get-allで全ての値を確認できます。systemレベルの設定はgit config --systemで確認・変更できますが、macOSでは管理者権限が必要な場合があります。 – gitのデフォルトブランチ名が変わらない