Git

Git — распределённая система контроля версий. Repository хранит snapshots в графе commits; GitHub и другие hosting-сервисы хранят remotes, но не являются самим Git.

Рабочая модель

working tree → git add → index → git commit → local history
                                           → git push → remote
  • working tree — текущие файлы;
  • index/staging area — точное содержимое следующего commit;
  • commit — snapshot, metadata и ссылки на parent commits;
  • branch — перемещаемая ссылка на commit;
  • HEAD — текущая выбранная ссылка/commit.

Ежедневный цикл

git status --short
git diff
git diff --staged
git add notes/REST.md
git commit -m "docs: clarify REST semantics"
git fetch origin
git log --oneline --decorate --graph -10

Перед commit проверяю staged diff: git diff не показывает уже staged изменения.

Merge, rebase и revert

  • merge создаёт commit с двумя parents или fast-forward и сохраняет ветвление;
  • rebase переносит commits на новую base и переписывает их identities;
  • revert создаёт новый commit, отменяющий выбранное изменение;
  • reset перемещает ссылку и в некоторых режимах меняет index/working tree.

Для опубликованной общей истории предпочитаю revert, если команда не договорилась о rewrite. См. Отмена merge.

Remote

fetch обновляет remote-tracking refs без изменения working tree. pull — составная операция fetch плюс integration, поэтому перед ней полезно понимать выбранную стратегию.

git remote -v
git fetch --prune origin
git branch -vv

Мой реальный случай

JavaNotes начинался как локальная Obsidian-база, затем я связал её с Git и открыл на GitHub. Git дал историю правок, а GitHub Actions — автоматическую проверку ссылок и структуры перед публикацией. Следующий шаг — GitHub Pages, чтобы сайт собирался рядом с репозиторием без отдельного сервера. См. Как я веду и публикую JavaNotes.

Типичные сбои

  • Закоммитить secret и удалить только новым commit: значение остаётся в истории.
  • Сделать rebase общей branch и сломать ссылки коллег.
  • Перепутать git diff и git diff --staged.
  • Запустить destructive reset в dirty working tree.
  • Считать remote-tracking branch автоматически обновляемой без fetch.

Вопросы для собеседования

Что хранит commit? Snapshot дерева, metadata и parent reference(s).

Чем fetch отличается от pull? Fetch только получает refs/objects, pull затем интегрирует их в текущую branch.

Что такое staging area? Подготовленный snapshot следующего commit.

Когда нужен revert? Чтобы отменить опубликованный commit новым, не переписывая историю.

GitHub — это Git? Нет, это hosting и collaboration вокруг Git repositories.

См. Файл gitignore, SSH протокол.