「master」以外のデフォルトのブランチ名でGitリポジトリを作成するにはどうすればよいですか?


103

ではプロGitの本、それは言います

「起源」は特別ではありません

ブランチ名「master」がGitで特別な意味を持たないように、「origin」も同様です。「master」はgitinitを実行するときの開始ブランチのデフォルト名であり、これが広く使用されている唯一の理由ですが、「origin」はgitcloneを実行するときのリモートのデフォルト名です。代わりにgitclone -o booyahを実行すると、デフォルトのリモートブランチとしてbooyah / masterが使用されます。

つまり、デフォルトのブランチ名をmainまたはmain-branchなどとして使用できます。別のデフォルトのブランチ名でman git-init初期化するオプションが見つかりませんでしたrepo

GitHubは、設定ページでデフォルトのブランチ名を設定する方法を示しています。しかし、私は特定のGitホスティングサイトでそれを設定する方法について話していません。特定のGitホスティングサイトに関してではなく、Gitに関してのみ厳密に質問しています

それを行う方法はありますか?


1
github.com/git-for-windows/git/issues/2674のメイン/デフォルトブランチの名前を調べるための作業が開始されました
PhilipOakley20年

回答:


107

新しいGit、新しいリポジトリ

gitバージョン2.28.0以降、git initコマンドは--initial-branch(または-b略して)パラメーターを受け取るようになりました。これらの2つのコマンドは、「trunk」という名前のブランチを持つ新しいGitリポジトリを作成します。これは、「master」(何のマスター?)よりも常に意味があります。

git init --initial-branch=trunk
git init -b trunk

これは、init.defaultBranch設定で構成できます。すべての新しいリポジトリにデフォルトのブランチとして「トランク」を持たせたい場合:

git config --global init.defaultBranch trunk

古いGit、新しいリポジトリ

一部のシステムにはまだ古いGitがインストールされています。私のDebian10サーバー(Buster、2020年10月現在の現在の安定バージョン)にはGit 2.20が付属しており、この-bオプションはサポートされていません。1つのオプションは、リポジトリを作成してからブランチ名を変更することです。この手法は、通常の(ベアではない)リポジトリで機能します。

git init
git checkout -b trunk

これにより、のtrunk代わりに現在のブランチとして新しいリポジトリが作成されますmaster。ブランチmasterは実際には存在しません。ブランチは、少なくとも1つのコミットがあるまで作成されません。ブランチが作成されるまで、ブランチはにのみ存在します.git/HEAD。これは、にmaster切り替えるとブランチが消える理由を説明していtrunkます。

ベアレポ

ベアレポの場合、実行することはできませんgit checkout(それがベアであることの意味です)。代わりに、別のブランチを指すようにHEADを変更できます。

git init --bare
git symbolic-ref HEAD refs/heads/trunk

古いレポ

すでにコミットしている場合は、git branch -m代わりに実行できます。

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

これにより、作成されたブランチの名前がからmasterに変更trunkされます。

リポジトリが空かどうかによってメカニズムが異なるため、これは少し不格好に見えますが、機能します。「新しいブランチを作成して削除するmaster」としてアプローチすることもできます。


最初のケースでは、を実行しgit checkout -b trunkます。それ以降、デフォルトのブランチはトランクになるということですか?
Abhisek 2017年

2
「デフォルト」は少し誤解されています。「現在のブランチ」は本当にここで起こっていることです。
ディートリッヒエップ2017年

help.github.com/articles/setting-the-default-branchがデフォルトのブランチについて説明しているので、少し混乱しました。私はあなたが言ったことを少し実験しました。gitには「デフォルト」のようなものは何もないことがわかりました。ありがとう
Abhisek 2017年

4
これは、Gitの概念ではなく、GitHubの概念のように見えます。プルリクエストについて話しますが、Gitには「プルリクエスト」のようなものはありません。
ディートリッヒエップ2017年

私はちょうどこのような何かを探していた
Wexoni

92

間接的に、git init別のデフォルトブランチを使用するように構成できます。現在のブランチはによって定義されますHEAD。これは、Gitに現在のブランチを通知するテキストファイルです。

を使用して、別のものを使用するinit.templateDirように依頼できますgit init

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

そして、では~/.config/git/template/HEAD、単一のライン(+改行)を置く:ref: refs/heads/main(ブランチにデフォルトにmain)。

