Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Git
Code

Быстрый совет: изучение возможностей Git Stash

by
Difficulty:IntermediateLength:ShortLanguages:

Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)

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

  • Выполнить git reset --hard чтобы удалить незафиксированные изменения.
  • Сохранить свою незаконченную работу в виде нового коммита.

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

И здесь на сцену выходит команда git stash. Как и с использованием git reset --hard вы получаете чистую рабочую директорию, но в тоже время сохраняете все свои незаконченные изменения. После фиксирования критичного бага, можно применить назад эти изменения и продолжить работу. Можно рассматривать git stash как кнопку с паузой.

Необходимые условия

В данной статье подразумевается, что у вас уже есть установленный Git и вы владеете его основами. Вы должны свободно фиксировать изменения, создавать коммиты и работать с ветками. Так же потребуется Git репозиторий для экспериментов.

1. Сохранения изменений

Перед тем как выполнить команду git stash, вам нужны незафиксированные изменения в вашем Git репозитории. Например, если вы изменяете файл foo.py, то вывод команды git status будет следующим:

Чтобы сохранить эти изменения, достаточно выполнить команду git stash без каких-либо аргументов.

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

2. Применение сохраненных изменений

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

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

3. Разрешение конфликтов

Так же как и команда git merge, git stash pop может привести к конфликтам, если те же участки кода подверглись изменениям с последнего вызова git stash. Когда это произойдет, то вы увидите следующее сообщение после выполнения команды git stash pop:

Вы можете обнаружить файлы с конфликтами в секции Unmerged paths в выводе команды git status.

Нужно вручную разрешить конфликт в файле, но обычно нет необходимости коммитить изменения сразу, как после git merge конфликтов. В большинстве случаев вы продолжаете работать над незаконченной задачей, пока не подготовите осмысленный коммит. Затем можно просто добавить его в индекс и сделать коммит как обычно. Другими словами можно рассматривать конфликты git stash pop как любые другие незафиксированные изменения.

4. Стек сохранений

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

Пока мы только говорили о сохранении одного набора изменений. Однако каждый раз, когда вы выполняете git stash, незафиксированные изменения сохраняются в стеке. Это означает, что можно хранить сразу несколько наборов изменений.

Это полезно на ранних стадиях разработки, когда вы не уверены, в каком направлении дальше вы будете двигаться. Вместо потери всех изменений с командой git reset --hard, можно сохранять снимки своей работы в стеке в случае если будет необходимо их применить в будущем.

Просмотреть стек можно с помощью параметра list.

Если прежде вы выполнили git stash три раза, то будет выведено что-то похожее на это:

Команда git stash pop всегда достает и применяет самый последний снимок, который находится на вершине стека. Но также возможно выбрать, какой конкретно снимок нужен для применения командой apply. Например если вам необходимо применить второй набор изменений, то нужно воспользоваться следующей командой:

Так же как и в случае в git stash pop, изменения будут применены назад в вашей рабочей директории и можно продолжить работать над незавершенной задачей. Обратите внимание, что эта команда автоматически не удалит снимок из стека. Поэтому потребуется вручную удалить его с помощью команды drop.

Опять же работа со стеком сохранений - это редкий случай для большинства пользователей Git. Команд git stash и git stash pop должно быть достаточно для большинства ваших потребностей, хотя git stash list может оказаться полезной, в случае если вы забыли, где применялась последняя операция сохранения.

Заключение

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

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.