Ветка, HEAD и origin/main: как Git понимает, где мы находимся
Сначала отделим текущую локальную ветку от локального знания о GitHub. Тогда switch, fetch, pull и push перестанут быть набором магических команд.
Перед первой рабочей веткой соберём одну цельную модель: где лежит
изменение, на какой коммит указывает текущая ветка и что именно Git обновляет при
fetch, pull и
push.
git add не переносит файл в другое место. Рабочий файл
остаётся на диске и может снова измениться. Команда помещает в индекс снимок его
текущего содержимого, который станет частью следующего коммита.
Коммиты образуют граф
Каждый коммит знает родительский коммит. Поэтому история похожа не на папку с версиями, а на граф. Веткой называют подвижное имя, указывающее на один коммит. HEAD обычно указывает на выбранную ветку. Новый коммит получает текущий коммит родителем и передвигает эту ветку вперёд.
C3 feature/scanner ← HEAD
/
C1──C2 main, origin/main
| Имя | Где живёт | Что означает |
|---|---|---|
| main | локальный репозиторий | ваша локальная ветка |
| origin/main | локальный репозиторий | последнее известное Git состояние удалённой main |
| main на GitHub | удалённый репозиторий | реальная ветка на сервере GitHub |
origin/main не показывает состояние GitHub в реальном времени. Это
локальная remote-tracking ссылка, которая меняется, когда Git получает сведения с сервера,
например после git fetch.
| Команда | Что показывает |
|---|---|
| git status | какие файлы изменены, какие уже в staging, какие Git вообще не отслеживает |
| git diff | построчные изменения в рабочем дереве, ещё не добавленные в staging |
| git diff --staged | построчные изменения, уже добавленные в staging — то, что попадёт в коммит |
| git branch -vv | локальные ветки, текущую ветку и их upstream-связи |
| git log --oneline --graph --decorate --all | граф коммитов и положения ссылок |
Коротко
- Веткой называют подвижную ссылку на коммит; HEAD обычно указывает на текущую выбранную ветку.
- main, origin/main и main на GitHub обозначают три различимых состояния, а не три написания одного объекта.
- fetch обновляет remote-tracking ссылки; pull добавляет интеграцию; push обновляет удалённую ветку.