Пара 12: Git в команде: ветки, review и конфликты

90 минут · 3 курс, ML.

Содержание и результат

Объединить два изменения и разрешить конфликт по смыслу, сохранив историю.

План занятия

0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

Ветка — указатель на историю

Ветка не создаёт отдельную полную копию проекта.

Ветка указывает на commit и продвигается при новой записи. git switch -c создаёт ветку, switch возвращает к другой. Рабочие файлы меняются согласно выбранному состоянию; незакоммиченные правки могут мешать переключению. В учебном workflow одна небольшая задача — одна ветка, затем review и merge. Pull request — способ обсуждения изменения на платформе, а не сущность самого Git. До внешнего хостинга всё упражнение можно выполнить локально, поэтому обучение не зависит от доступности GitHub в аудитории.

Аналогия: отдельная линия эксперимента с точкой возврата в журнале.

Конфликт — вопрос смысла

Git не может автоматически решить противоречие в одной области.

При merge Git может объединить независимые изменения. Если одна область изменена несовместимо, он оставляет маркеры конфликта. HEAD показывает текущую сторону, другая сторона — вливаемую ветку. Нельзя просто удалить маркеры и выбрать случайный вариант: прочитайте задачу и получите осмысленный итог. После исправления выполняем проверку, add и завершение merge. git merge --abort отменяет незавершённое слияние и возвращает к исходному состоянию при обычном чистом старте. Сначала убедитесь, что важные рабочие изменения сохранены. Конфликт — нормальный этап совместной работы, а не поломка Git.

Аналогия: два редактора меняют одну фразу; программа не знает намерения авторов.

Возврат изменений

revert создаёт обратное изменение в истории.

git revert SHA полезен для отмены опубликованного commit: он создаёт новый commit, сохраняя понятную историю. reset изменяет указатели и в некоторых режимах рабочие файлы; на этом курсе не используем reset --hard как универсальную кнопку. rebase и force push вынесены за обязательный минимум. Перед merge проверяем status, читаем diff, запускаем подходящую проверку. Review отвечает на вопросы поведения, ошибок и безопасности, а не только форматирования. В парах рецензент должен пересказать изменение своими словами и предложить одну проверку.

Аналогия: бухгалтерская корректировка добавляется новой записью, а не стиранием старой.

Команды и наблюдения

Окружение: Ubuntu / Bash, lab.

git switch -c docs/health
printf "Health endpoint: /healthz
" > route-note.txt
git add route-note.txt
git commit -m "docs: describe health endpoint"
git switch main
printf "Health endpoint: /readyz
" > route-note.txt
git add route-note.txt
git commit -m "docs: record alternate endpoint"
git merge docs/health
# Resolve route-note.txt using the actual API contract
git status

Этот конфликт создаётся в отдельном учебном файле, не ломая README и код сервиса.

Ожидаемый результат: add/add conflict в route-note.txt; правильное решение сохраняет реально существующий /healthz.

Вариант для macOS

Ветки, конфликты и revert устроены одинаково. На APFS без различения регистра переименование только регистра имени требует осторожности; тестируйте checkout на Linux, если проект туда доставляется.

git switch -c docs/health
git status
git merge docs/health
git log --graph --oneline --all

Практика: Парное review

  1. Создайте конфликт по демонстрации в собственной копии.
  2. Сосед объясняет, какой endpoint действительно существует, используя app.py и curl.
  3. Исправьте файл, git add route-note.txt и git commit завершат merge.
  4. Сделайте отдельный неправильный docs: commit и отмените его через revert; проверьте log.

Результат: Разрешённый merge, revert и краткая запись review.

Проверка: В файле нет маркеров; актуальный endpoint подтверждён; история сохранена.

Неисправность для разбора: Выбрана красивая, но несуществующая версия URL.

Решение и диагностика

После конфликта printf "Health endpoint: /healthz\n" > route-note.txt; git add route-note.txt; git commit. Для отдельного отменяемого изменения сначала создайте commit и сохраните его SHA, затем git revert SHA. Не отменяйте случайный commit из чужого примера. Финальная проверка grep маркеров в route-note.txt, git log --graph --oneline --all и curl к учебному сервису.

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

Самостоятельная работа

Составить чеклист review: назначение, тест, конфигурация, секреты и обратимость.

Источники