git的默认分支

背景

自己的gitlab版本一直都比较低,许多项目默认分支是master.
本以为升级就行,结果看到了有些项目是main.
于是准备搞清楚.

一些知识

git的客户端与服务器,使用不同概念的 default branch.

本地git:

  1. 新建项目时的第一个分支名.
  2. 其余时间,分支与分支之间没有谁更优先显示的说法.

git服务器:

  1. 打开页面显示时的第一个分支
  2. 客户端在clone时若不指定参数,则创建与该分支同名的本地分支.

克隆时的默认行为

  1. 创建了对远程所有分支时的追踪(git branch --all 时显示许多 remotes/origin/xxx)
  2. 只根据服务器端的设置,创建唯一的一个本地分支.

自定义的克隆

  1. 使用 --branch <name> 来指定创建哪一个本地分支
  2. 使用 --single-branch 要求git只追踪一个远程分支

本地的默认分支

全局配置中 init.defaultBranch 负责管理默认的第一个分支名.

如果有特别的需要,可以使用命令行参数覆盖默认配置

1
2
3
git init --initial-branch=main
#
git init -b main

甚至在创建第一个分支之后还能重命名分支

1
git branch -m <new-name>

服务器端的默认分支

空项目

服务器端创建的项目,以第一个分支作为默认分支.
在第一个分支出现之前,没有默认分支.

通常收到第一个分支的方式有两种

  1. 在服务器上就初始化一个Readme文件,此时会按照instance级别的配置确定分支名.
    该选项名为 default initial branch name, 需要使用administer在如下位置配置

    1
    Admin Area > Settings > Repository > Default initial branch name
  2. 在本地clone后将第一个分支传到服务器上

    1. clone时由于没有分支,将按照客户端的设置,checkout出第一个本地分支
    2. git push时如果与服务器端 default initial branch name 不一致,可能需要使用 git push origin HEAD

已有内容的项目

只要有一个以上的分支,就能够配置项目的默认分支

1
Settings > Repository > Default Branch

唯一的本地分支改名

本地将仅有的一个分支改名,再次推送到远程的同名分支后,远程将会有两个分支.
本地可以强行checkout出改名前的分支,不过对改名后的分支的修改,已经不会影响改名前的分支了.

参考

  1. 配置项init.defaultBranch
  2. 只能在服务器端更改clone时的默认分支
  3. github对于默认分支的一些解释
  4. gitlab的默认分支说明