main и master: два имени главной ветки

Обновлено 31 июля 2026 г.

main и master - это два имени для главной ветки репозитория, и никакой технической разницы между ними нет: обе устроены так же, как любая другая ветка.

master был именем по умолчанию с самого начала истории git. GitHub перевёл новые репозитории на main в октябре 2020 года, а git с версии 2.28 разрешает задать имя первой ветки самому. Проекты, заведённые раньше, остались как были, поэтому оба имени живут рядом до сих пор. Увидишь в чужом репозитории master - читай «главная ветка».

Какое имя у тебя, показывает одна команда:

$ git branch --show-current
main

Задать своё умолчание

$ git config --global init.defaultBranch main

Настройка действует на новые репозитории, создаваемые через git init. На клон она не влияет: git clone берёт имя ветки с сервера.

Переименовать в существующем репозитории

Локально имя меняет обычный флаг -m команды git branch:

$ git branch -m master main
$ git branch -vv
* main d01f9d3 [origin/master] first version

Ветка уже main, но привязана всё ещё к серверной master. Отправь её и перепривяжи:

$ git push -u origin main
To github.com:username/my-project.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Теперь смени главную ветку в настройках репозитория на GitHub: Settings, раздел General, блок Default branch. Пока это не сделано, старую ветку удалить не дадут, потому что сервер считает её текущей:

$ git push origin --delete master
remote: error: refusing to delete the current branch: refs/heads/master
 ! [remote rejected] master (deletion of the current branch prohibited)

После смены умолчания та же команда проходит:

$ git push origin --delete master
To github.com:username/my-project.git
 - [deleted]         master

У тех, кто уже склонировал проект

Переименование на сервере чужие копии не трогает. У каждого, кто клонировал проект раньше, локальная ветка так и называется master и привязана к серверной, которой больше нет. Разгребается это тремя командами у себя:

$ git branch -m master main
$ git fetch origin
$ git branch -u origin/main main
branch 'main' set up to track 'origin/main'.

Предупреди команду заранее: человек, который придёт в понедельник и сделает git push по привычке, получит непонятный отказ и потратит час.

Частые ошибки

Ждать от имени особого поведения. Ни защиты, ни особых прав имя не даёт: главной ветку делает запись в настройках хостинга, а сама она остаётся обычным указателем на коммит.

Переименовать ветку и забыть про всё, что упоминает старое имя строкой. Скрипты сборки, правила защиты веток, конфигурация деплоя и задачи автоматики часто содержат master прямым текстом, и после переименования они тихо перестают срабатывать.

Где это в учебнике

Глава 5. Ветки: параллельные версии проекта.