Прерывания — довольно частое явление при работе над большим проектом. Для меня они даже обычны, когда я работаю в одиночку. Для меня эти прерывания часто имеют форму: Пожалуйста, переключись на работу над другой вещью. Что происходит, когда это происходит в тот момент, когда я еще не готов к фиксации? Git stash на помощь! Как видно из названия, git stash позволяет хранить изменения для последующего использования. После сохранения изменений дерево исходников возвращается в состояние последней фиксации. В этот момент я могу работать над другим набором необходимых изменений. Когда я буду готов вернуться к изменениям, которые я припрятал, я могу просто вытащить их из тайника с помощью git stash pop и продолжить работу.
Оглавление
TL;DR - Какие команды мне нужно знать для git stash?
- git stash - Это сохранит ваши текущие изменения и очистит ваш рабочий каталог. Это то же самое, что и git stash push
- git stash -m - То же самое, что и выше, но вместо ID коммита к тайнику прикрепляется сообщение.
- git stash list - Показать список тайников для данного хранилища.
- git stash apply - Применить изменения из тайника и оставить тайник в списке тайников.
- git stash pop - То же, что и apply, но удалить тайник из списка.
- git stash drop - Удалить тайник из списка.
Хотя для git stash доступно больше опций, этот список содержит большинство из того, что необходимо для нормального использования. В документации приведен полный список опций для git stash.
Давайте посмотрим несколько примеров
Я создал простой репозиторий с одним файлом, чтобы показать несколько примеров использования git stash. Здесь у меня есть изменения в файле, готовые к постановке или сохранению.

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

Это результат git stash list, показывающий один тайник с его идентификатором тайника и комментарием по умолчанию.

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

Теперь мы видим, что есть второй коммит и что он был перемещён в начало списка. Обратите внимание, что наш первоначальный коммит, который изначально был stash@{0}, теперь стал stash@{1}. Изменение, которое мы только что спрятали, заняло место в позиции 0.

Если бы вы запустили git stash pop, то получили бы изменения, которые мы только что зафиксировали. А что, если вы захотите начать работу над набором изменений, которые не находятся в начале списка? Это так же просто, как вызвать git stash pop . В данном случае я указал 1 в качестве идентификатора. Вы можете увидеть внизу вывода git, что он говорит, что сбросил ссылку на stash@{1}.

Выполнив git stash list, мы видим, что в списке осталось только одно изменение. Первоначальное изменение, которое мы спрятали, было удалено из списка с момента появления первого изменения.

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


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


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


Заключение
Git stash - это удобный способ сохранить набор изменений, над которыми вы работаете. Конечно, существуют и другие способы сохранения изменений (например, ветвление). Я обычно использую git stash, когда мне нужно объединить набор изменений из другой ветки и я не готов зафиксировать то, над чем работаю в данный момент.