Перейти к содержанию

Временное сохранение работы

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

Рассмотрим временное сохранение через git stash. Продолжим тот же учебный каталог в отдельном сценарии lesson-12 архива. История подготовлена только в виде инструкции и файлов. Команды не выполнялись, а временное сохранение не используется как резервная копия исходного ProfessorWeb.

Для продолжения используем Git 2.32 или новее: просмотр новых файлов через stash show --include-untracked описан в официальном руководстве этой версии.

Содержание незаконченной задачи

Исходный каталог имеет две правильные ссылки, зелёный цвет ссылок и записанные рекомендации прежних уроков. Добавьте в конец content/courses.md новый абзац «Начните с темы, которую используете в своём проекте.» Пока не добавляйте его в индекс. Кроме того, создайте новый файл notes/lesson-ideas.md с одной строкой «Добавить пример чтения сетевого ответа.»

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

git status --short
git diff -- content/courses.md

Ожидается изменённый Markdown и новый файл заметок. Результаты сборки в dist/ исключены прежними правилами; в сценарии они не создаются. Временное сохранение должно захватить наши два исходника, поэтому явно включим новые неотслеживаемые файлы:

git stash push -u -m "Черновик рекомендации каталога"
git stash list
git status --short

После этого ожидается чистый статус. Новый файл заметок временно исчезнет из рабочей папки, а Markdown вернётся к записанной версии. Документация stash описывает сохранение рабочего состояния и параметр включения новых файлов. Мы выбираем -u, потому что заметка ещё не отслеживалась; игнорируемые файлы этим вариантом не включаются.

Другая задача в отдельной ветке

Создайте лабораторную ветку fix/link-underline. В public/theme.css добавьте к правилу ссылок text-underline-offset: 0.18em;. Изменение касается оформления существующих ссылок, не URL и не содержания рекомендаций. Прочитайте различие и сохраните только CSS.

git switch -c fix/link-underline
git add public/theme.css
git commit -m "Уточнить положение подчёркивания ссылки"

Ожидается один законченный коммит. Новый абзац и файл заметок в него не входят: они находятся во временном сохранении. Эта раздельность помогает позднее обсуждать задачу. Ревью оформления не должно одновременно решать, готов ли новый учебный текст.

В нашей простой истории на main за это время ничего не менялось. Вернитесь туда и объедините исправление явным fast-forward:

git switch main
git merge --ff-only fix/link-underline

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

Возвращение с сохранением страховки

Сначала посмотрите, что собираетесь применить:

git stash show --stat 'stash@{0}'
git stash show -p 'stash@{0}'
git stash apply 'stash@{0}'

Обычный подробный просмотр показывает изменения отслеживаемых файлов; для просмотра включённой новой заметки используйте также git stash show -p --include-untracked 'stash@{0}'. В кавычках записано имя самой свежей временной записи. Если вы создавали другие записи, номер меняется: выбирайте по описанию и содержимому, а не автоматически по нулю.

После apply ожидается возвращение абзаца и нового файла заметок. Исправленный CSS остаётся. В отличие от объединения двух изменений в одном случайном коммите, теперь видны отдельная законченная задача и незаконченная рекомендация. apply оставляет временную запись в списке, поэтому сначала можно убедиться, что файлы вернулись полностью.

Для нашего сценария откройте оба файла и проверьте формулировки. Затем сохраните рекомендацию и заметку отдельным коммитом. Только после этого временная копия становится лишней:

git add content/courses.md notes/lesson-ideas.md
git commit -m "Добавить рекомендацию выбора темы"
git stash drop 'stash@{0}'

Удаление относится к выбранной записи. Перед ним ещё раз прочитайте список: если между действиями появилась другая запись, прежний номер может обозначать другое содержимое. В учебной модели новых сохранений нет, поэтому stash@{0} остаётся тем же объектом до удаления.

Временная запись может содержать больше, чем вы помните по короткому описанию. Например, во время написания рекомендации вы исправили опечатку README, но забыли об этом к моменту срочной задачи. Перед возвратом подробное чтение помогает снова увидеть состав работы. В нашей модели исходно меняются только Markdown и новая заметка, что делает ожидаемый результат однозначным. Если ваш статус отличается от сценария, не пытайтесь привести его к примеру широким удалением файлов. Сначала определите дополнительные изменения и их происхождение. Учебная последовательность объясняет механизм на заданном состоянии; она не доказывает безопасность тех же действий для любой папки с похожим названием.

Конфликт и длительная работа

Наши две задачи меняют разные файлы, поэтому ожидаемое возвращение простое. Если срочная задача изменит ту же строку Markdown, применение может остановиться с конфликтом. Тогда потребуется прочитать обе редакционные цели и согласовать итоговый текст. Временная запись при варианте apply остаётся; не удаляйте её лишь потому, что часть файла уже появилась.

У применения stash нет универсального продолжения вроде окончания начатого merge. После ручного решения вы управляете обычным рабочим состоянием и индексом. Поэтому полезно заранее выбирать чистую исходную папку и точный набор файлов. Когда в рабочем дереве уже смешаны другие правки, объяснить последствия возврата становится труднее.

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

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

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