Ветки и Pull Request
Один в репозитории вы работаете быстро. В команде нужны правила. Основное правило такое: в main код попадает только после ревью. main — это продакшен. Его нельзя ломать.
Ветка — отдельная линия изменений. Вы делаете её от main, правите код, а main остаётся нетронутым.
main: A ── B ── C ───────────── G ← merge \ /fix-revenue: D ── E ── Fgit switch -c fix-revenue # создать ветку и перейти в неёgit branch # список ветокgit switch main # вернуться в mainИмя ветки — коротко, что делаете: fix-revenue, add-refunds. В компаниях часто добавляют номер задачи: DE-123-add-refunds.
Рабочий цикл в команде
Заголовок раздела «Рабочий цикл в команде»1. git switch -c add-refunds ← ветка от main2. правим код, git add, git commit3. git push -u origin add-refunds ← отправляем ветку на GitHub/GitLab4. открываем Pull Request (Merge Request)5. коллеги смотрят код, пишут замечания6. правим, делаем новые коммиты, git push7. CI зелёный и есть approve → merge в main8. удаляем веткуПодключите удалённый репозиторий
Заголовок раздела «Подключите удалённый репозиторий»- На GitHub нажмите New repository. Назовите его
sql-reports. Не добавляйте README: репозиторий должен быть пустым. - Подключите его к локальному репозиторию:
git remote add origin git@github.com:YOUR_NAME/sql-reports.gitgit push -u origin mainorigin— имя удалённого репозитория по умолчанию.-uзапоминает связь, дальше хватитgit push.
Обновите страницу на GitHub: там ваши файлы и история коммитов.
Чужой репозиторий копируют командой git clone:
git clone git@github.com:company/analytics.gitPull Request и Merge Request
Заголовок раздела «Pull Request и Merge Request»После git push ветки GitHub показывает кнопку Compare & pull request. На GitLab кнопка называется Create merge request.
Это одно и то же. Вы просите команду: «Посмотрите мои изменения и добавьте их в main».
| GitHub | GitLab | |
|---|---|---|
| Название | Pull Request (PR) | Merge Request (MR) |
| Автоматические проверки | GitHub Actions (.github/workflows/*.yml) | GitLab CI/CD (.gitlab-ci.yml) |
Защита main | Branch protection rules / Rulesets | Protected branches |
| Одобрение | Approve в Review | Approve в Merge Request |
| Где работает | github.com, GitHub Enterprise | gitlab.com, self-hosted GitLab |
Идея одинаковая. Названия и кнопки разные. Выучите один раз. Второй освоите за час.
Хороший Pull Request
Заголовок раздела «Хороший Pull Request»- Маленький. Одна задача. Читать 20 строк легко. Читать 2000 — никто не будет внимательно.
- С понятным названием и описанием. Что изменилось и зачем. Как проверить.
- С зелёным CI. Не просите ревью, пока проверки красные.
Ревьюер смотрит diff и пишет замечания к конкретным строкам. Затем выбирает одно из трёх:
- Approve — всё хорошо.
- Request changes — нужно исправить.
- Comment — вопрос или совет.
Что искать в SQL-ревью:
- Совпадает ли гранулярность (
grain) с ожидаемой? - Нет ли дублей после
JOIN? - Обрабатываются ли
NULL? - Нет ли секретов в коде?
Ревью — не проверка человека. Это способ найти ошибку до продакшена и поделиться знанием.
merge — объединить
Заголовок раздела «merge — объединить»Когда PR одобрен и CI зелёный, нажмите Merge. Ветка вливается в main. После этого локально обновите main:
git switch maingit pullgit branch -d add-refunds # удалить локальную веткуКнопки merge на платформах бывают в трёх вариантах: merge commit, squash и rebase. На старте берите Squash and merge. Все коммиты ветки склеятся в один чистый коммит в main.
Конфликты
Заголовок раздела «Конфликты»Конфликт возникает, когда два человека поменяли одни и те же строки. Git не знает, чья версия правильная, и просит решить вас.
В файле появляются маркеры:
<<<<<<< HEADwhere status = 'completed'=======where status in ('completed', 'shipped')>>>>>>> add-refundsЧто делать:
- Откройте файл. Оставьте нужный вариант. Удалите маркеры
<<<<<<<,=======,>>>>>>>. git add <файл>git commit
Конфликтов меньше, если ветки короткие и вы чаще делаете git pull.
Практика
Заголовок раздела «Практика»Полную практику на настоящих сайтах вы пройдёте в следующих уроках: GitHub и GitLab. Там вы создадите бесплатный репозиторий, заведёте Issue, откроете Pull Request и Merge Request.
Здесь потренируйте конфликт локально. Для этого хватит репозитория sql-reports из прошлого урока.
Задание. Конфликт
Заголовок раздела «Задание. Конфликт»- Создайте ветку
aотmain. Поменяйте вmodels/revenue.sqlстрокуwhereнаwhere status = 'completed' and amount > 0. Сделайте коммит. - Вернитесь в
main. Поменяйте ту же строку наwhere status in ('completed', 'shipped'). Сделайте коммит. - В
mainвыполнитеgit merge a.
Проверка: Git пишет CONFLICT. Решите конфликт: оставьте условие status in ('completed', 'shipped') and amount > 0. Завершите merge.
Решение
git switch -c a# правим файлgit commit -am "Filter amount > 0"git switch main# правим ту же строкуgit commit -am "Include shipped orders"git merge a# открываем файл, убираем маркеры, оставляем нужное условиеgit add models/revenue.sqlgit commit -m "Merge branch a"