Команда git stash временно "припрятывает" ваши текущие наработки в проекте, чтобы можно было перейти на другую ветку репозитория, и впоследствии ввернуться к незаконченным наработкам.
SYNOPSIS
git stash list [< log-options>] git stash show [-u|--include-untracked|--only-untracked] [< diff-options>] [< stash>] git stash drop [-q|--quiet] [< stash>] git stash ( pop | apply ) [--index] [-q|--quiet] [< stash>] git stash branch < branchname> [< stash>] git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message < message>] [--pathspec-from-file=< file> [--pathspec-file-nul]] [--] [< pathspec>...]] git stash clear git stash create [< message>] git stash store [-m|--message < message>] [-q|--quiet] < commit>
ОПИСАНИЕ
Используйте git stash, когда хотите записать текущее состояние рабочей директории и индекс, но хотите сделать откат в чистое состояние рабочей директории проекта. Эта команда сохранит ваши локальные изменения, и вернет состояние рабочей директории, соответствующее головной фиксации (HEAD commit).
Изменения, сохраненные этой командой, можно посмотреть в списке git stash list, также они могут быть проинспектированы командой git stash show, и восстановлены (потенциально на вершину другой фиксации) командой git stash apply. Вызов git stash без каких-либо аргументов эквивалентен команде git stash push. Сохранение stash по умолчанию перечисляется как "WIP on branchname ...", но вы можете дать ему более подходящее описательное сообщение в командной строке, когда создаете stash.
Последний созданный вами stash сохраняется в refs/stash; более старые stash находятся в reflog этой ссылки, и могут именоваться обычным синтаксисом reflog (т. е. stash@{0} это самый свежий созданный stash, stash@{1} это созданный перед ним, также возможен stash@{2.hours.ago}). К сохранениям stash можно также обращаться просто по stash-индексу (т. е. целое число n эквивалентно stash@{n}).
КОМАНДЫ
push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message < message>] [--pathspec-from-file=< file> [--pathspec-file-nul]] [--] [< pathspec>...]
Сохранит ваши локальные изменения в новое сохранение stash и выполнит откат к HEAD (с рабочее дерево и индекс). Здесь часть команды < message> опциональна, и дает описание вместе с сохраненным состоянием.
Чтобы быстро создать snapshot, можно просто опустить "push". В этом режиме не допускаются аргументы без опций, чтобы не позволить ввести неправильную команду и создать нежелательный stash. Для этого существуют два исключения: stash -p, который действует как псевдоним stash push -p, и элементы pathspec, которые дозволяется указывать после двойной черты -- для разрешения неоднозначности.
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [< message>]
Эта опция устарела, её заменила git stash push. Она отличается от "stash push" в том, что не может принимать pathspec. Вместо этого все аргументы, не относящиеся к опциям, соединяются друг с другом, формируя stash-сообщение.
list [< log-options>]
Выведет список сохранений stash, которые сейчас имеются. Каждое сохранение stash в списке выводится с его именем (например stash@{0} для последнего сохранения, stash@{1} для предыдущего сохранения, и т. д.), именем ветви, которая была текущей в момент создания stash, и коротким описанием фиксации, на котором было создано сохранение stash.
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation stash@{1}: On master: 9cc0589... Add git-stash
Эта команда принимает опции, применимые к команде git log, чтобы управлять тем, что показывать и как. См. git-log(1) [3].
show [-u|--include-untracked|--only-untracked] [< diff-options>] [< stash>]
Покажет изменения, записанные в stash-сохранении как diff между содержимым stash и фиксацией, поверх которой stash был создан первый раз. По умолчанию команда покажет diffstat, но она примет любой формат, известный для git diff (т. е. git stash show -p stash@{1} покажет второе по свежести сохранение в форме patch). Если не предоставлено < diff-option>, то поведение по умолчанию будет задаваться переменными конфигурации stash.showStat и stash.showPatch. Также вы можете использовать stash.showIncludeUntracked для установки, разрешено ли по умолчанию --include-untracked.
pop [--index] [-q|--quiet] [< stash>]
Удаляет одно stash-сохранения из stash-списка и применяет его на текущее состояние рабочего дерева, т. е. эта команда дает инверсию операции git stash push. Рабочая директория должна соответствовать индексу.
Применение состояния может завершиться неудачей из-за конфликтов; в этом случае stash-сохранение не будет удалено из stash-списка. Вам нужно будет разрешить конфликты вручную, и затем вызвать git stash drop.
apply [--index] [-q|--quiet] [< stash>]
Работает наподобие но не удалит состояние из stash-списка. В отличие от pop, < stash> может быть любой фиксацией, которая выглядит как фиксация, созданная через stash push или stash create.
branch < branchname> [< stash>]
Создает и делает checkout новой ветки с именем < branchname>, начинающейся с фиксации, на которой изначально был создан < stash>, и применяет изменения, записанные < stash>, к новому рабочему дереву и индексу. Если команда завершилась успешно, и < stash> это ссылка в форме stash@{< revision>}, то < stash> выбрасывается.
Это полезно, если ветка, на которой вы запустили git stash push, изменена настолько, что команда git stash apply завершается неудачей из-за конфликтов. Поскольку stash-сохранение применено поверх фиксации, которая была HEAD в момент, когда была запущена команда git stash, это действие восстановит оригинальное stash-состояние без конфликтов.
clear
Удалит все stash-сохранения. Имейте в виду, что эти сохранения будут затем объектом очистки репозитория (pruning), в возможно их нельзя будет восстановить (см. далее ПРИМЕРЫ для возможной стратегии).
drop [-q|--quiet] [< stash>]
Удалит одно stash-сохранение из списка stash.
create
Создаст элемент stash (который представляет собой обычный объект фиксации), и возвратит его имя объекта, без сохранения его где-либо в ref namespace. Это сделано для использования в скриптах. Вероятно это не та команда, которую бы вы хотели использовать; см. выше "push".
store
Сохранит указанный stash, созданный командой git stash create (который является подвешенным merge commit) в stash ref, с обновлением stash reflog. Это сделано для использования в скриптах. Вероятно это не та команда, которую бы вы хотели использовать; см. выше "push".
ОПЦИИ
-a, --all
Эта опция допустима только для команд push и save. Все проигнорированные и не отслеживаемые файлы также попадут в stash и затем очистятся командой git clean [5].
-u, --include-untracked, --no-include-untracked
При использовании с командами push и save все не отслеживаемые файлы также попадут в stash и затем очистятся командой git clean [5].
При использовании с командой show покажет не отслеживаемые файлы в stash-сохранении как часть diff.
--only-untracked
Эта опция допустима только для команды show.
Покажет только не отслеживаемые файлы в stash-сохранении как часть diff.
--index
Эта опция допустима только для команд pop и apply.
Пытается восстановить не только изменения рабочего дерева, но и изменения индекса. Однако это может завершиться неудачей, когда у вас есть конфликты (которые хранятся в индексе, где вы больше не можете применять изменения, как они были изначально).
-k, --keep-index, --no-keep-index
Эта опция допустима только для команд push и save. Все изменения, уже добавленные в индекс, остаются нетронутыми.
-p, --patch
Эта опция допустима только для команд push и save.
Интерактивно выберите звенья из различий между HEAD и рабочим деревом, которое будет сохранено stash. Элемент stash построен таким образом, что его состояние индекса совпадает с состоянием индекса вашего репозитория, а его рабочее дерево содержит только изменения, выбранные вами в интерактивном режиме. Затем выполняется откат выбранных изменений из рабочей области. См. раздел "Interactive Mode" в git-add (1), чтобы узнать, как работать в режиме --patch.
Опция --patch подразумевает --keep-index. Вы можете использовать --no-keep-index, чтобы это отменить.
--pathspec-from-file=< file>
Эта опция допустима только для команды push.
Вместо аргументов командной строки передаются pathspec в < file>. Если < file> точно -, то используется стандартный ввод. Элементы pathspec отделяются друг от друга LF или CR/LF. Элементы pathspec могут быть заключены в двойные кавычки, как было объяснено для переменной конфигурации core.quotePath (см. git-config(1)). См. также --pathspec-file-nul и global --literal-pathspecs.
--pathspec-file-nul
Эта опция допустима только для команды push.
Имеет смысл только с --pathspec-from-file. Элементы pathspec разделяются символом NUL, и все другие символы берутся литерально (включая символы новых строк и двойные кавычки).
-q, --quiet
Эта опция допустима только для команд apply, drop, pop, push, save, store.
Подавляет любые сообщения обратной связи.
--
Эта опция допустима только для команды push.
Отделяет pathspec от опций с целью разрешения неоднозначности.
< pathspec>...
Эта опция допустима только для команды push.
Новый элемент stash запишет измененные состояния только для файлов, которые соответствуют pathspec. Элементы индекса и файлы рабочего дерева откатываются обратно к состоянию HEAD также только для этих файлов, оставляя неизменными файлы, которые не соответствуют pathspec.
Для дополнительной информации см. элемент pathspec entry в gitglossary(7).
< stash>
Эта опция допустима только для команд apply, branch, drop, pop, show.
Ссылка в форме stash@{< revision>}. Когда не указана < stash> подразумевается последний элемент stash (т. е. stash@{0}).
ОБСУЖДЕНИЕ
Элемент (сохранение) stash представлен как фиксация, дерево которой записывает состояние рабочего каталога, а его первым родительским элементом является фиксация на HEAD когда элемент stash был создан. Дерево второго родителя записывает состояние индекса при создании элемента, и он становится потомком фиксации HEAD. Граф наследования выглядит примерно так:
.----W / / -----H----I
Здесь H это фиксация HEAD, I это фиксация, записывающая состояние индекса, и W это фиксация, записывающая состояние рабочего дерева.
ПРИМЕРЫ
Pull в грязное дерево
Когда находитесь посередине какой-то работы, вы узнаете, что что-то в основном потоке разработки (upstream) поменялось, и возможно имеет отношение к тому, что вы делаете. Когда ваши локальные изменения не конфликтуют с изменениями в upstream, простой git pull позволит вам двигаться дальше.
Однако есть случаи, когда ваши локальные изменения создают конфликт с изменениями в upstream, и git pull отказывается перезаписать ваши изменения. В таком случае вы все равно можете сделать stash для ваших изменений, выполнить pull, и затем откатить stash, примерно так:
$ git pull ... файл foobar не обновился, слияние невозможно $ git stash $ git pull $ git stash pop
Прерванный рабочий процесс
Когда находитесь посередине какой-то работы, пришел ваш босс и потребовал немедленно что-то пофиксить. Обычно вы сделаете commit во временную ветку, чтобы как-то сохранить свои изменения, и вернетесь в оригинальную ветку для внесения требуемых исправлений, примерно так:
# ... кодите кодите кодите ... $ git switch -c my_wip $ git commit -a -m "WIP" $ git switch master $ ... вносите срочные исправления ... $ git commit -a -m "Fix in a hurry" $ git switch my_wip $ git reset --soft HEAD^ # ... продолжаете кодить ...
Для упрощения этой процедуры вы можете использовать git stash, примерно так:
# ... кодите кодите кодите ... $ git stash $ ... вносите срочные исправления ... $ git commit -a -m "Fix in a hurry" $ git stash pop # ... продолжаете кодить ...
Тестирование частичных фиксаций
Вы можете использовать git stash push --keep-index, когда хотите сделать два или большее количество фиксаций из изменений в рабочем дереве, и хотите протестить каждое изменение перед фиксацией:
# ... кодите кодите кодите ... $ git add --patch foo # добавление только первой части к индексу $ git stash push --keep-index # сохранение всех других изменений в stash $ редактирование/сборка/проверка первой части изменений $ git commit -m 'First part' # фиксация полностью проверенного изменения $ git stash pop # возврат к работе над всем другими изменениями # ... повтор предыдущих пяти шагов, пока не останется одна фиксация ... $ редактирование/сборка/проверка остальных частей изменений $ git commit foo -m 'Remaining parts'
Восстановление элементов stash entries, которые были по ошибке очищены/выкинуты
Если вы по ошибке выполнили drop или очистку элементов stash, они не могут быть восстановлены с помощью обычных механизмов безопасности. Однако вы можете попробовать следующее колдунство, чтобы получить список элементов stash, все еще находящихся в вашем репозитории, но более недоступных:
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
СМ. ТАКЖЕ
git-checkout(1), git-commit(1), git-reflog(1), git-reset(1), git-switch(1)
[Ссылки]
1. Инструменты Git Припрятывание и очистка site:git-scm.com. 2. Краткий справочник по Git. 3. Руководство по команде git log. 4. Git: просмотр истории фиксаций. 5. git clean: как удалить не отслеживаемые файлы. |