Распределённая система контроля версий: каждый клон содержит полную историю, работа без сети возможна. Хранилище — DAG из коммитов, ссылающихся на снапшоты деревьев.
Основные концепции
- Repository — хранилище проекта, локальное и/или удалённое.
- Commit — снапшот состояния файлов + ссылка на родителя/родителей.
- Branch — именованный указатель на коммит.
- Merge — объединение веток, создаёт merge-commit (или fast-forward).
- HEAD — текущая ветка/коммит.
Часто используемые команды
| Команда | Описание |
|---|---|
git status | Состояние working tree и index |
git log | История коммитов |
git diff | Различия между версиями |
git branch | Работа с ветками |
git merge | Слияние веток |
git rebase | Перенос коммитов на другую базу |
git stash | Временное сохранение незакоммиченных изменений |
git remote -v | Привязанные удалённые репозитории |
git reset | Перемещение HEAD/index/working tree |
git fetch | Загрузка обновлений без слияния |
git reflog | Локальный журнал перемещений HEAD (восстановление потерянных коммитов) |
Команды, требующие осторожности
| Команда | Эффект | Где осторожно |
|---|---|---|
git reset --hard | Сбрасывает working tree и index до коммита | Локальные изменения теряются; восстановление через reflog возможно только для коммитов/перемещений refs, не для незафиксированных файлов |
git push --force | Перезаписывает удалённую историю | На общих ветках уничтожает чужие коммиты; используйте --force-with-lease |
git clean -fd | Удаляет неотслеживаемые файлы и каталоги | Без корзины; сначала --dry-run |
git rebase | Переписывает локальную историю | Нормальный инструмент для feature-веток. Опасен только на ветках, на которые опираются другие — тогда нужен --force-with-lease и согласование с командой |
git reflog хранит локальный журнал перемещений refs. По умолчанию reachable entries истекают примерно через 90 дней (gc.reflogExpire), unreachable — примерно через 30 дней (gc.reflogExpireUnreachable). Это помогает восстановить коммит после reset --hard, неудачного rebase или удаления ветки:
git reflog
git reset --hard HEAD@{2}
Полезные практики
- маленькие коммиты с осмысленными сообщениями;
- перед
pushсинхронизация с remote (fetch+merge/rebaseпо политике команды); .gitignoreдля временных и бинарных файлов;--force-with-leaseвместо--force.