Git orphan branch: создать ветку без истории

Категория: Git · Язык: Bash · Обновлено:

git switch --orphan <branch> создаёт ветку без родителей и переключается на неё. Первый коммит в такой ветке становится корневым, поэтому история не пересекается с main. Приём используют для gh-pages, документации и публикации собранного сайта, когда смешивать историю приложения и статики не нужно.

Опубликовать каталог public в отдельной ветке

Bash
git switch --orphan gh-pages
git restore --source=main --staged --worktree public
git commit -m "Publish site"
git push -u origin gh-pages

switch --orphan доступен с Git 2.23. Он очищает отслеживаемые файлы в рабочей копии, но не трогает неотслеживаемые. git restore --source=main возвращает нужный каталог из main сразу в индекс и рабочую копию, уже без истории. Проверить результат можно через git log --format=%P -1: у корневого коммита список родителей пуст.

Если каталог исключён через .gitignore, restore не поможет: файлов нет в дереве main. Соберите статику заново и добавьте её явно через git add -f public, либо публикуйте из отдельного checkout. Не делайте git add -A вслепую: в индекс могут попасть локальные конфиги и секреты.

Отличия от checkout --orphan

В старом Git до 2.23 использовали git checkout --orphan gh-pages. Он оставляет файлы текущей ветки в индексе и рабочей копии, поэтому перед коммитом нужно очистить индекс командой git rm -rf --cached . и заново добавить нужные файлы. git switch --orphan делает более предсказуемую очистку, но всё равно проверяйте git status перед коммитом.

Ветка с несвязанной историей нормальна для GitHub Pages, но не сливайте её обратно в main без необходимости: git merge потребует --allow-unrelated-histories и создаст запутанную историю. Если ветка уже существует на сервере, обычный push новой истории будет отклонён. Удалите старую ветку или используйте --force-with-lease только после проверки, что её содержимое больше не нужно.

Orphan-ветка не удаляет секреты из старых коммитов: они остаются на сервере и в клонах. Для очистки истории нужен git filter-repo или BFG, а скомпрометированные ключи всё равно придётся отозвать.

Документация: git switch, git restore.