Перейти к содержанию

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.


Основные команды

Инициализация и настройка

Bash
# Создать репозиторий
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

Bash
# Посмотреть статус
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.

Просмотр истории

Bash
# Последние коммиты
git log --oneline -10

# Что изменилось в файле
git diff models/staging/stg_orders.sql

# Кто и когда менял строку
git blame dags/load_orders.py

Ветки

Ветка — изолированная линия разработки. Ты работаешь в ветке, не мешая основному коду.

Bash
# Создать ветку и переключиться
git checkout -b feature/add-orders-dag

# Список веток
git branch

# Переключиться на существующую
git checkout main

# Удалить ветку (после merge)
git branch -d feature/add-orders-dag

Merge — слияние веток

Bash
# Переключиться на main
git checkout main

# Влить ветку
git merge feature/add-orders-dag

Merge создаёт коммит слияния, сохраняя историю обеих веток.

Rebase — линейная история

Bash
# Находясь в feature-ветке
git rebase main

Rebase «переставляет» коммиты feature-ветки поверх main. История становится линейной.

Merge Rebase
Сохраняет историю веток Линейная история
Безопасен для shared-веток Не делай rebase опубликованных коммитов
Merge-коммит в истории Чистая история без merge-коммитов

Rebase vs Merge

Не делай rebase на ветке, которую уже запушил и которую используют другие. Rebase переписывает историю — это сломает чужие ветки.


Конфликты

Конфликт возникает, когда два разработчика изменили одну и ту же строку.

Text Only
<<<<<<< HEAD
SELECT id, name, email
=======
SELECT id, full_name, email, phone
>>>>>>> feature/add-phone

Решение:

  1. Открой файл и выбери нужный вариант (или объедини оба);
  2. Удали маркеры <<<, ===, >>>;
  3. git add <файл>git commit.

.gitignore для DE-проектов

.gitignore
# 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

Text Only
main ─────────────────────────────── релизы
  └─ develop ─────────────────────── текущая разработка
       ├─ feature/add-orders-dag ── новая фича
       ├─ feature/fix-dedup ─────── другая фича
       └─ hotfix/fix-prod-bug ──── срочный фикс
  • Подходит для проектов с регулярными релизами;
  • Две долгоживущие ветки: main и develop;
  • Feature-ветки от develop, hotfix от main.

Trunk-based

Text Only
main ──●──●──●──●──●──●── все коммитят в main
       ↑  ↑  ↑
       короткие feature-ветки (1-2 дня)
  • Подходит для CI/CD и dbt-проектов;
  • Одна ветка main, короткие feature-ветки;
  • PR-review обязателен.
Критерий Gitflow Trunk-based
Релизы По расписанию Непрерывно
Ветки Много долгоживущих Одна + короткие
Сложность Выше Ниже
Для DE Крупные команды Небольшие команды, dbt

Для dbt — trunk-based

dbt-проекты хорошо ложатся на trunk-based: каждая модель — отдельный файл, конфликты редки, PR-review через dbt Cloud или CI.


Полезные команды

Bash
# Отменить изменения в файле (до 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

Что запомнить

Тема Ключевая мысль
Базовый цикл addcommitpush
Ветки Одна задача = одна ветка
.gitignore Не коммить .env, данные, логи, кеш
Модель ветвления Trunk-based для DE, Gitflow для больших команд

Проверь себя


Источники