MLOps Path

1.2.1 · блок 1

Git: основы версионирования кода

Git: основы версионирования кода

Зачем это нужно

Вы уже писали Python и C++ — возможно, сохраняли файлы как main_v2_final.py. Git решает эту проблему системно: каждое изменение зафиксировано, подписано автором, имеет описание и может быть отменено. В MLOps Git — центр всего: код обучения, конфиги, Dockerfile, Terraform, иногда даже версии датасетов (через DVC или LFS).

Без Git невозможны code review, CI/CD и совместная работа. Секреты в Git — одна из самых частых и болезненных ошибок новичков.

Основные идеи

Commit — снимок состояния файлов в репозитории. У commit есть SHA-хеш, автор, дата и сообщение. Хорошее сообщение объясняет *зачем*, а не *что* («fix typo» — плохо; «fix null handling in feature parser» — лучше).

Branch (ветка) — независимая линия разработки. main (или master) — стабильная ветка, отражающая продакшен. Фичи делают в отдельных ветках: feature/add-xgboost-pipeline, fix/memory-leak-inference.

Remote — копия репозитория на сервере (GitHub, GitLab, Bitbucket). Команды:


git clone git@gitlab.com:team/ml-project.git   # скачать
git pull origin main                            # забрать изменения
git push origin feature/my-branch             # отправить свою ветку

Базовый рабочий цикл:


git checkout -b feature/train-script    # создать ветку
# ... редактируем файлы ...
git add src/train.py configs/default.yaml # добавить в индекс
git commit -m "add training script with config support"
git push origin feature/train-script

.gitignore — список файлов, которые Git *не* отслеживает. Для ML-проекта типичные записи:


__pycache__/
*.pyc
.env
*.pem
data/raw/
models/*.pkl
.ipynb_checkpoints/
venv/

Секреты никогда не попадают в Git. API-ключи, пароли БД, приватные ключи — только в переменных окружения, secret manager (Vault, GitLab CI Variables) или .env, который в .gitignore. Если секрет всё же попал в историю — его нужно *считать скомпрометированным*: ротация ключа обязательна, простое удаление commit недостаточно.

Признак проблемы: файл .env без строки в .gitignore, или AWS_SECRET_KEY= в ноутбуке, который коммитят «на всякий случай».

Как это выглядит на практике

Репозиторий fraud-detection:


fraud-detection/
├── .gitignore
├── README.md
├── src/
│   ├── train.py
│   └── predict.py
├── configs/
│   └── prod.yaml
└── tests/
    └── test_train.py

MLE создаёт ветку feature/add-lightgbm, коммитит код обучения, пушит. В Jira-task ML-55 указан branch name. CI на GitLab запускает тесты при push.

.gitignore исключает data/transactions.parquet (2 GB) и models/fraud_v3.pkl — артефакты хранят в S3, в Git только код загрузки.

Что сделать после занятия

Официальные материалы

Открыть интерактивную версию