Advertisement
  1. Code
  2. Git

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

Scroll to top
Read Time: 4 min

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 будет следующим:

1
On branch master
2
Changes not staged for commit:
3
  (use "git add <file>..." to update what will be committed)
4
  (use "git checkout -- <file>..." to discard changes in working directory)
5
6
    modified:   foo.py

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

1
git stash

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

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

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

1
git stash pop

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

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

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

1
Auto-merging foo.py
2
CONFLICT (content): Merge conflict in foo.py

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

1
<<<<<<< Updated upstream
2
print("Recently committed changes");
3
=======
4
print("Incomplete work");
5
>>>>>>> Stashed changes

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

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

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

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

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

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

1
git stash list

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

1
stash@{0}: WIP on new-feature: 5cedccc Try something crazy
2
stash@{1}: WIP on new-feature: 9f44b34 Take a different direction
3
stash@{2}: WIP on new-feature: 5acd291 Begin new feature

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

1
git stash apply stash@{1}

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

1
git stash drop stash@{1}

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

Заключение

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

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.