Git stash android studio

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 ).

Вот здесь вам и пригодится git stash .

В описанной выше ситуации вам нужно проделать следующие шаги.

1. Добавьте файлы, работу над которыми вы еще не закончили, в стейджинг. Это делается при помощи команды git add :

2. При помощи следующей команды уберите эти файлы из рабочей директории в stash:

3. После этого запустите команду git stash list , чтобы вывести список содержимого stash. Вы увидите идентификатор вашего «тайника», а также оставленное сообщение. В нашем случае идентификатор — stash@ <0>.

4. Файл feature-2.js станет недоступен в вашем git status , а также в рабочей директории. Теперь вы можете заняться feature-1.js и запушить ваше изменение в удаленный репозиторий.

Вы успешно исправили проблему в файле feature-1.js.

Но как теперь вернуться к работе над feature-2.js?

Извлекаем файлы из stash

Для того, чтобы убрать файлы из рабочей директории в stash, мы использовали команду git stash push . А чтобы вернуть их обратно, используется команда git stash apply . Разберем весь процесс подробно.

1. Запустите команду git stash list , чтобы просмотреть список «тайников» с их идентификаторами. Вы увидите наш тайник с его сообщением.

2. Идентификатор нашего «тайника» — stash@ <0>. Чтобы применить изменения из этого «тайника» (т. е. вернуть файлы в рабочую директорию), выполните следующую команду:

3. После выполнения этой команды вы увидите следующий вывод:

4. В последней строке приведенного лога вы видите, что feature-2.js возвращен из «тайника». Теперь вы можете продолжить работу над feature 2 .

Давайте еще раз запустим git stash list .

Вероятно, вы удивитесь, но «тайник» все еще на месте. Мы вернули файл feature-2.js в рабочую директорию, так почему же он все еще в stash? Дело в том, что «тайник» нужно очистить.

Как очистить stash?

Есть два способа очистить примененный stash.

Читайте также:  Linux с поддержкой android

Можно удалить «тайник» по id. Следующая команда позволит удалить из списка «тайников» (stash list) конкретный stash:

Или можно очистить вообще весь список. Внимание: следующая команда удалит все «тайники» из списка.

От редакции Techrocks. Под оригинальной статьей было несколько полезных комментариев. Мы решили перевести их тоже.

1. При помощи флага -u (команда git stash -u ) можно добавлять в stash неотслеживаемые файлы (т. е. файлы не в стейджинге).

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 save выполняет то же самое, что и git stash , но имеет несколько полезных опций.

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

Git stash не прячет файлы, которые не добавлены в репозиторий. Чтобы их спрятать с остальными изменениями используется опция —include-untracked (или -u ):

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 apply , но удаляет прятанье, которое она применяет к репозиторию.

Было:

Стало после git stash pop:

Также можно указать идентификатор прятанья:

Git stash show

Команда git stash show показывает, какие изменения содержатся в прятанье.

Показываются изменения в файлах для самого последнего прятанья (для stash@ <0>):

Чтобы показать полный diff, то есть увидеть сами изменения, используется ключ -p :

Можно указать идентификатор прятанья, чтобы вывести изменения в нем:

Git stash branch

Команда git stash branch создает новую ветку с последним прятаньем, и затем удаляет последнее прятанье (как git stash pop).

Можно также указать идентификатор прятанья:

Читайте также:  Android studio listview add items

Git stash drop

Команда git stash drop удаляет самое последнее прятанье (stash@<0>).

Можно указать идентификатор прятанья, которое нужно удалить:

Git stash clear

Команда git stash clear удаляет все прятанья. Будьте внимательные перед тем, как ее выполнять, чтобы не удалить нужные данные.

Мы рассмотрели возможные варианты использования команды git stash . Это очень полезный инструмент при работе с Git.

Источник

git stash

Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.

Откладывание кода

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

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

Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.

Применение отложенных изменений

Чтобы применить ранее отложенные изменения, воспользуйтесь командой git stash pop :

При извлечении отложенных изменений они удаляются из набора и применяются к рабочей копии.

Вы также можете применить изменения к рабочей копии, не удаляя их из набора отложенных изменений. Для этого воспользуйтесь командой git stash apply :

Это полезно, если вам нужно применить одни и те же отложенные изменения к нескольким веткам.

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

Откладывание неотслеживаемых или игнорируемых файлов

По умолчанию команда git stash создает следующие отложенные изменения:

  • изменения, добавленные в раздел проиндексированных файлов (индексированные изменения);
  • изменения в файлах, отслеживаемых Git в настоящее время (неиндексированные изменения).

При этом следующие файлы отложены не будут:

  • новые файлы в рабочей копии, которые еще не были проиндексированы;
  • игнорируемые файлы.

Поэтому если в приведенный выше пример добавить третий файл — неиндексированный (т. е. без выполнения команды git add ), при выполнении команды git stash этот файл не будет отложен.

