Git

Модуль 10: Сводная практика и лучшие практики

Объединяем навыки: пройдём путь от форка репозитория до слияния PR, а затем закрепим правила хорошего тона при работе с Git.

Эта глава — о дисциплине: как превратить инструменты в устойчивые привычки. Хорошие практики снижают энтропию в проекте, ускоряют ревью и делают выпуск релизов предсказуемым.

10.1 Сквозной пример

  1. Fork репозитория и git clone
  2. git switch -c feature/<topic> — создайте ветку
  3. Разработка фичи; коммиты по частям: git add -p, осмысленные сообщения
  4. Перед пушем «почистить» историю: git rebase -i (squash/reword)
  5. git push -u origin feature/<topic>
  6. Создание PR → Code Review → правки (доп. коммиты или rebase)
  7. Merge (безопасная стратегия, договорённая в проекте)

10.2 Лучшие практики

Коммиты

  • Маленькие и частые — один коммит = одно логическое изменение
  • Осмысленные сообщения — пишите «зачем», а не «что» (diff покажет «что»)
  • Conventional Commitsfeat:, 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                        # найти потерянное

Настройки

Цветовая схема

Тема