Снимки, коммиты, ветки
Для начала, стоит определиться из чего состоит репозиторий, нырнем по-глубже:

Снимок (snapshot) — это сохраненное состояние твоего проекта (всех файлов). Снимки хранятся в репозиториях.
У снимка может быть (а может и не быть (orphant) ) предок. Разница между снимком и его предком — коммит (фиксация)
Допустим, в репозитории есть снимок X. Разработчик решил обновить несколько файлов и сохранить их — это коммит (фиксация). После этого будет создан снимок Y. При необходимости, разработчик сможет легко переключаться между снимками X и Y
Зачастую коммиты идут одни за другим — череда последовательных коммитов — ветка (branch). В идеальном мире это происходит всегда. Разработчик делает версию A, после B, C, D… Но в реальности не всегда всё так просто
Самые часты причины ветвления:
- Одновременная работа нескольких разработчиков
- Создание «хотфиксов»
- Экспериментальные изменения
Рассмотрим ситуацию когда у нас один разработчик — Пупа.
Изначально, был создан репозиторий с снимком A. Это единственная ветка и её имя по умолчанию — master
(основная ветка). Пупа сделал коммит в ветке master
и получил снимок B. После успешно загрузил его на сервер.
Но что если у нас несколько разработчиков — в этот раз, одновременно с Пупой работал Лупа.

Если они оба сделают локальный коммит в ветке master
, то загрузить её на удаленный сервер сможет только один. У другого разработчика будет рассинхронизация.
Для того чтобы избежать это, каждый разработчик создает изменения в своей ветке. После этого в репозитории будут успешно храниться разные варианты проекта (оригинальный мастер, ветка с модификациями Пупы и ветка с модификациями Лупы)
Естественно, ветки можно легко создавать (branching) и не всегда так-же просто объединять (merge)