Git для дата-инженера¶
Git — система контроля версий, без которой невозможна командная работа. Дата-инженер версионирует SQL-модели dbt, DAG Airflow, конфиги Docker Compose и скрипты ETL. В этой статье — практика Git, которая нужна каждый день.
Зачем Git дата-инженеру¶
- SQL-модели dbt — каждая модель в файле, изменения в PR;
- DAG Airflow — новый DAG = новая ветка → PR → review → merge;
- Docker Compose — инфраструктура как код;
- ETL-скрипты — Python-код для загрузки и трансформаций;
- Миграции БД — SQL-миграции под контролем версий.
Git — не только для кода
Версионируй .sql, .yml, .json, .md — всё, что описывает пайплайн. Если файл может сломать прод, он должен быть в Git.
Основные команды¶
Инициализация и настройка¶
# Создать репозиторий
git init my-etl-project
cd my-etl-project
# Настроить имя и email (один раз)
git config --global user.name "Ruslan Mustafin"
git config --global user.email "ruslan@example.com"
# Клонировать существующий
git clone https://github.com/user/etl-project.git
Базовый цикл: add → commit → push¶
# Посмотреть статус
git status
# Добавить файлы в staging
git add dags/load_orders.py
git add models/staging/stg_orders.sql
# Закоммитить
git commit -m "feat: add orders pipeline DAG and staging model"
# Отправить на удалённый репозиторий
git push origin main
Не используй git add .
git add . добавляет ВСЁ, включая .env, логи и временные файлы. Добавляй файлы явно или настрой .gitignore.
Просмотр истории¶
# Последние коммиты
git log --oneline -10
# Что изменилось в файле
git diff models/staging/stg_orders.sql
# Кто и когда менял строку
git blame dags/load_orders.py
Ветки¶
Ветка — изолированная линия разработки. Ты работаешь в ветке, не мешая основному коду.
# Создать ветку и переключиться
git checkout -b feature/add-orders-dag
# Список веток
git branch
# Переключиться на существующую
git checkout main
# Удалить ветку (после merge)
git branch -d feature/add-orders-dag
Merge — слияние веток¶
Merge создаёт коммит слияния, сохраняя историю обеих веток.
Rebase — линейная история¶
Rebase «переставляет» коммиты feature-ветки поверх main. История становится линейной.
| Merge | Rebase |
|---|---|
| Сохраняет историю веток | Линейная история |
| Безопасен для shared-веток | Не делай rebase опубликованных коммитов |
| Merge-коммит в истории | Чистая история без merge-коммитов |
Rebase vs Merge
Не делай rebase на ветке, которую уже запушил и которую используют другие. Rebase переписывает историю — это сломает чужие ветки.
Конфликты¶
Конфликт возникает, когда два разработчика изменили одну и ту же строку.
<<<<<<< HEAD
SELECT id, name, email
=======
SELECT id, full_name, email, phone
>>>>>>> feature/add-phone
Решение:
- Открой файл и выбери нужный вариант (или объедини оба);
- Удали маркеры
<<<,===,>>>; git add <файл>→git commit.
.gitignore для DE-проектов¶
# Python
__pycache__/
*.pyc
.venv/
*.egg-info/
# Окружение
.env
.env.local
# IDE
.vscode/
.idea/
# Данные (не коммить файлы данных!)
*.csv
*.parquet
*.xlsx
data/raw/
data/output/
# dbt
dbt_packages/
target/
logs/
# Airflow
logs/
airflow.db
# Docker
.docker/
# OS
.DS_Store
Thumbs.db
Что коммитить, а что нет
Коммить: код, конфиги, миграции, README, docker-compose.yml, requirements.txt. Не коммить: данные, секреты (.env), логи, кеш, виртуальное окружение.
Модели ветвления¶
Gitflow¶
main ─────────────────────────────── релизы
└─ develop ─────────────────────── текущая разработка
├─ feature/add-orders-dag ── новая фича
├─ feature/fix-dedup ─────── другая фича
└─ hotfix/fix-prod-bug ──── срочный фикс
- Подходит для проектов с регулярными релизами;
- Две долгоживущие ветки:
mainиdevelop; - Feature-ветки от
develop, hotfix отmain.
Trunk-based¶
- Подходит для CI/CD и dbt-проектов;
- Одна ветка
main, короткие feature-ветки; - PR-review обязателен.
| Критерий | Gitflow | Trunk-based |
|---|---|---|
| Релизы | По расписанию | Непрерывно |
| Ветки | Много долгоживущих | Одна + короткие |
| Сложность | Выше | Ниже |
| Для DE | Крупные команды | Небольшие команды, dbt |
Для dbt — trunk-based
dbt-проекты хорошо ложатся на trunk-based: каждая модель — отдельный файл, конфликты редки, PR-review через dbt Cloud или CI.
Полезные команды¶
# Отменить изменения в файле (до commit)
git checkout -- models/staging/stg_orders.sql
# Убрать файл из staging (после add, до commit)
git reset HEAD models/staging/stg_orders.sql
# Изменить последний коммит (до push!)
git commit --amend -m "fix: correct column name in stg_orders"
# Спрятать незакоммиченные изменения
git stash
git stash pop # вернуть обратно
# Посмотреть, что в stash
git stash list
Что запомнить¶
| Тема | Ключевая мысль |
|---|---|
| Базовый цикл | add → commit → push |
| Ветки | Одна задача = одна ветка |
| .gitignore | Не коммить .env, данные, логи, кеш |
| Модель ветвления | Trunk-based для DE, Gitflow для больших команд |
Проверь себя¶
Источники¶
- Pro Git Book — полная книга по Git на русском
- Atlassian Git Tutorials — сравнение Gitflow и trunk-based
- GitHub Docs — Getting Started — работа с GitHub