img

Все о git stash

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

 

Простое пошаговое руководство, предназначенное для того, чтобы вы поняли, что такое 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-программист с нуля
Стань разработчиком на одном из самых популярных языков программирования.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Гипервизор - это программное обеспечение для виртуализации, используемое для создания и запуска виртуальных машин (ВМ). Гипервиз
img
Виртуализация серверов позволяет запускать несколько виртуальных машин на одном физическом сервере. Запуск виртуальных машин (ВМ
img
Сегодня мы рассмотрим, как настроить и использовать PHP в проекте. Но прежде чем начать, нужно понять, что такое PHP. Что такое
img
Как разработчик, вы знаете, что HTML расшифровывается как HyperText Markup Language (язык разметки гипертекста). HTML — это язык
img
Бесконечные споры вокруг искусственного интеллекта приводят к путанице. Существует много терминов, которые кажутся похожими, но
img
SVG расшифровывается как масштабируемая векторная графика. Это веб-дружелюбный векторный формат файлов, используемый для отображ
21 ноября
20:00
Бесплатный вебинар
Введение в Docker