Получите и объедините обновление коллеги

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

Введение

Саду Riverlight Garden нужен правильный путеводитель для посетителей. Ваш подготовленный локальный коммит переносит вход и обновляет телефон для посетителей. Коллега уже опубликовал новый маршрут без ступеней. Посетителям нужны все три исправления.

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

Вы уже должны понимать, что такое коммит и ветка, и знать git add, git commit и базовое сравнение diff. Имена удалённых репозиториев, получение изменений, слияние, отправка и клонирование объясняются здесь. Продолжительность 35 минут — авторская оценка с учётом чтения и обычных ошибок.

Найдите обновление коллеги

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

Откройте Terminal. Начните в подготовленном репозитории редактора:

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

Команда cd меняет рабочий каталог этого терминала. Если вы ошиблись в пути, используйте pwd, чтобы вывести текущий каталог, и ls, чтобы показать его содержимое, а затем повторите полную команду cd выше. Такие обычные ошибки навигации не требуют новой VM.

Для нового коммита слияния понадобятся данные автора. Параметр --local сохраняет эти настройки только в данном репозитории. Текст в кавычках является одним значением, даже если содержит пробелы; адрес электронной почты в примере вымышленный. Вы можете выбрать свои имя и адрес.

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

Ваш существующий локальный коммит уже завершён. Прочитайте его сведения для посетителей:

cat guide.txt
cat contacts.txt

Вы должны увидеть South entrance и телефон стойки для посетителей 010-555-0120. Сохраните предложение о последнем входе в путеводителе. В отдельном файле маршрута пока написано Use the north ramp:

cat access.txt

Команда git status --short выводит компактный список изменённых файлов. Отсутствие вывода здесь означает, что подготовленный вклад сохранён в коммите, а рабочее дерево чистое:

git status --short

Удалённый репозиторий (remote) — это именованное подключение к другому репозиторию. origin — имя этого подключения, а не особый сервер. Параметр -v показывает адреса для получения и отправки:

git remote -v

Оба адреса указывают на /home/labex/project/guide-team/shared.git. Это голый репозиторий (bare repository): он хранит общую историю без редактируемой рабочей копии. Не редактируйте его внутренние файлы.

Попробуйте доставить свою ветку. Команда push отправляет коммиты; main обозначает ветку, которую нужно обновить в origin. Ожидается, что эта первая отправка завершится отказом с ненулевым кодом выхода. Выполните команду отдельно и продолжайте после отказа:

git push origin main

Найдите [rejected], main -> main и (fetch first). Общая ветка содержит работу, которой нет в вашей текущей истории, поэтому Git отказывается её заменять. Это обновление не является fast-forward: существующая вершина общей ветки не является предком предлагаемой вершины. Принудительная отправка убрала бы вклад коллеги из ветки и нарушила бы условия задачи.

Команда fetch загружает удалённые коммиты и обновляет локальный указатель отслеживания удалённой ветки origin/main. Она не сливает их с вашей собственной main и не переписывает рабочие файлы:

git fetch origin

Сравните истории. Параметр --oneline показывает по одной короткой строке на коммит; --graph рисует связи с родителями; --all включает локальные ветки и указатели удалённых веток; --decorate добавляет их метки. Параметр --no-pager выводит результат напрямую; если во время экспериментов откроется просмотрщик, нажмите q, чтобы выйти из него.

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

Найдите Move the gate and update the visitor desk на HEAD -> main и Update the step-free route на origin/main. Оба происходят от Open the garden guide. HEAD обозначает коммит, который сейчас выбран в рабочей копии. Эти два вклада различаются; один не заменяет другой.

Прочитайте маршрут коллеги прямо из его снимка. Команда show принимает выражение revision:path, поэтому origin/main:access.txt означает этот файл в полученной ревизии:

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

В нём написано Use the riverside ramp. В вашем рабочем файле маршрута по-прежнему написано Use the north ramp. Это различие доказывает, что получение сделало новую историю доступной, оставив рабочее дерево нетронутым. Первая проверка принимает полученную ревизию, если ваш исходный локальный коммит остался неизменным.

Объедините независимые вклады

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

Оставайтесь в Terminal, в /home/labex/project/guide-team/editor. Слияние (merge) объединяет истории. Поскольку эти изменения затрагивают разные файлы, Git может объединить их текст автоматически. Параметр --no-edit принимает созданное Git сообщение о слиянии и не открывает редактор:

git merge --no-edit origin/main

Ожидается сообщение об успешном слиянии, обычно Merge made by the 'ort' strategy.. Git создаёт коммит слияния с двумя родителями: вашим исходным коммитом и исходным коммитом коллеги. Ни один из вкладов не переписывается.

Прочитайте настоящие объединённые файлы:

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

Путеводитель должен сохранить South entrance, 09:00-17:00 и предложение о последнем входе; маршрут должен содержать Use the riverside ramp; телефон должен остаться 010-555-0120. Независимые изменения объединились без конфликтов, но вам всё равно нужно оценить их смысл.

Изучите полученную историю:

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

Слияние на HEAD -> main соединяет обе линии вкладов. origin/main по-прежнему отмечает ранее полученный коммит коллеги до вашей отправки. Это нормально: слияние изменило локальную main, а не общую main.

Проверьте рабочее состояние:

git status --short

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

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

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

Оставайтесь в 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 требуется ваше решение, потому что оба участника изменили одну строку.