Разрешите конфликт в путеводителе

GitBeginner
Практиковаться сейчас

Введение

Следующее обновление путеводителя по саду включает два правильных факта в одной строке. Ваш подготовленный коммит направляет посетителей к южному входу и обновляет телефон стойки для посетителей. Опубликованный коммит коллеги меняет часы работы и маршрут без ступеней. Итоговому путеводителю нужны оба набора сведений.

Эта работа начинается с собственных независимых репозиториев; файлы из предыдущей VM не нужны. Вы увидите настоящий конфликт содержимого, потренируетесь отменять незавершённое слияние, объедините правильные поля и доставите результат в новый принимающий клон.

Пройдите предыдущую пошаговую работу или уже разберитесь в именах удалённых репозиториев, получении изменений, слиянии, отправке и клонировании. Базовая навигация в терминале, коммиты и сравнения diff — необходимые предварительные навыки. Продолжительность 45 минут — авторская оценка.

Изучите конфликт и безопасно начните слияние заново

На этом шаге вы сравните два вклада, увидите, почему автоматическое слияние останавливается, и потренируетесь безопасно возвращаться к исходному локальному состоянию.

Откройте Terminal и войдите в независимо подготовленный репозиторий этой работы:

cd /home/labex/project/guide-team/editor

Задайте данные автора только для этого репозитория. Параметр --local позволяет не менять глобальные настройки; кавычки объединяют имя в одно значение. Эти вымышленные значения — примеры, а не обязательные личные данные:

git config --local user.name "Guide Editor"
git config --local user.email "guide@example.com"

Прочитайте подготовленный локальный путеводитель, а затем получите обновление коллеги:

cat guide.txt
git fetch origin

Прочитайте версию коллеги. Выражение revision:path выбирает настоящий файл из коммита, а --no-pager выводит его напрямую:

git --no-pager show origin/main:guide.txt

Ваша версия содержит South entrance и 09:00-17:00; версия коллеги — North entrance и 10:00-18:00. Решения по существу независимы: используйте ваш южный вход и новые часы работы коллеги. Сохраните предложение о последнем входе. Из других страниц сохраните ваш телефон стойки для посетителей и пандус у реки из вклада коллеги.

Начните слияние. Параметр --no-edit позволяет не открывать редактор, если слияние завершится автоматически. Здесь ожидается ненулевой код выхода и остановка из-за конфликта содержимого. Выполните команду отдельно и продолжайте:

git merge --no-edit origin/main

Ожидаются CONFLICT (content): Merge conflict in guide.txt и Automatic merge failed; fix conflicts and then commit the result. Git ещё не создал новый коммит.

Прочитайте краткое состояние и файл с конфликтом:

git status --short
cat guide.txt

UU guide.txt означает, что файл не объединён. В файле <<<<<<< HEAD начинает вашу версию, ======= разделяет варианты, а >>>>>>> origin/main завершает версию коллеги. Эти маркеры описывают разногласие; удаление одних лишь маркеров оставило бы противоречащие строки. Страница маршрута уже может быть подготовлена как M access.txt, поскольку Git успешно объединил это независимое изменение.

Прежде чем разрешать конфликт, потренируйтесь восстанавливать состояние. Команда git merge --abort отменяет только незавершённое слияние, возвращая отслеживаемые файлы и индекс в состояние до слияния. Этот сценарий начался с чистого состояния; в обычной работе перед слиянием сохраните посторонние изменения в коммите или отложите их.

git merge --abort
git status --short

Изменения не должны отображаться. Снова прочитайте путеводитель: вернулись исходные южный вход и старые часы работы.

cat guide.txt

Теперь снова начните то же слияние. Конфликт и ненулевой код выхода снова ожидаемы. Оставьте этот второй конфликт открытым для следующего шага:

git merge --no-edit origin/main
git status --short

Проверка ожидает активный неразрешённый конфликт в guide.txt. Если вы ошиблись в пути, используйте pwd и ls, затем вернитесь полной командой cd выше. Не удаляйте .git и не сбрасывайте VM ради исправления обычной ошибки навигации.

Объедините правильные сведения и завершите слияние

На этом шаге вы превратите конфликт в одну полезную строку путеводителя, сохранив страницы, которые Git уже объединил.

Оставайтесь в Terminal, в /home/labex/project/guide-team/editor, с открытым конфликтом из предыдущего шага. Вам нужны South entrance из вашего вклада и 10:00-18:00 из вклада коллеги. Выбор всего файла одной из сторон потерял бы одно одобренное изменение.

Следующая команда заменяет только guide.txt его полным результатом из трёх строк. Символ > перенаправляет вывод в этот файл, заменяя его содержимое. Конструкция <<'GUIDE' — here-document: следующие строки служат буквальным вводом до строки, содержащей только GUIDE. Скопируйте весь блок, включая завершающий маркер. Кавычки вокруг маркера предотвращают подстановки оболочки в тексте. Программирование не требуется.

cat > guide.txt <<'GUIDE'
RIVERLIGHT GARDEN
Gate: South entrance; Hours: 10:00-18:00
Last entry is 30 minutes before closing.
GUIDE

