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 только код загрузки.
Что сделать после занятия
- [ ] Инициализируйте Git-репозиторий для учебного проекта; добавьте
.gitignoreдля Python + ML. - [ ] Сделайте 3 commit с осмысленными сообщениями на отдельной ветке.
- [ ] Проверьте:
git log --oneline,git status— убедитесь, что секретов и больших файлов нет. - [ ] Прочитайте, что произойдёт, если закоммитить
.env— запишите план действий (ротация, git filter-repo).