Припрятывание и очистка

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

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

Припрятать свои наработки

Например, вы перешли в свой проект, начали работать над задачей и, возможно, добавили в индекс какие-то изменения. Если вы откроете раздел Система управления версиями (Source Control), то увидите ваше измененное состояние:

Теперь вы хотите сменить ветку, чтобы исправить небольшую ошибку, но пока не хотите фиксировать ваши текущие наработки. Поэтому вы припрячете эти изменения.

Для того, чтобы припрятать изменение в выделенное для этого специальное хранилище, нажмите Спрятать > Спрятать (Stash > Stash) в контекстном меню репозитория.

Припрятанных изменений может быть несколько. Чтобы у вас была возможность отличить одни свои изменения от других, задайте понятное вам название для этих изменений, например, «задача 31», и нажмите Ввод.

Раздел Система управления версиями (Source Control) очистится, а у вашей ветки исчезнет значок модифицированности.

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

После фиксации изменений вы можете переключиться обратно на ветку issue-31 и вернуться к прерванной работе над проектом issue-31.

Для переключения вы можете использовать команду Спрятать > Извлечь последнее спрятанное (Stash > Pop Latest Stash). Если у вас несколько спрятанных изменений, то тогда вы можете выбрать, какое из них извлечь, командой Спрятать > Извлечь спрятанное (Stash > Pop Stash...).

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

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

Чтобы восстановить спрятанные изменения ровно в том виде, в котором они были, воспользуйтесь командной строкой и командой 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)    

Команда Спрятать > Извлечь спрятанное (Stash > Pop Stash...) помещает спрятанные изменения в рабочий каталог и удаляет их из хранилища.

Если вы хотите извлечь спрятанное, но не удалять его из хранилища, используйте команду Спрятать > Применить спрятанное (Stash > Apply Stash...).

Посмотреть все спрятанные изменения можно командой Спрятать > Просмотр спрятанных элементов (Stash > View Stash...).

Удалить спрятанные изменения из хранилища можно командой Спрятать > Удалить спрятанные данные... (Stash > Drop Stash...).

Очистить рабочий каталог

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

Если есть вероятность, что изменения, которые вы хотите удалить, могут вам понадобиться, лучше их припрятать на какое-то время. Когда вы точно убедитесь, что они вам не нужны, вы сможете удалить их.

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

  1. Избавьтесь от индексированных изменений. Для этого нажмите (Отменить все промежуточные изменения / Unstage All Changes) в заголовке раздела Промежуточные изменения (Staged Changes).
  2. Избавьтесь от неиндексированных изменений и от новых файлов, которые еще не добавлены под версионный контроль. Для этого нажмите (Отменить все изменения / Discard All Changes) в заголовке раздела Изменения (Changes).

    Visual Studio Code предупредит вас, что в рабочем каталоге есть неотслеживаемые файлы — нажмите Отменить изменения во всех файлах.

По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.