リポジトリの作成時templateDirに、の内容全体が.gitディレクトリにコピーされます。デフォルト(ここ/usr/share/git-core/templates)にはいくつかのサンプルフックと他のファイルが含まれていますが、たとえば、新しいテンプレートディレクトリを使用してデフォルトフックを設定できます。

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files

参考までに、OSXでこれらの手順に従う人は、/ usr / local / git / share / git-core / templatesでテンプレートファイルを探す必要があるかもしれません
BrianGradin20年

1
注意:HEADデフォルトのテンプレートでファイルを作成することもできますが、実際にリポジトリを作成しているときにリポジトリを「再初期化」していることがわかります。
jhpratt

24

master」以外のデフォルトのブランチ名でGitリポジトリを作成するにはどうすればよいですか?

Git 2.28(2020年第3四半期)を使用します。既存のリポジトリのプライマリブランチの名前と、新しく作成されたリポジトリの最初のブランチに使用されるデフォルトの名前が構成可能になり、最終的にハードコードされたリポジトリから離れることができます。master'。

そしてGitHubからの2020年8月からのリマインダー:

2020年10月1日に、ユーザー、組織、または企業の新しいリポジトリのデフォルトブランチを変更していない場合は、に自動的に変更さmastermainます。
この変更はいつでもオプトアウトできます。

  • ユーザーの場合、https://github.com/settings/repositoriesページ
  • 組織の所有者の場合、https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultsページ
  • エンタープライズ管理者の場合、https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegesページ

この変更は、デフォルトのブランチの名前を変更したいプロジェクトやメンテナーをサポートするためにGitHubが行っている多くの変更の1つです。
行っている変更の詳細については、github / renamingを参照してください。

しかし、Gitリポジトリ自体に戻っ:(2.28、Q3 2020)を参照してください508fd8eコミット(2020年6月29日)をすることによりĐoànTRANコングDanh( )sgn
参照0068f21コミットa471214コミット0cc1b47コミット32ba12dコミット6069eccコミットf0a96e8コミット4d04658コミット(2020年6月24日)、および489947cをコミットすることにより(2020年6月23日)ヨハネスSchindelin( )dscho Don Goodman-Wilson()によるcommit 8747ebb(2020年6月24日)を
参照してください。(合併によりJunio C浜野- -DEGoodmanWilson
gitsterコミット11cbda2、2020年7月6日)

init:新しいリポジトリの初期ブランチ名を指定できるようにする

サインオフ:Johannes Schindelin

リポジトリのメインブランチ名を変更したいプロジェクトや企業が増えています(これに関する背景については、MislavMarohnićのツイートを参照してください)。

新しいリポジトリのブランチ名を変更するには、現在、Gitのテンプレートディレクトリをすべてコピーし、目的のデフォルトのブランチ名を.git/HEADファイルにハードコーディングして、init.templateDirコピーしたテンプレートファイルを指すように構成するしかありません。

このプロセスの煩わしさを大幅に軽減するために、新しいオプションを導入しましょう--initial-branch=<branch-name>

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

そして:

init:構成を介して初期ブランチ名のデフォルトを設定できるようにする

支援者:Johannes Schindelin
支援者:Derrick Stolee
署名者:Don Goodman-Wilson

--initial-branch=<branch-name>ハードコードされたものとは異なる初期ブランチで新しいリポジトリを初期化できるようにするコマンドラインオプションを導入しました。

ユーザーが最初のブランチ名をより永続的にオーバーライドできるようにするために(つまりgit init、呼び出しごとに名前を手動で指定する必要がないように)、構成init.defaultBranch設定を導入しましょう。

注:マージコミットメッセージに関するcommit 489947cは、Git 2.29で元に戻されましたgitのマージコミットメッセージをカスタマイズするにはどうすればよいですか?」を参照してください。設定が残っています。
init.defaultBranch


これはサブモジュールに影響します。

submodule:remote..branchが欠落している場合は、リモートのHEADにフォールバックします

支援者:Philippe Blain
サインオフ者:Johannes Schindelin

remote.<name>.branchが構成されていない場合、git submodule update現在はブランチ名の使用にフォールバックしmasterます。
ただし、はるかに優れたアイデアは、リモートを使用することHEADです。適度に新しいGitバージョンを実行しているすべてのGitサーバーで、symrefHEADはメインブランチを指します。

注:t7419は、リモートが別のブランチを指している場合でも 、サブモジュールをリモートブランチに更新することを期待するユースケースが存在する可能性があることを示しています。 間違いなく、このパッチは動作をより直感的にしますが、これがあいまいな設定でリグレッションを引き起こす可能性がわずかにあります。 git submodule update --remotemasterHEAD

