stash pop git что это
git stash
Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.
Откладывание кода
Команда git stash сохраняет неподтвержденные изменения (индексированные и неиндексированные) в отдельном хранилище, чтобы вы могли вернуться к ним позже. Затем происходит откат до исходной рабочей копии. Например:
Теперь вы можете вносить изменения, создавать новые коммиты, переключаться между ветками и выполнять другие операции Git. По необходимости отложенные изменения можно будет применить позже.
Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.
Применение отложенных изменений
Чтобы применить ранее отложенные изменения, воспользуйтесь командой git stash pop :
При извлечении отложенных изменений они удаляются из набора и применяются к рабочей копии.
Вы также можете применить изменения к рабочей копии, не удаляя их из набора отложенных изменений. Для этого воспользуйтесь командой git stash apply :
Это полезно, если вам нужно применить одни и те же отложенные изменения к нескольким веткам.
Теперь вы умеете выполнять основные операции с отложенными изменениями. Однако необходимо помнить о следующей особенности команды git stash : по умолчанию Git не создает отложенные изменения для неотслеживаемых или игнорируемых файлов.
Откладывание неотслеживаемых или игнорируемых файлов
По умолчанию команда git stash создает следующие отложенные изменения:
При этом следующие файлы отложены не будут:
Поэтому если в приведенный выше пример добавить третий файл — неиндексированный (т. е. без выполнения команды git add ), при выполнении команды git stash этот файл не будет отложен.
Управление несколькими наборами отложенных изменений
Рекомендуем добавлять к отложенным изменениям описание в качестве подсказки. Для этого используется команда git stash save «сообщение» :
По умолчанию команда git stash pop применяет последний набор отложенных изменений: stash@
Если вам нужно применить определенный набор ранее отложенных изменений, укажите его идентификатор в качестве последнего аргумента. Это можно сделать так:
Просмотр различий между наборами отложенных изменений
Частичное откладывание изменений
Нажмите ?, чтобы увидеть полный список команд для работы с участками кода. Часто используются следующие команды:
Команда | Описание |
---|---|
/ | искать участок кода по регулярному выражению |
? | Справка |
n | не откладывать участок кода |
q | выйти (все выбранные участки будут отложены) |
s | разделить участок кода на меньшие части |
y | отложить участок кода |
Специальной команды для прерывания не предусмотрено, но прекратить процесс откладывания можно, нажав CTRL-C (сигнал SIGINT).
Создание ветки из отложенных изменений
Если изменения в ветке отличаются от отложенных изменений, операции извлечения или применения последних могут привести к конфликтам. Вместо этого вы можете создать новую ветку с помощью команды git stash branch и применить отложенные изменения к ней. Это можно сделать так:
Новая ветка создается на основе коммита, изменения в котором использовались при создании набора. Затем к этой ветке применяются извлеченные изменения.
Удаление отложенных изменений
Удалить определенный набор отложенных изменений можно с помощью команды git stash drop :
Следующая команда удаляет все наборы отложенных изменений:
Принцип работы команды git stash
В зависимости от отложенных элементов выполнение команды git stash создает два или три новых коммита. На приведенной выше схеме создаются следующие коммиты:
Ниже показано, как команда git stash шифрует рабочий каталог и раздел проиндексированных файлов в виде коммитов:
Перед откладыванием изменений в рабочем каталоге могут находиться изменения отслеживаемых, неотслеживаемых и игнорируемых файлов. Часть этих изменений также может быть проиндексирована в разделе проиндексированных файлов.
При выполнении команды git stash pop изменения из описанных выше коммитов применяются к рабочей копии и разделу проиндексированных файлов, извлеченный коммит удаляется из журнала ссылок на отложенные изменения, и ссылки в журнале сдвигаются. Извлеченные коммиты не удаляются сразу, но помечаются к удалению в будущем при сборе мусора.
Готовы изучить Git?
Ознакомьтесь с этим интерактивным обучающим руководством.
Быстрый совет: изучение возможностей Git Stash
Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)
Представьте, что вы работаете над новой возможностью в проекте, в котором используется система контроля версий Git. Вы как раз делаете основные изменения в коде, когда вас просят пофиксить критичный баг. Чтобы приступить к исправлениям, вам нужна новая ветка и чистая рабочая директория. На языке основных команд Git у вас есть два варианта:
Необходимые условия
В данной статье подразумевается, что у вас уже есть установленный Git и вы владеете его основами. Вы должны свободно фиксировать изменения, создавать коммиты и работать с ветками. Так же потребуется Git репозиторий для экспериментов.
1. Сохранения изменений
Чтобы сохранить эти изменения, достаточно выполнить команду git stash без каких-либо аргументов.
Так будут сохранены ваши зафиксированные и незафиксированные изменения и очищена рабочая директория. Что даст возможность переключаться между ветками, не беспокоясь о частичных коммитах.
2. Применение сохраненных изменений
Когда вы готовы вернуться назад к незаконченной работе, выполните следующую команду, чтобы применить назад ваши сохраненные изменения:
Самый последний набор сохраненных изменений будет применен в текущей рабочей директории и можно продолжить с того момента, на котором была остановлена работа. Все на своем месте и готово.
3. Разрешение конфликтов
Нужно вручную разрешить конфликт в файле, но обычно нет необходимости коммитить изменения сразу, как после git merge конфликтов. В большинстве случаев вы продолжаете работать над незаконченной задачей, пока не подготовите осмысленный коммит. Затем можно просто добавить его в индекс и сделать коммит как обычно. Другими словами можно рассматривать конфликты git stash pop как любые другие незафиксированные изменения.
4. Стек сохранений
В большинстве случаев вам хватит перечисленных выше команд для реализации «паузы» в вашей работе. Но понимание того, каким образом изменения сохраняются и представляются внутри, открывает дверь к более продвинутому использованию.
Если прежде вы выполнили git stash три раза, то будет выведено что-то похожее на это:
Заключение
Сохранение осмысленных коммитов лежит в основе разработки с использованием Git. Осмысленные и полноценные коммиты позволяют гораздо легче перемещаться по истории проекта, обнаруживать где были допущены баги, и отменять изменения.
Хотя git stash и не является повседневной командой, но можно ее рассматривать как очень удобный инструмент для создания осмысленных коммитов. Она позволяет вам сохранять незаконченную работу и избегать фиксирования частичных снимков кода в истории проекта. Имейте это в виду, когда в следующий раз захотите сделать паузу в текущей задаче и вернуться к ней позже.
Stash: знакомимся со «скрытым» функционалом Git
Перевод статьи «Learn the hidden feature in Git — Stash».
В этой статье мы разберем такую функцию Git, как stash. Начнем с разбора самого термина. Что такое stash? В переводе с английского это слово означает «припрятывать», «тайник», «запас». Применительно к Git смысл слова сохраняется. При помощи команды git stash мы убираем (временно) изменения из рабочей директории, «прячем» их.
Когда имеет смысл использовать git stash и как это делается?
Команда git stash пригодится вам в случаях, когда вы не хотите коммитить недоделанную работу и планируете вернуться к ней позже.
Предположим, у нас есть git-репозиторий, а в нем два файла: index.html и feature-1.js.
В той же ветке master в файле feature-2.js ведется работа над новой фичей. Фича еще не готова, вы как раз ею занимаетесь.
Внезапно вам звонит тимлид и сообщает, что в feature 1 есть проблема, блокирующая работу другого члена команды. Вы должны немедленно внести правку, чтобы разблокировать вашего коллегу.
Для этого вам нужно внести изменения в файл feature-1.js, но при этом не запушить feature-2.js (потому что вы еще не закончили работу над feature 2 ).
В описанной выше ситуации вам нужно проделать следующие шаги.
1. Добавьте файлы, работу над которыми вы еще не закончили, в стейджинг. Это делается при помощи команды git add :
2. При помощи следующей команды уберите эти файлы из рабочей директории в stash:
Вы успешно исправили проблему в файле feature-1.js.
Но как теперь вернуться к работе над feature-2.js?
Извлекаем файлы из stash
2. Идентификатор нашего «тайника» — stash@ <0>. Чтобы применить изменения из этого «тайника» (т. е. вернуть файлы в рабочую директорию), выполните следующую команду:
3. После выполнения этой команды вы увидите следующий вывод:
Вероятно, вы удивитесь, но «тайник» все еще на месте. Мы вернули файл feature-2.js в рабочую директорию, так почему же он все еще в stash? Дело в том, что «тайник» нужно очистить.
Как очистить stash?
Есть два способа очистить примененный stash.
Можно удалить «тайник» по id. Следующая команда позволит удалить из списка «тайников» (stash list) конкретный stash:
Или можно очистить вообще весь список. Внимание: следующая команда удалит все «тайники» из списка.
От редакции Techrocks. Под оригинальной статьей было несколько полезных комментариев. Мы решили перевести их тоже.
2. При помощи команды git stash pop можно возвращать из stash последний добавленный тайник и одновременно удалять его из стека stash.
А если добавить индекс, можно проделать то же самое для любого «тайника» по вашему выбору ( git stash pop stash@
Команда Git stash. Как прятать изменения в Git
Команда git stash предназначена для того, чтобы поместить текущие изменения, которые вы выполнили в файлах, в отдельное хранилище, и вернуть файлы к исходному состоянию. То есть git stash прячет изменения в файлах и сохраняет эти изменения отдельно, чтобы потом можно было их вернуть.
Для чего нужен git stash
Приведем пример. Например, вы выполнили какие-нибудь изменения в файлах и хотите переключиться на другую ветку, но чтобы там не было ваших текущих изменений. С помощью команды git stash можно спрятать эти изменения. Ваши изменения помещаются в отдельное хранилище — в стек, а вы можете спокойно переключиться на другую ветку.
Всё, что вы прячете с помощью git stash, попадает в отдельный список. Затем вы можете извлекать оттуда то, что вы туда спрятали — ваши «прятанья» (далее по тексту будет использоваться это слово).
Рассмотрим, как пользоваться командой git stash
Git stash
Чтобы спрятать изменения достаточно выполнить команду:
Git stash save
Например, можно сохранить изменения и добавить сообщение — подписать изменения, чтобы потом вспомнить, что именно было спрятано. В качестве сообщения, например, можно написать о том, какие именно изменения выполнены в файлах.
Git stash list
Каждое выполнение git stash или git stash save на самом деле создает отдельный коммит и сохраняет его отдельно (в стек).
Команда git stash list выводит список всех ваших прятаний:
Самые старые «прятанья» отображаются внизу списка, самые свежие сверху. Каждое прятанье имеет идентификатор с номером, например, stash@ <0>
Git stash apply
Команда git stash apply берет самое свежее прятанье ( stash@ <0>) и применяет его к репозиторию. То есть изменения, которые находятся в этом прятанье, применяются к текущему репозиторию. Это похоже на то, как вы применяете патч, только в качестве патча выступает ваше прятанье.
Если вы хотите применить какое-нибудь конкретное прятанье, можно указать его идентификатор:
Git stash pop
Было:
Стало после git stash pop:
Также можно указать идентификатор прятанья:
Git stash show
Команда git stash show показывает, какие изменения содержатся в прятанье.
Показываются изменения в файлах для самого последнего прятанья (для stash@ <0>):
Можно указать идентификатор прятанья, чтобы вывести изменения в нем:
Git stash branch
Команда git stash branch создает новую ветку с последним прятаньем, и затем удаляет последнее прятанье (как git stash pop).
Можно также указать идентификатор прятанья:
Git stash drop
Команда git stash drop удаляет самое последнее прятанье (stash@<0>).
Можно указать идентификатор прятанья, которое нужно удалить:
Git stash clear
Команда git stash clear удаляет все прятанья. Будьте внимательные перед тем, как ее выполнять, чтобы не удалить нужные данные.
Разница между git stash pop и git stash apply
я использую git stash pop в течение некоторого времени. Недавно я узнал о
4 ответов
git stash pop выбрасывает (самый верхний, по умолчанию) тайник после его применения, тогда как git stash apply оставляет его в списке заначку для возможного последующего использования (или вы можете тут git stash drop его).
У этой полезной ссылке, что государства разница, как Джон Zwinck заявил и недостаток в Git Сташ поп.
например, скажите, что ваши скрытые изменения конфликтуют с другими изменениями, которые вы сделали с момента первого создания тайника. И pop, и apply помогут запустить режим разрешения конфликтов слияния, позволяя вам красиво разрешать такие конфликты. и ни один не избавится от тайника, хотя, возможно, вы ожидаете, что pop. Так много людей ожидайте, что тайники будут просто простой стопкой, это часто приводит к тому, что они случайно открывают тот же тайник позже, потому что они думали, что он исчез.
git stash pop применяет верхний скрытый элемент и удаляет его из стека. git stash apply делает то же самое, но оставляет его в стеке тайника.
видя его в действии может помочь вам лучше понять разницу.
Давайте изменим файл и добавим к нему строку» world». Теперь вы хотите перейти в другую ветку, чтобы исправить незначительную ошибку, которую вы только что нашли, поэтому вам нужно stash изменения:
вы перешли в другую ветку, исправили ошибку, и теперь вы готовы продолжить работая на master филиал, так что вы pop изменения:
теперь, если вы попытаетесь просмотреть содержимое тайника, вы получите:
однако, если вы используете git stash apply вместо этого вы получите скрытый контент, но вы также сохраните его:
так pop так же, как pop стека-он фактически удаляет элемент, как только он выскочил, в то время как apply больше нравится ку.