Запуск git stash с параметром -u (или —include-untracked ) позволяет отложить неотслеживаемые файлы:

Можно также отложить изменения, внесенные в игнорируемые файлы. Для этого используйте параметр -a (или —all ) при запуске команды git stash .

Управление несколькими наборами отложенных изменений

Вы можете создать несколько наборов отложенных изменений. Команду git stash можно выполнить несколько раз, после чего можно будет просмотреть список созданных наборов с помощью команды git stash list . По умолчанию отложенные изменения имеют пометку WIP (незавершенная работа) наверху ветки или коммита, в которых они были отложены. Возможно, со временем вам будет трудно вспомнить содержимое каждого набора:

Рекомендуем добавлять к отложенным изменениям описание в качестве подсказки. Для этого используется команда git stash save «сообщение» :

По умолчанию команда git stash pop применяет последний набор отложенных изменений: stash@

Если вам нужно применить определенный набор ранее отложенных изменений, укажите его идентификатор в качестве последнего аргумента. Это можно сделать так:

Просмотр различий между наборами отложенных изменений

Выполните команду git stash show , чтобы просмотреть сводные данные по набору отложенных изменений:

Или укажите параметр -p (или —patch ), чтобы просмотреть разницу между наборами изменений:

Частичное откладывание изменений

При желании можно отложить один файл, несколько файлов или отдельные изменения в файлах. Если передать команде git stash параметр -p (или —patch ), она будет выполняться для каждого измененного участка кода в рабочей копии, запрашивая подтверждение на откладывание:

Читайте также:  Обновление для android phone

Нажмите ?, чтобы увидеть полный список команд для работы с участками кода. Часто используются следующие команды:

Команда Описание
/ искать участок кода по регулярному выражению
? Справка
n не откладывать участок кода
q выйти (все выбранные участки будут отложены)
s разделить участок кода на меньшие части
y отложить участок кода

Специальной команды для прерывания не предусмотрено, но прекратить процесс откладывания можно, нажав CTRL-C (сигнал SIGINT).

Создание ветки из отложенных изменений

Если изменения в ветке отличаются от отложенных изменений, операции извлечения или применения последних могут привести к конфликтам. Вместо этого вы можете создать новую ветку с помощью команды git stash branch и применить отложенные изменения к ней. Это можно сделать так:

Новая ветка создается на основе коммита, изменения в котором использовались при создании набора. Затем к этой ветке применяются извлеченные изменения.

Удаление отложенных изменений

Удалить определенный набор отложенных изменений можно с помощью команды git stash drop :

Следующая команда удаляет все наборы отложенных изменений:

Принцип работы команды git stash

Если вы просто хотели получить информацию о том, как использовать команду git stash , то дальше читать необязательно. Однако если вам необходимо узнать о принципах работы Git (и git stash ) — продолжайте чтение!

Наборы отложенных изменений шифруются в репозитории в виде коммитов. Специальная ссылка в .git/refs/stash указывает на последний созданный набор отложенных изменений, а для ранее созданных наборов изменений используются ссылки из журнала ссылок stash . Именно поэтому для просмотра наборов отложенных изменений используется ссылка stash@ : при этом вы ссылаетесь на n-ю запись в журнале ссылок stash . Поскольку набор отложенных изменений представляет собой обычный коммит, его можно просмотреть с помощью команды git log :

В зависимости от отложенных элементов выполнение команды git stash создает два или три новых коммита. На приведенной выше схеме создаются следующие коммиты:

  • stash@ <0>— новый коммит для хранения отслеживаемых файлов, которые находились в рабочей копии при запуске команды git stash ;
  • первый родитель stash@ <0>— существующий коммит, который при запуске команды git stash находился в ветке, на которую указывал HEAD;
  • второй родитель stash@ <0>— новый коммит, выступавший в роли индекса при запуске команды git stash ;
  • третий родитель stash@ <0>— новый коммит, представляющий неотслеживаемые файлы, которые находились в рабочей копии при запуске команды git stash . Третий родитель создается, только если:
    • рабочая копия действительно содержит неотслеживаемые файлы, и
    • вы указали параметр —include-untracked или —all при вызове команды git stash .

Ниже показано, как команда git stash шифрует рабочий каталог и раздел проиндексированных файлов в виде коммитов:

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

При выполнении команды git stash все изменения отслеживаемых файлов шифруются в виде двух новых коммитов в ориентированном ациклическом графе. При этом один коммит используется для неиндексированных изменений, а другой — для индексированных изменений, добавленных в раздел проиндексированных файлов. Для указания на них используется специальная ссылка refs/stash .

Параметр —include-untracked позволяет также зашифровать все изменения неотслеживаемых файлов в виде дополнительного коммита.

Параметр —all позволяет включить изменения игнорируемых файлов в один коммит с изменениями неотслеживаемых файлов.

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

Готовы изучить Git?

Ознакомьтесь с этим интерактивным обучающим руководством.

Источник

Оцените статью