Отмените ошибочное изменение и сохраните более позднюю работу

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

Введение

Fieldnotes проводит небольшие мастер-классы и прогулки по саду. Опубликованное обновление случайно приостановило запись на Clay & Coffee. Более позднее корректное обновление добавило Sunset Walk. Команда хочет восстановить запись, сохранив новое мероприятие и все существующие бронирования.

Сначала вы воспользуетесь работающим мастер-классом, чтобы увидеть обычное бронирование и получение билета. Затем изучите настоящую историю Git, отмените старое ошибочное изменение новым исправляющим коммитом, опубликуете его и проверите настоящее бронирование. Возврат всего сайта назад потерял бы полезную работу.

Вы должны понимать базовую навигацию в терминале, коммиты, ветки и простой просмотр log/diff; рекомендуется пройти предыдущий курс об объединении командных изменений. Подготовленные вкладки Workspace и Event Desk — единственные необходимые точки входа. Это настоящие репозитории Git и HTTP-приложение на одной учебной машине. В этом сценарии сайт читает общую main напрямую; конвейер развёртывания на хостинге здесь не изучается. Все личности и мероприятия вымышленные. Продолжительность 45 минут — авторская оценка.

Опробуйте запись и найдите ошибочное обновление

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

Откройте вкладку Event Desk. В списке мастер-классов найдите Postcard Studio и нажмите его ссылку View workshop. Этот работающий мастер-класс показывает Save your seat, поле Full name и Reserve a place. Введите Alex Morgan или другое имя для примера и один раз нажмите Reserve a place.

Подтверждение должно содержать You're on the list. и показывать Postcard Studio, Studio Two и EUR 10.00. Нажмите Download ticket. Откройте файл .txt через список загрузок браузера. Он должен содержать те же мастер-класс, имя, место встречи и итоговую сумму. Номер бронирования создаётся для вашего настоящего заказа и будет отличаться. Это нормальный полезный результат, который должен предоставлять и неисправный мастер-класс.

Нажмите All workshops в шапке страницы. Откройте Clay & Coffee по его ссылке View workshop. Ожидаемая начальная проблема — Registration is paused без формы бронирования. Существующие бронирования остаются действительными; не удаляйте их ради исправления настройки записи.

Снова используйте All workshops в шапке и откройте Sunset Walk. Оно должно оставаться доступным с данными 15 Nov 2026, 16:00, East Gate и EUR 6.00. Более поздняя страница — полезная работа, которую следует сохранить, а не часть ошибки.

Переключитесь на вкладку Workspace. Начните в репозитории редактора:

cd /home/labex/project/event-desk/editor

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

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

git config --local user.name "Event Editor"
git config --local user.email "events@example.com"

Приложение хранит бронирования вне репозитория редактора. В его JSON-файле после имён полей в кавычках стоят двоеточия и значения; имена и идентификаторы мастер-классов — текст, а цены хранятся целым числом центов. .. означает родительский каталог, поэтому следующая команда только для чтения выводит соседний файл бронирований без выхода из каталога редактора:

cat ../bookings.json

Найдите исходные записи Casey Lane и Sam Rivera, а также ваше новое бронирование Postcard Studio. Сохраните эти записи неизменными. Git исправит версионируемую настройку мероприятия; он не будет возвращать коллекцию бронирований к прежнему состоянию.

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

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

Новейшая запись — Add the Sunset Walk event, за ней идут Pause Clay and Coffee registrations и Open the Fieldnotes event desk. Точные идентификаторы коммитов будут отличаться. Подготовленный тег incident-start — неподвижная закладка на полученную вами версию. В отличие от main, он не сдвинется при создании нового коммита. Сохраните эту закладку неизменной.

Прочитайте, что изменил новейший коммит, отмеченный закладкой. Команда show показывает сообщение и патч выбранного коммита:

git --no-pager show incident-start

Он добавляет events/sunset-walk.json. Это новое мероприятие, которое нужно сохранить. Отменить требуется более раннюю приостановку, а не это добавление. Проверка подтверждает ваше настоящее новое контрольное бронирование и билет, а не считает существующий пример новым результатом.

Добавьте исправление, сохранив более позднюю работу

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

Оставайтесь в Workspace, в /home/labex/project/event-desk/editor. Выражение ревизии может обозначать предка без переключения на него и без перемещения ветки. incident-start~1 означает одного родителя до неподвижной закладки; incident-start~2 — двух родителей до неё. Прочитайте средний коммит:

git --no-pager show incident-start~1

Его патч меняет registration_open с true на false в events/clay-and-coffee.json. Эта логическая настройка разрешает или приостанавливает новую запись. capacity — положительный предел мест мастер-класса; он также должен оставаться пригодным для работы. Неизменённое значение price_cents 1800 означает EUR 18.00.

Прочитайте исходный снимок мероприятия. Двоеточие соединяет ревизию с путём файла, поэтому следующее выражение выбирает файл из версии за два родителя до закладки:

