kb/branching
Ветка как файл с одним SHA, fast-forward и three-way merge, rebase для переписывания истории, cherry-pick для переноса одного коммита. Сравнение стратегий merge vs rebase: когда что использовать.
Состояние, когда HEAD указывает прямо на коммит, а не на ветку. Безопасно для просмотра, но коммиты в этом режиме теряются, если не создать из них ветку.
Простейшая форма merge: Git двигает указатель ветки на новый коммит без создания merge-объекта. Возможен, когда у целевой ветки нет коммитов после ветвления.
Берёт один коммит из другой ветки и применяет его на текущую, создавая дубликат с новым SHA. Используется для hotfix'ов в нескольких релиз-ветках и переноса одиночных коммитов.
Сливает другую ветку в текущую. Делает либо fast-forward (двигает указатель), либо создаёт merge-коммит с двумя родителями. При пересекающихся изменениях возможны конфликты.
Переписывает коммиты ветки, делая их потомками другого коммита. Создаёт новые SHA, история становится линейной. Безопасен только для веток, которые ещё никто, кроме автора, не видел.
`git rebase -i <base>` открывает редактор со списком коммитов от `<base>` до HEAD, где можно переименовывать, объединять, удалять и переставлять их. Главный инструмент для очистки локальной истории.
Ветка в Git - это файл в `.git/refs/heads/`, в котором лежит SHA одного коммита. Создание, переключение и удаление веток тривиальны, потому что данных в ветке - 41 байт.