Часто пока вы работаете над одной частью вашего проекта и все находится в беспорядке, у вас возникает желание сменить ветку и поработать над чем-то еще. Чтобы переключить ветку ваш рабочий каталог не должен содержать незафиксированные изменения. Сложность заключается в том, что вы не хотите фиксировать наполовину сделанную работу только для того, чтобы иметь возможность вернуться к ней позже. Справиться с этой проблемой помогает операция припрятывания изменений (stash).
Эта операция берет измененное состояние вашего рабочего каталога, то есть измененные отслеживаемые файлы и проиндексированные изменения, и сохраняет их в хранилище незавершенных изменений, которые вы можете в любое время применить обратно.
Например, вы перешли в свой проект, начали работать над задачей и, возможно, добавили в индекс какие-то изменения. Если вы откроете раздел Система управления версиями (Source Control), то увидите ваше измененное состояние:
Теперь вы хотите сменить ветку, чтобы исправить небольшую ошибку, но пока не хотите фиксировать ваши текущие наработки. Поэтому вы припрячете эти изменения.
Для того, чтобы припрятать изменение в выделенное для этого специальное хранилище, нажмите в контекстном меню репозитория. ( )
Припрятанных изменений может быть несколько. Чтобы у вас была возможность отличить одни свои изменения от других, задайте понятное вам название для этих изменений, например, «задача 31», и нажмите Ввод.
Раздел Система управления версиями (Source Control) очистится, а у вашей ветки исчезнет значок модифицированности.
Теперь вы можете спокойно создать ветку для исправления ошибки или, если ошибка небольшая, переключиться на main и исправить прямо в нем.
После фиксации изменений вы можете переключиться обратно на ветку issue-31 и вернуться к прерванной работе над проектом issue-31.
Для переключения вы можете использовать команду . Если у вас несколько спрятанных изменений, то тогда вы можете выбрать, какое из них извлечь, командой ( ). ( )
В палитре команд выберите изменения, которые вы хотите извлечь. В данном случае у вас единственное спрятанное изменение.
Перечисленные команды извлекают спрятанные вами изменения обратно в рабочий каталог, но не восстанавливают индекс. То есть, если один из файлов у вас уже был добавлен в индекс, а другой нет, то после извлечения этих спрятанных изменений оба файла будут находиться в рабочем каталоге.
Чтобы восстановить спрятанные изменения ровно в том виде, в котором они были, воспользуйтесь командной строкой и командой git stash c параметром --index. Именно этот параметр восстанавливает индекс.
> git stash pop --index
On branch issue-31
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: bitdepth.sbsl
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: coldev.sbsl
Dropped refs/stash@{0} (1ec324890d85cde973aec5807c07996fbc36ce52)
Команда помещает спрятанные изменения в рабочий каталог и удаляет их из хранилища. ( )
Если вы хотите извлечь спрятанное, но не удалять его из хранилища, используйте команду . ( )
Посмотреть все спрятанные изменения можно командой . ( )
Удалить спрятанные изменения из хранилища можно командой . ( )
У вас может возникнуть желание не прятать все или некоторые измененные файлы из вашего рабочего каталога, а просто избавиться от них. Это можно сделать, но нужно быть очень аккуратным с этими действиями, так как содержимое неотслеживаемых файлов, которые вы удалите, скорее всего восстановить будет нельзя.
Если есть вероятность, что изменения, которые вы хотите удалить, могут вам понадобиться, лучше их припрятать на какое-то время. Когда вы точно убедитесь, что они вам не нужны, вы сможете удалить их.
Если же вы точно уверены, что измененные файлы из рабочего каталога и из индекса вам не нужны, выполните следующие действия:
По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.