img

Все о git stash

 

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

https://miro.medium.com/max/1050/0*LOzYDcYiqSI4zG13

Git – это один из обязательных навыков, который нужно иметь на своем счету. Если вы будете хорошо понимать концепции Git, это не только поможет вам эффективно управлять своими изменениями, но и повысит общую продуктивность и облегчит рабочий процесс. Цель этой статьи – рассмотреть одну из немалого числа полезных команд git, а именно git stash. 

Я лично нашел для себя эту команду очень полезной.

Вслед за тем, что уже было сказано, давайте расколем этот git!

Возможное развитие событий

Вы когда-нибудь были в ситуации, когда

  • вы внесли изменения не в ту ветку, но еще не успели их зафиксировать, а теперь хотите как-то перенести эти изменения на нужную ветку?
  • вы находитесь в процессе добавления нового еще незавершенного изменения, но вам срочно нужно перейти к новой задаче, поскольку у нее более высокий приоритет?
  • вы хотите получить чистое рабочее дерево по той или иной причине, но не хотите сбрасывать свои изменения?
  • вы просто хотите сохранить незафиксированные изменения, чтобы иметь возможность потом их просматривать?

В таком случае, вы можете не беспокоиться, потому что git stash поможет вам в этом!

Что такое git stash?

Это команда, с помощью который вы можете сохранять незафиксированные изменения в стеке как в структуре данных. А затем, когда это будет необходимо, вы можете применить эти изменения к вашему рабочему дереву.

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

Команды, которые нужно запомнить

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

  1. Список хранилищ

git stash list

В зависимости от того, есть у вас что-то в хранилище или нет, команда выдаст один из следующих ответов:

  • пустая строка: нет хранилищ;
  • проиндексированный список хранилищ: одно или несколько хранилищ.

Более подробная информация о том, как читать этот список, находится в следующем разделе. 

  1. Сохранение изменений в хранилище

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

  • изменения в отслеживаемых файлах;
  • изменения в неотслеживаемых файлах.

https://miro.medium.com/max/1050/1*h75O89cQe7VvKvxzVISwvQ.png

Для того, чтобы сохранить изменения в хранилище, нужно просто набрать

git stash

Это создаст следующее хранилище и вернет рабочее дерево к HEAD (заголовку).

https://miro.medium.com/max/1041/1*plhivrUx08OT_4vPSO1W6Q.png

Число в фигурных скобках – это индекс конкретного хранилища. В данном случае, так как стек хранилищ был пуст, то это хранилище находится в верхней части стека, то есть имеет индекс 0. По мере того, как будут сохраняться новые изменения, индекс предыдущих изменений будет увеличиваться. Все аналогично стеку (FIFO), где вершина стека всегда имеет индекс 0.

«WIP om main» означает, что работа проводится на ветке main.

А eeefba5 и commit 2 – это идентификатор и сообщение предыдущего коммита соответственно. 

Следовательно, резюмируя, общий формат будет выглядеть примерно следующим образом:

stash@{<index of stash>}: WIP on <branch name>: <SHA-1 hash of the commit> <commit message of the last commit>

Проблема 1

По умолчанию изменения, которые были внесены в неотслеживаемые файлы, не сохраняются. А значит, для того, чтобы добавить их в хранилище, нужно воспользоваться флагом --include-untracked. Таким образом вы сможете сохранить в хранилище как неотслеживаемые, так и отслеживаемыми изменениями. 

git stash --include-untracked

Проблема 2

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

https://miro.medium.com/max/1050/1*DtFGjDYgrWBD1xEHIA2Xdw.png

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

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

git stash push -m "test message" --include-untracked

Наше хранилище теперь будет выглядеть вот так:

https://miro.medium.com/max/1050/1*FUcHLUQILT0VI2jctsCYwA.png

Важно упомянуть

  • Команда git stash save официально считается устаревшей с момента выпуска Git 2.16.0. По этой причине я не буду рассматривать ее в этой статье. 

Команды git stash create и git stash store тоже. 

  1. Применение изменений к рабочему дереву

Теперь, когда у нас есть изменения в нашем хранилище, мы можем захотеть применить их где-то. Для этого просто нужно ввести следующую команду:

git stash pop

Есть несколько замечаний касательно поведения этой команды:

  • она применяет сохраненные изменения из верхней части стека, то есть с индексом хранилища 0;
  • она удаляет это изменение их хранилища. Следовательно, индексы всех остальных изменений уменьшаются на 1.

Если вы хотите применить изменение под индексом n, то воспользуйтесь следующей командой:

git stash apply stash@{N}

где N – это индекс сохраненного изменения, которое вы хотите применить. Один нюанс: эта команда не удаляет примененное изменение из хранилища. 

Дополнительное примечание

git stash branch <branchname> stash@{N}

создает и проверяет новую ветку с именем <branchname>, начиная с коммита, в котором изначально был создан <stash>, и применяет изменения, который записаны в <stash>, к новому рабочему дереву и индексу. Если все проходит успешно, и <stash> является ссылкой формы stash@{<revision>}, то <stash> удаляется. 

  1. Удаление сохраненных изменений из хранилища

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

git stash drop stash@{N}

где N – это индекс сохраненного изменения, которое вы хотите удалить из хранилища. 

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

git stash clear
Ссылка
скопирована
Программирование
Скидка 25%
Python Advanced. Продвинутый курс
Освойте асинхронное и метапрограммирование, изучите аннотацию типов и напишите собственное приложение на FastAPI. Улучшите свои навыки Python, чтобы совершить быстрый рост вашего грейда до уровня middle.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
За последние годы микрослужбы прошли путь от обычного переоцененного модного словечка до вещи, которую вы, как специалист по про
img
Введение Резидентные базы данных (или хранилища в памяти) по большей части делают упор на хранилище данных в памяти, а не на жес
img
  Многие люди рассуждают так: «зачем, ну зачем мне изучать еще один язык программирования?» Для них это лишнее, и они стараютс
img
Введение Объекты в Kubernetes – это базовые постоянные сущности, которые описывают состояние кластера Kubernetes. Модули – это э
img
  Ключевые отличия между JDK, JRE и JVM: JDK – это набор средств для разработки программного обеспечения, JRE – это програ
img
  Довольно часто мы встречаемся с компонентами архитектуры программного обеспечения, которые являются частью любой системы, но п
Комментарии
ЛЕТНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59