Программирование и IT
git stash
Заначка — временная полка для незаконченных правок. Ты кладёшь туда всё, что наработал, получаешь чистую рабочую копию, делаешь срочное дело и возвращаешь отложенное обратно. Полка общая на весь репозиторий и устроена как стопка: последнее положенное лежит сверху.
В этой статье
Когда это нужно#
Типичная ситуация: ты на середине правки, и тут приходит срочная задача в
другой ветке. Коммитить полуфабрикат не хочется, терять — тем более.
Заначка снимает изменения с рабочей копии и сохраняет их в репозитории как
обычные объекты git, то есть надёжно.
Второй повод — переключение ветки, которое git не пропускает из-за
конфликтующих правок. Третий — необходимость посмотреть, как программа ведёт
себя без твоих изменений: спрятал, проверил, вернул.
Важная оговорка: по умолчанию прячутся только изменения в отслеживаемых
файлах. Новый файл, который git ещё не видел, останется лежать в папке, и это
регулярно удивляет.
Синтаксис#
Короткое git stash без слов — то же, что git stash push. Подпись через
-m стоит писать всегда: через два дня записи без подписи различаются только
номерами и хешами.
Пример: отложить и вернуть#
Рабочая копия чистая, можно спокойно переключаться и чинить срочное. Когда
вернулись:
Правки на месте, запись с полки снята. Хеш в последней строке — не украшение:
по нему запись можно вернуть, даже если её сняли по ошибке.
Пример: заначка с новыми файлами#
Без -u файл templates/pdf.html остался бы в папке. С флагом — уехал на
полку вместе с остальным. Если нужны и игнорируемые файлы, есть более широкий
-a, но с ним легко утащить на полку папку сборки на сотни мегабайт.
Pop или apply#
Обе команды достают содержимое записи. Разница в том, что происходит с самой
записью: pop её удаляет, apply оставляет.
Аккуратнее работать через apply, а drop делать после того, как убедились:
правки встали куда надо и проект собирается. Тогда любая неожиданность —
применили не на той ветке, разрешили конфликт неудачно — стоит одной команды
git checkout ., потому что копия по-прежнему на полке.
При конфликте pop ведёт себя осторожно: конфликтные метки появляются в
файлах, но запись с полки не снимается. Разрешается такой конфликт ровно
так же, как любой другой, — порядок описан в статье о
конфликте слияния.
Ещё один аккуратный вариант — сразу завести ветку:
Git создаст ветку от того коммита, на котором делалась заначка, применит
правки и снимет запись. Это лучший выход, когда отложенное пролежало долго и
на текущую вершину уже не ложится.
Частые ошибки#
Забыли, что полка общая. Заначки не привязаны к ветке: положили на одной,
достали на другой — git не возразит. Подпись с именем ветки в тексте спасает
от путаницы.
git stash pop после переключения на другую ветку. Правки применятся
туда, где ты стоишь сейчас. Если это не то, что нужно, верни как было:
git stash push -m "не туда" и доставай уже на правильной ветке.
Запись удалена по ошибке. git stash drop и git stash clear выводят
хеш удалённого объекта, и объект живёт в базе до сборки мусора. Восстановить
можно так:
Хеш потерялся вместе с окном терминала — остаётся поиск среди недостижимых
объектов: git fsck --unreachable | grep commit. Работает не всегда, поэтому
лучше не полагаться на этот путь.
Заначка вместо ветки. Полка хороша для часов, а не для недель: содержимое
не видно в истории, не отправляется на сервер и теряется вместе с диском.
Работа, которая переживает день, заслуживает коммита в отдельной ветке —
создать её можно за секунду, см. git checkout.
План по этапам
- Посмотреть, что прячешьgit status -s: есть ли среди правок новые файлы — от этого зависит флаг -u.
- Спрятать с подписьюgit stash push -m "понятный текст", при необходимости с -u.
- Сделать срочное делоРабочая копия чистая: переключение веток и сборка проходят без помех.
- Вернуть отложенноеgit stash list, затем git stash apply stash@{N} на нужной ветке.
- Прибрать полкуУбедиться, что всё встало верно, и git stash drop; длинную работу перевести в ветку.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Чем git stash pop отличается от git stash apply?
2.Какой флаг нужен, чтобы спрятать вместе с правками новый, ещё не отслеживаемый файл?
3.Отложенная работа лежит неделю и уже не ложится на текущую вершину. Что удобнее всего сделать?
Источники
-
Справка git stashВсе подкоманды и флаги, включая -u и -aбесплатно
-
Pro Git, русское изданиеГлава «Инструменты Git» — раздел про прятанье и очисткубесплатно
-
Справка git fsckПоиск недостижимых объектов, если запись потерянабесплатно
Было полезно?