Модуль 10: Сводная практика и лучшие практики
Объединяем навыки: пройдём путь от форка репозитория до слияния PR, а затем закрепим правила хорошего тона при работе с Git.
Эта глава — о дисциплине: как превратить инструменты в устойчивые привычки. Хорошие практики снижают энтропию в проекте, ускоряют ревью и делают выпуск релизов предсказуемым.
10.1 Сквозной пример
- Fork репозитория и
git clone git switch -c feature/<topic>— создайте ветку- Разработка фичи; коммиты по частям:
git add -p, осмысленные сообщения - Перед пушем «почистить» историю:
git rebase -i(squash/reword) git push -u origin feature/<topic>- Создание PR → Code Review → правки (доп. коммиты или
rebase) - Merge (безопасная стратегия, договорённая в проекте)
10.2 Лучшие практики
Коммиты
- Маленькие и частые — один коммит = одно логическое изменение
- Осмысленные сообщения — пишите «зачем», а не «что» (diff покажет «что»)
- Conventional Commits —
feat:,fix:,docs:,refactor:,test:,chore: - Не коммитьте мусор —
.env,node_modules/,__pycache__/должны быть в.gitignore
# Пример хороших сообщений:
git commit -m "feat: добавить авторизацию по JWT"
git commit -m "fix: исправить утечку памяти в кэше сессий"
git commit -m "docs: обновить README с инструкцией деплоя"
git commit -m "refactor: вынести валидацию в отдельный модуль"
# Плохие сообщения:
# "fix"
# "update"
# "changes"
# "asdfgh"
Ветвление
- Используйте короткоживущие ветки — чем меньше живёт ветка, тем меньше конфликтов
- Именуйте ветки с префиксами:
feature/,fix/,hotfix/,docs/ - Удаляйте слитые ветки —
git branch --merged | xargs git branch -d - Синхронизируйтесь с main регулярно —
git pull --rebase origin main
Работа в команде
- Не force-push в общие ветки (main, develop)
- Всё через PR — никаких коммитов напрямую в main
- Code review обязателен — минимум один approve
- CI/CD на каждый PR — тесты должны проходить до merge
10.3 Conventional Commits
Стандарт именования коммитов, который позволяет автоматизировать генерацию CHANGELOG и определение версий.
# Формат:
# <type>(<scope>): <description>
#
# [optional body]
#
# [optional footer(s)]
# Примеры:
feat(auth): добавить авторизацию через OAuth2
fix(api): исправить 500 ошибку при пустом запросе
docs(readme): добавить инструкцию по установке
refactor(db): перейти с SQLite на PostgreSQL
test(auth): покрыть тестами модуль авторизации
chore(deps): обновить зависимости
# С телом и трейлерами:
# feat(payment): добавить оплату через Apple Pay
#
# Интегрировать Apple Pay SDK, добавить обработку
# callback'ов и проверку подписи транзакции.
#
# Refs: #142
# Co-authored-by: Иван <ivan@example.com>
10.4 Гигиена истории
# Чистим историю перед PR
git rebase -i main # squash/fixup мусорных коммитов
# Удаляем слитые ветки
git branch --merged main | grep -v "main" | xargs git branch -d
# Очищаем remote-tracking ветки
git fetch --prune
# Проверяем граф — должно быть чисто
git log --oneline --graph --all
10.5 Здоровье репозитория
# Проверить размер репозитория
git count-objects -vH
# Найти большие файлы в истории
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print $3, $4}' | sort -rn | head -20
# Оптимизация
git gc --auto
# Для больших файлов используйте Git LFS
git lfs install
git lfs track "*.psd" "*.zip" "*.mp4"
10.6 Безопасность и секреты
- Никогда не храните пароли, токены, ключи в репозитории
- Используйте
.envфайлы (добавьте в.gitignore) - Включите секрет-сканеры (GitHub Secret Scanning, git-secrets)
- Если секрет утёк — немедленно ревокните его (даже если удалили из кода — он остаётся в истории)
# .gitignore — обязательные правила:
.env
.env.local
*.key
*.pem
credentials.json
secrets/
Шпаргалка: топ-20 команд Git
# Настройка
git config --global user.name "Имя"
git config --global user.email "email@example.com"
# Создание и клонирование
git init # новый репозиторий
git clone URL # клонировать
# Ежедневная работа
git status # что происходит?
git add -p # интерактивное добавление
git commit -m "сообщение" # коммит
git push # отправить
git pull --rebase # получить + rebase
# Ветки
git switch -c feature/name # создать и переключиться
git switch main # переключиться
git branch -d feature/name # удалить слитую
# История
git log --oneline --graph --all # визуальная история
git diff # изменения
git show HASH # конкретный коммит
# Слияние
git merge --no-ff feature # merge с коммитом
git rebase -i HEAD~5 # уборка истории
# Спасение
git stash # временно убрать изменения
git restore file # откатить файл
git reflog # найти потерянное