それでも、移行期間を長くすることなく、この動作を修正しても問題ありません。

  • このgit submodule update --remoteコマンドは実際には一般的ではありません。
  • このコマンドを実行するときの現在のGitの動作は、リモートリポジトリの現在のブランチがそう でない限り、完全に混乱しますmaster(この場合、提案された動作は古い動作と一致します)。
  • 動作の変更が原因でユーザーがリグレッションに遭遇した場合、修正は実際には簡単です。に設定submodule.<name>.branchするmasterと、古い動作が復元されます。

Git 2.29(2020年第4四半期)では、のテストcontrib/は最近の変更に合わせて調整されていることに注意してくださいfmt-merge-msg

Emily Shaffer()によるcommit b87528c(2020年8月3日)を参照してください。(合併によりJunio C浜野- -83b8250コミットし、2020年8月10日)をnasamuffin
gitster

Revert "contrib::subtreeテストを調整してfmt-merge-msg

サインオフ:Emily Shaffer

これにより、コミット508fd8e8baf3e18ee40b2cf0b8899188a8506d07が元に戻ります。

6e6029a8fmt-merge-msg:マージ先は再び省略することを可能にする)、我々は戻って「に対するマージ動作を取得master」を、デフォルトでは、「含まないinto 'master'マージメッセージの最後に」。このテスト修正は不要になりました。

また:

Git 2.29(2020年第4四半期)で、テストを更新して単語 ' master'を削除します。

参照f33f2d3をコミットしb6211b8をコミット(2020年9月26日)、および432f5e6をコミットし5a0c32bをコミットし659288cをコミットすることで(2020年9月21日)ヨハネスSchindelin( )dscho
(合併によりJunio C浜野- gitster-58138d3コミットし、2020年10月5日)を

testsmasterブランチ名のバリエーションを避ける

サインオフ:Johannes Schindelin

この用語にmasterは、人種的不公正を常に思い出させるものとして役立つ歴史があります。Gitプロジェクトはこれを永続化することを望んでおらず、すでに回避し始めています。

テストスイートは、デフォルト以外のブランチにこの名前のバリエーションを使用します。前のコミットでこれに対処したt3200とは別に、これらのインスタンスは、テストスクリプトの外部で変更を必要としないため、自動化された方法で名前を変更できます。そうしましょう。

タッチされたブランチはデフォルトのブランチとはほとんど関係がないため、完全に別個の命名スキームを使用することを選択しますtopic_<number>topic-<number>t5515test_oidが用語を含む機械を使用し、機械が内部でシェル変数を使用するため、名前にダッシュを含めることはできません)。

このトリックは、この(GNU)sed呼び出しによって実行されました。

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

そして、まだGit 2.29を使用しています:

Johannes Schindelin()によるcommit 538228ecommit a15ad5d(2020年10月8日)を参照してください。(による合併Junio C浜野- -62564baをコミット2020年10月8日)dscho
gitster

t1415main参照名としての使用は避けてください

サインオフ:Johannes Schindelin

のフォールバックをinit.defaultBranchに変更する一連のパッチの準備として、このテストスクリプトで参照名としてmain使用mainしないでください。

そうしないと、それらの参照をキャッチしたいmanも予期せずキャッチします。git for-each-ref ... | grep mainrefs/heads/main

問題の参照はワークツリーローカルのものであり(つまり、各ワークツリーには、のように独自のものがありますHEAD)、テストケースではすでに「second」というセカンダリワークツリーが使用されているため、first代わりにこれらの参照に「」という名前を使用しましょう。

その間に、代わりに「ワークツリー」を意味するときに「レポ」について説明するテストタイトルを調整します。


18

Git 2.28(2020年7月27日リリース)以降init.defaultBranch、ハードコードされた用語を置き換えるために新しい構成オプションが導入されていmasterます。

デフォルトはmaster!のままです。

ユーザーは、構成変数のデフォルト値を次のようにオーバーライドできます。

$ git config --global init.defaultBranch main

詳細については、gitdocの章をお読みください。init.defaultBranchの紹介


はい、それは私が同じページの私の答えに書いたものです。stackoverflow.com/a/62983443/6309
VonC

そして、それは私がその同じ答えに言及、twittedものです:twitter.com/VonC_/status/1284968817010016268
VonC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.