Простое пошаговое руководство, предназначенное для того, чтобы вы поняли, что такое git stash.
Git – это один из обязательных навыков, который нужно иметь на своем счету. Если вы будете хорошо понимать концепции Git, это не только поможет вам эффективно управлять своими изменениями, но и повысит общую продуктивность и облегчит рабочий процесс. Цель этой статьи – рассмотреть одну из немалого числа полезных команд git, а именно git stash.
Я лично нашел для себя эту команду очень полезной.
Вслед за тем, что уже было сказано, давайте расколем этот git!
Возможное развитие событий
Вы когда-нибудь были в ситуации, когда
- вы внесли изменения не в ту ветку, но еще не успели их зафиксировать, а теперь хотите как-то перенести эти изменения на нужную ветку?
- вы находитесь в процессе добавления нового еще незавершенного изменения, но вам срочно нужно перейти к новой задаче, поскольку у нее более высокий приоритет?
- вы хотите получить чистое рабочее дерево по той или иной причине, но не хотите сбрасывать свои изменения?
- вы просто хотите сохранить незафиксированные изменения, чтобы иметь возможность потом их просматривать?
В таком случае, вы можете не беспокоиться, потому что git stash поможет вам в этом!
Что такое git stash?
Это команда, с помощью который вы можете сохранять незафиксированные изменения в стеке как в структуре данных. А затем, когда это будет необходимо, вы можете применить эти изменения к вашему рабочему дереву.
Такой подход обеспечивает гибкий рабочий процесс, когда вы работаете над несколькими задачами одновременно.
Команды, которые нужно запомнить
В следующем разделе содержатся различные команды для записи отложенных изменений и мельчайшие подробности, связанные с ними.
- Список хранилищ
git stash list
В зависимости от того, есть у вас что-то в хранилище или нет, команда выдаст один из следующих ответов:
- пустая строка: нет хранилищ;
- проиндексированный список хранилищ: одно или несколько хранилищ.
Более подробная информация о том, как читать этот список, находится в следующем разделе.
- Сохранение изменений в хранилище
Рассмотрим следующий вариант развития событий, в котором у нас могут быть два вида изменений, а именно:
- изменения в отслеживаемых файлах;
- изменения в неотслеживаемых файлах.
Для того, чтобы сохранить изменения в хранилище, нужно просто набрать
git stash
Это создаст следующее хранилище и вернет рабочее дерево к HEAD (заголовку).
Число в фигурных скобках – это индекс конкретного хранилища. В данном случае, так как стек хранилищ был пуст, то это хранилище находится в верхней части стека, то есть имеет индекс 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
Предположим, что мы вносим еще одно изменение в рабочее дерево и сохраняем его в то же хранилище. В результате мы получим хранилище, которое выглядит следующим образом:
На первый взгляд они одинаковы. Это усложняет понимание того, какие изменения с каким отложенным элементом связаны. Появляется необходимость изучить фактические изменения для того, чтобы определить, какое хранилище было использовано.
Полезным будет добавить информативности сообщению. Для того, чтобы это сделать, можно создать свое собственное сообщение, и не использовать сообщение по умолчанию. Чтобы добавить свое собственное сообщение, воспользуйтесь следующей командой
git stash push -m "test message" --include-untracked
Наше хранилище теперь будет выглядеть вот так:
Важно упомянуть
- Команда git stash save официально считается устаревшей с момента выпуска Git 2.16.0. По этой причине я не буду рассматривать ее в этой статье.
Команды git stash create и git stash store тоже.
- Применение изменений к рабочему дереву
Теперь, когда у нас есть изменения в нашем хранилище, мы можем захотеть применить их где-то. Для этого просто нужно ввести следующую команду:
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> удаляется.
- Удаление сохраненных изменений из хранилища
Если вы считаете, что какое-то изменение, которое вы сохранили до этого в хранилище, стало бесполезным, и вы хотите его удалить, что вы можете воспользоваться следующей командой:
git stash drop stash@{N}
где N – это индекс сохраненного изменения, которое вы хотите удалить из хранилища.
Если вы хотите удалить все сохраненные изменения и полностью освободить хранилище, то воспользуйтесь следующей командой:
git stash clear