git --no-pager show incident-start~2:events/clay-and-coffee.json

В исходной версии запись открыта, а вместимость равна 12. Восстановление всего сайта до этой старой версии также удалило бы Sunset Walk. Операция revert, напротив, вычисляет обратное изменение для одного выбранного коммита и записывает новое исправление в текущую ветку. Исходный ошибочный коммит остаётся в истории, как и более поздние полезные коммиты.

Проверьте рабочее состояние перед исправлением. Параметр --short даёт компактный список изменённых файлов; в подготовленном репозитории вывода быть не должно:

git status --short

Теперь отмените выявленный ошибочный коммит. Параметр --no-edit принимает созданное Git сообщение исправления и не открывает редактор. Неподвижная закладка сохраняет цель стабильной даже после продвижения вашей ветки:

git revert --no-edit incident-start~1

Ожидается новый коммит, начинающийся с Revert "Pause Clay and Coffee registrations", и изменение одного файла. Ваши данные автора и идентификатор коммита могут отличаться.

Потренируйтесь распознавать уже завершённую операцию: выполните ту же команду с неподвижной закладкой ещё один раз. Ожидается, что повторение вернёт ненулевой код выхода с nothing to commit, working tree clean. Выполните команду отдельно и продолжайте после неё:

git revert --no-edit incident-start~1

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

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

Должно быть ровно одно новое исправление над исходными коммитами Sunset Walk, приостановки и открытия, без рабочих изменений. Закладка incident-start по-прежнему обозначает полученную версию. Это также помогает не путать движущийся HEAD с неподвижной ссылкой на инцидент.

Изучите точное исправление. Команда diff сравнивает два указанных снимка. HEAD — ваш текущий выбранный коммит; -- отделяет ревизии от следующего пути файла:

git --no-pager diff incident-start HEAD -- events/clay-and-coffee.json

Ожидается только обратное изменение, с false на true. Проверьте, что новое мероприятие не отличается от полученной версии:

git --no-pager diff incident-start HEAD -- events/sunset-walk.json

Для Sunset Walk вывода не ожидается. У вас есть целевое локальное исправление с сохранением более поздней работы.

Переключитесь на Event Desk, нажмите All workshops в шапке и снова откройте Clay & Coffee. Там по-прежнему написано Registration is paused. Это ожидаемо: коммит редактора локальный, а сайт читает общий репозиторий. На следующем шаге вы опубликуете исправление. Эта проверка оценивает локальный исправляющий коммит и сохранённые файлы.

Опубликуйте и проверьте восстановленную запись

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

Переключитесь на Workspace, оставаясь в /home/labex/project/event-desk/editor. origin — подготовленное имя удалённого подключения к /home/labex/project/event-desk/shared.git, локальному голому репозиторию, хранящему общую историю без редактируемой рабочей копии. Команда push origin main отправляет вашу локальную main в это место назначения:

git push origin main

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

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

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

Локальная main и origin/main теперь указывают на новый исправляющий коммит. Исходная закладка инцидента и все более ранние сообщения остаются ниже него.

Переключитесь на Event Desk. Нажмите All workshops в шапке страницы, затем откройте Clay & Coffee. Теперь там видны Save your seat, Full name и Reserve a place. Перед вводом имени проверьте неизменённые дату, место встречи и цену EUR 18.00.

У восстановленного мастер-класса появилась настоящая форма бронирования.

Найдите название мастер-класса и форму справа; на узком экране форма находится под сведениями о мероприятии. Остаток мест отражает настоящие бронирования, поэтому число может отличаться от примера.

Введите Jamie Chen или другое полное имя для примера и один раз нажмите Reserve a place. Подтверждение должно содержать You're on the list., Clay & Coffee, 14 Nov 2026, 14:00, The Pottery Room, одно место и EUR 18.00.

Подтверждение настоящего бронирования предоставляет билет для скачивания.

Нажмите Download ticket, откройте полученный файл .txt через список загрузок браузера и сравните с подтверждением номер бронирования, мастер-класс, дату, время, место встречи, имя, количество мест и итоговую сумму. Номер создаётся для вашего бронирования; его не следует копировать со скриншота.

Используйте All workshops в шапке, чтобы снова открыть Sunset Walk. Полная страница должна по-прежнему показывать 15 Nov 2026, 16:00, East Gate и EUR 6.00. Postcard Studio также должен оставаться пригодным для записи с учётом реального остатка мест.

Переключитесь на Workspace и снова прочитайте коллекцию бронирований:

cat ../bookings.json

Обе исходные записи и ваше предыдущее бронирование Postcard Studio сохранились; добавилось новое бронирование Clay & Coffee. Вы исправили версионируемое мероприятие, не возвращая данные бронирований назад.

Завершите проверкой рабочего состояния:

git status --short

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

Резюме

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

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