Прочитайте все три файла перед подготовкой. Предложение о последнем входе должно остаться; access.txt должен содержать пандус у реки; contacts.txt — ваш обновлённый телефон.

cat guide.txt
cat access.txt
cat contacts.txt

Ожидаемое содержимое дополнительных страниц:

Step-free route: Use the riverside ramp
Visitor desk: 010-555-0120

Команда git add записывает разрешённый файл в индекс и помечает его конфликт как разрешённый. Сама по себе она не создаёт коммит:

git add guide.txt

Изучите, что слияние добавит относительно вашего исходного локального коммита. Команда diff --cached сравнивает подготовленный результат с HEAD; параметр --no-pager оставляет вывод в этом терминале:

git --no-pager diff --cached

Ожидаются изменение часов работы в guide.txt и изменение пандуса в access.txt. Ваш южный вход и телефон для посетителей уже были в вашем локальном родительском коммите, поэтому в этом сравнении они могут не появляться как новые строки. Проверьте не только эту разницу, но и итоговые файлы.

Если вы заметили опечатку, повторите полный блок путеводителя с исправлением и снова выполните git add guide.txt. Если хотите полностью отказаться от незавершённой попытки, используйте git merge --abort из предыдущего шага, заново начните слияние и повторите разрешение конфликта. Не используйте abort после завершения коммита.

Завершите слияние с поясняющим сообщением. Параметр -m задаёт сообщение напрямую, не открывая редактор; другая осмысленная формулировка также принимается:

git commit -m "Combine gate and opening hours"

Изучите две линии предков и чистое рабочее дерево:

git --no-pager log --oneline --graph --all --decorate
git status --short

Вывода состояния не ожидается. Сообщения обоих исходных вкладов должны остаться ниже нового слияния. Проверка требует эту историю и полные правильные файлы, а не только отсутствие маркеров конфликта.

Опубликуйте и получите полный путеводитель

На этом шаге вы доставите объединённую ревизию в общий репозиторий и прочитаете её в новой принимающей копии. Одно лишь локальное слияние ещё ничего не доставляет в другую копию.

Оставайтесь в Terminal, в /home/labex/project/guide-team/editor. Команда push origin main отправляет историю локальной main в репозиторий с именем origin. На этот раз общий вклад является предком вашего слияния, поэтому отправка может продвинуть общую main, не удаляя его.

git push origin main

Ожидается main -> main без отказа. Если отправка отклонена, снова получите изменения и изучите граф; не добавляйте параметр принудительной отправки. В подготовленном сценарии нет участника, работающего в фоне, но в настоящей команде новая работа может быть опубликована в любой момент.

Теперь перейдите в каталог, содержащий оба репозитория:

cd /home/labex/project/guide-team

Команда git clone создаёт новый репозиторий и рабочие файлы из источника. Здесь shared.git — существующий локальный путь источника, а received-guide — новый каталог назначения. Принимающая копия должна создаваться из общего репозитория: так она покажет, было ли слияние действительно доставлено.

git clone shared.git received-guide

Ожидаются Cloning into 'received-guide'... и done.. Если вы уже создали клон во время экспериментов, сохраните эту копию: войдите в received-guide и выполните уже изученную git fetch origin, а затем git merge --no-edit origin/main, чтобы обновить её. Не удаляйте исходный репозиторий редактора ради повторного клонирования.

Войдите в принимающую копию:

cd received-guide

Прочитайте каждый настоящий файл. Команда cat выводит файл, не меняя его:

cat guide.txt
cat access.txt
cat contacts.txt

Сравните сведения с объединёнными требованиями предыдущего шага. Все три файла должны быть полными, включая неизменённые строки. Одно лишь сообщение об успешном клонировании не доказывает правильность информации.

Наконец, прочитайте историю принимающей копии. Параметр --oneline сокращает запись каждого коммита, --graph рисует связи с родителями, а --decorate подписывает указатели веток. Параметр --no-pager выводит результат напрямую, не открывая просмотрщик с прокруткой.

git --no-pager log --oneline --graph --decorate

Верхний коммит слияния имеет две линии предков, включающие сообщения обоих исходных вкладов и начальный коммит. Точные идентификаторы ваших коммитов будут отличаться. Проверьте, что содержимое не потеряно и что принимающая копия находится на main с чистым рабочим деревом отслеживаемых файлов:

git status --short

Отсутствие вывода означает, что нет подготовленных, неподготовленных или неотслеживаемых изменений. Вы доставили полезный набор файлов через настоящие репозитории Git, работающие на одной учебной машине.

Резюме

Вы прочитали обе стороны настоящего конфликта, использовали git merge --abort для безопасного восстановления, а затем составили правильную комбинацию полей вместо выбора целой стороны. Вы сохранили автоматически объединённый маршрут, ваш телефон для посетителей и неизменённое предложение путеводителя.

Опубликованное слияние и независимый принимающий клон теперь содержат полный путеводитель с сохранением обоих исходных вкладов. В испытании меняется справочник, а правильные поля распределяются между участниками наоборот.