Пара 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
- Создайте конфликт по демонстрации в собственной копии.
- Сосед объясняет, какой endpoint действительно существует, используя app.py и curl.
- Исправьте файл, git add route-note.txt и git commit завершат merge.
- Сделайте отдельный неправильный 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: назначение, тест, конфигурация, секреты и обратимость.