Русский ▾ Topics ▾ Latest version ▾ git-stash last updated in 2.54.0

НАЗВАНИЕ

git-stash - Спрятать изменения в изменённом рабочем каталоге

ОБЗОР

git stash list [<параметры-журнала>]
git stash show [-u | --include-untracked | --only-untracked] [<параметры-diff>] [<тайник>]
git stash drop [-q | --quiet] [<тайник>]
git stash pop [--index] [-q | --quiet] [<тайник>]
git stash apply [--index] [-q | --quiet] [<тайник>]
git stash branch <имя-ветки> [<тайник>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
	     [-u | --include-untracked] [-a | --all] [(-m | --message) <сообщение>]
	     [--pathspec-from-file=<файл> [--pathspec-file-nul]]
	     [--] [<спецификатор-пути>…​]]
git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
           [-u | --include-untracked] [-a | --all] [<сообщение>]
git stash clear
git stash create [<сообщение>]
git stash store [(-m | --message) <сообщение>] [-q | --quiet] <коммит>
git stash export (--print | --to-ref <ссылка>) [<тайник>…​]
git stash import <коммит>

ОПИСАНИЕ

Используйте git stash, когда вы хотите сохранить текущее состояние рабочего каталога и индекса, но хотите вернуться к чистому рабочему каталогу. Команда сохраняет ваши локальные изменения и возвращает рабочий каталог в состояние, соответствующее коммиту HEAD.

Сохранённые этой командой изменения можно вывести списком с помощью git stash list, просмотреть с помощью git stash show и восстановить (возможно, поверх другого коммита) с помощью git stash apply. Вызов git stash без аргументов эквивалентен git stash push. По умолчанию запись в тайнике выводится как «WIP on <имя-ветки> …​», но вы можете указать более описательное сообщение в командной строке при её создании.

Последний созданный вами тайник хранится в refs/stash; более старые тайники находятся в журнале ссылок (reflog) этой ссылки и могут быть названы с использованием обычного синтаксиса журнала ссылок (например, stash@{0} — самый последний созданный тайник, stash@{1} — предыдущий, stash@{2.hours.ago} также возможно). На тайники также можно ссылаться, указывая только индекс тайника (например, целое число <n> эквивалентно stash@{<n>}).

КОМАНДЫ

push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [ -a | --all] [-q | --quiet] [(-m|--message) <сообщение>] [--pathspec-from-file=<файл> [--pathspec-file-nul]] [--] [<спецификатор-пути>...]

Сохраняет ваши локальные изменения в новую «запись тайника» и откатывает их до состояния HEAD (в рабочем каталоге и в индексе). Часть <сообщение> необязательна и задаёт описание вместе с сохранённым состоянием.

Для быстрого создания снимка вы можете опустить «push». В этом режиме аргументы, не являющиеся параметрами, не допускаются, чтобы предотвратить создание нежелательной записи тайника из-за неверно набранной подкоманды. Два исключения из этого — stash -p, который действует как псевдоним для stash push -p, и элементы спецификатора пути, которые допускаются после двойного дефиса -- для устранения неоднозначности.

save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<сообщение>]

Этот параметр устарел в пользу git stash push. Он отличается от «stash push» тем, что не может принимать спецификатор пути. Вместо этого все аргументы, не являющиеся параметрами, объединяются для формирования сообщения тайника.

list [<параметры-журнала>]

Выводит список записей тайника, которые у вас есть. Каждая «запись тайника» выводится со своим именем (например, stash@{0} — самая последняя запись, stash@{1} — предыдущая и т.д.), именем ветки, которая была текущей при создании записи, и кратким описанием коммита, на котором основана запись.

stash@{0}: WIP on submit: 6ebd0e2... Обновление документации git-stash
stash@{1}: On master: 9cc0589... Добавление git-stash

Команда принимает параметры, применимые к команде git log, для управления тем, что и как показывается. См. git-log[1].

show [-u | --include-untracked | --only-untracked] [<параметры-diff>] [<тайник>]

Показывает изменения, записанные в записи тайника, в виде разницы между сохранённым содержимым и коммитом, на момент создания записи тайника. По умолчанию команда показывает diffstat, но она принимает любой формат, известный git diff (например, git stash show -p stash@{1} для просмотра второй по свежести записи в виде изменения). Если не указан <параметр-diff>, поведение по умолчанию определяется переменными конфигурации stash.showStat и stash.showPatch. Вы также можете использовать stash.showIncludeUntracked, чтобы указать, включён ли --include-untracked по умолчанию.

pop [--index] [-q | --quiet] [<тайник>]

Удаляет одно сохранённое состояние из списка тайников и применяет его поверх текущего состояния рабочего каталога, т.е. выполняет операцию, обратную git stash push. Рабочий каталог должен соответствовать индексу.

Применение состояния может завершиться ошибкой из-за конфликтов; в этом случае оно не удаляется из списка тайников. Вам нужно разрешить конфликты вручную и затем вызвать git stash drop вручную.

apply [--index] [-q | --quiet] [<тайник>]

Как pop, но не удаляет состояние из списка тайников. В отличие от pop, <тайник> может быть любым коммитом, похожим на коммит, созданный stash push или stash create.

branch <имя-ветки> [<тайник>]

Создаёт и переключает новую ветку с именем <имя-ветки>, начиная с коммита, на котором <тайник> был изначально создан, применяет изменения, записанные в <тайник>, к новому рабочему каталогу и индексу. Если это успешно и <тайник> является ссылкой вида stash@{<редакция>}, то затем удаляет <тайник>.

Это полезно, если ветка, в которой вы выполнили git stash push, изменилась настолько, что git stash apply завершается ошибкой из-за конфликтов. Поскольку запись тайника применяется поверх коммита, который был HEAD на момент выполнения git stash, она восстанавливает исходное сохранённое состояние без конфликтов.

clear

Удаляет все записи тайника. Обратите внимание, что эти записи затем будут подчищены (pruning), и их восстановление может быть невозможно (см. «ПРИМЕРЫ» ниже для возможной стратегии).

drop [-q | --quiet] [<тайник>]

Удаляет одну запись тайника из списка записей тайников.

create

Создаёт запись тайника (которая является обычным объектом-коммитом) и возвращает её имя объекта, не сохраняя её нигде в пространстве имён ссылок. Предназначено для использования в сценариях. Вероятно, это не та команда, которую вы хотите использовать; см. «push» выше.

store

Сохраняет заданный тайник, созданный с помощью git stash create (который является болтающимся коммитом слияния), в ссылку stash, обновляя журнал ссылок (reflog) тайника. Предназначено для использования в сценариях. Вероятно, это не та команда, которую вы хотите использовать; см. «push» выше.

export ( --print | --to-ref <ссылка> ) [<тайник>...]

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

import <коммит>

Импортирует указанные тайники из указанного коммита, который должен быть создан export, и добавляет их в список тайников. Чтобы заменить существующие тайники, сначала используйте clear.

ПАРАМЕТРЫ

-a
--all

Этот параметр действителен только для команд push и save.

Все игнорируемые и неотслеживаемые файлы также сохраняются в тайнике, а затем очищаются с помощью git clean.

-u
--include-untracked
--no-include-untracked

При использовании с командами push и save все неотслеживаемые файлы также сохраняются в тайнике, а затем очищаются с помощью git clean.

При использовании с командой show показывает неотслеживаемые файлы в записи тайника как часть разницы.

--only-untracked

Этот параметр действителен только для команды show.

Показывает только неотслеживаемые файлы в записи тайника как часть разницы.

--index

Этот параметр действителен только для команд pop и apply.

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

-k
--keep-index
--no-keep-index

Этот параметр действителен только для команд push и save.

Все изменения, уже добавленные в индекс, остаются нетронутыми.

-p
--patch

Этот параметр действителен только для команд push и save.

Интерактивно выбирает блоки из разницы между HEAD и рабочим каталогом для сохранения в тайнике. Запись тайника создаётся таким образом, что её состояние индекса совпадает с состоянием индекса вашего репозитория, а её рабочий каталог содержит только выбранные вами интерактивно изменения. Выбранные изменения затем откатываются из вашего рабочего каталога. См. раздел «Интерактивный режим» в git-add[1], чтобы узнать, как работать в режиме --patch.

Параметр --patch подразумевает --keep-index. Вы можете использовать --no-keep-index, чтобы переопределить это.

-U<n>
--unified=<n>

Создавать сравнения с <число> строками контекста. Количество строк контекста по умолчанию равно diff.context или 3, если переменная конфигурации не установлена. (-U без <числа> молча принимается как синоним -p из-за исторической случайности).

--inter-hunk-context=<n>

Выводить в качестве контекста между блоками изменений до <n> строк, тем самым объединяя близкие блоки изменений. По умолчанию равно значению переменной конфигурации diff.interHunkContext или 0, если она не установлена.

-S
--staged

Этот параметр действителен только для команд push и save.

Сохраняет в тайнике только те изменения, которые в данный момент индексированы (staged). Это похоже на обычный git commit, за исключением того, что состояние фиксируется в тайнике, а не в текущей ветке.

Параметр --patch имеет приоритет над этим.

--pathspec-from-file=<файл>

Этот параметр действителен только для команды push.

Спецификатор пути передаётся в <файле>, а не в аргументах командной строки. Если <файл> точно равен -, то используется стандартный ввод. Элементы спецификатора пути разделяются символами LF или CR/LF. Элементы спецификатора пути могут заключаться в кавычки, как объяснено для переменной конфигурации core.quotePath (см. git-config[1]). См. также --pathspec-file-nul и глобальный --literal-pathspecs.

--pathspec-file-nul

Этот параметр действителен только для команды push.

Имеет значение только при указании --pathspec-from-file. Элементы спецификатора пути отделяются друг от друга с помощью NUL-символа, а все остальные символы интерпретируются буквально (включая кавычки и переводы строк).

-q
--quiet

Этот параметр действителен только для команд apply, drop, pop, push, save, store.

Тихий режим, подавлять информационные сообщения.

--print

Этот параметр допустим только для команды export.

Создаёт цепочку коммитов, представляющую экспортированные тайники, не сохраняя её нигде в пространстве имён ссылок, и выводит идентификатор объекта в стандартный вывод. Предназначено для сценариев.

--to-ref

Этот параметр допустим только для команды export.

Создаёт цепочку коммитов, представляющую экспортированные тайники, и сохраняет её в указанную ссылку.

--

Этот параметр действителен только для команды push.

Разделяет спецификатор пути и параметры для устранения неоднозначности.

<спецификатор-пути>…

Этот параметр действителен только для команды push.

Новая запись тайника записывает изменённые состояния только для файлов, соответствующих спецификатору пути. Затем записи индекса и файлы рабочего каталога также откатываются к состоянию в HEAD только для этих файлов, оставляя файлы, не соответствующие спецификатору пути, нетронутыми.

Более подробно описание см. в параграфе спецификатор пути (pathspec) в gitglossary[7].

<тайник>

Этот параметр действителен только для команд apply, branch, drop, pop, show и export.

Ссылка вида stash@{<редакция>}. Если <тайник> не указан, предполагается последний тайник (то есть stash@{0}).

ОБСУЖДЕНИЕ

Запись тайника представлена как коммит, чьё дерево записывает состояние рабочего каталога, а его первый родитель — это коммит в HEAD на момент создания записи. Дерево второго родителя записывает состояние индекса на момент создания записи, и оно становится потомком коммита HEAD. Граф предков выглядит так:

       .----W
      /    /
-----H----I

где H — это коммит HEAD, I — коммит, который записывает состояние индекса, а W — коммит, который записывает состояние рабочего каталога.

ПРИМЕРЫ

Извлечение (pull) в грязное дерево

Когда вы находитесь в процессе работы, вы узнаёте, что есть изменения в вышестоящем (upstream) репозитории, которые могут быть актуальны для того, чем вы занимаетесь. Когда ваши локальные изменения не конфликтуют с изменениями в вышестоящем репозитории, простой git pull позволит вам двигаться дальше.

Однако бывают случаи, когда ваши локальные изменения конфликтуют с изменениями в вышестоящем репозитории, и git pull отказывается перезаписывать ваши изменения. В таком случае вы можете спрятать (stash) свои изменения, выполнить pull, а затем применить спрятанное (unstash), например:

$ git pull
 ...
файл foobar не актуален, невозможно выполнить слияние.
$ git stash
$ git pull
$ git stash pop
Прерванный рабочий процесс

Когда вы находитесь в процессе работы, приходит начальник и требует немедленно что-то исправить. Традиционно вы бы сделали коммит во временную ветку, чтобы сохранить свои изменения, и вернулись к исходной ветке, чтобы сделать срочное исправление, например:

# ... хак хак хак ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit срочное исправление
$ git commit -a -m "Срочное исправление"
$ git switch my_wip
$ git reset --soft HEAD^
# ... продолжить взлом ...

Вы можете использовать git stash, чтобы упростить вышеописанное:

# ... хак хак хак ...
$ git stash
$ edit срочное исправление
$ git commit -a -m "Срочное исправление"
$ git stash pop
# ... продолжить взлом ...
Тестирование частичных коммитов

Вы можете использовать git stash push --keep-index, когда хотите сделать два или более коммита из изменений в рабочем каталоге и хотите протестировать каждое изменение перед фиксацией:

# ... хак хак хак ...
$ git add --patch foo            # добавить только первую часть в индекс
$ git stash push --keep-index    # сохранить все остальные изменения в тайник
$ edit/build/test первую часть
$ git commit -m 'Первая часть'   # зафиксировать полностью протестированное изменение
$ git stash pop                  # подготовиться к работе над всеми остальными изменениями
# ... повторить вышеуказанные пять шагов, пока не останется один коммит ...
$ edit/build/test оставшиеся части
$ git commit foo -m 'Оставшиеся части'
Сохранение несвязанных изменений для будущего использования

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

# ... хак хак хак ...
$ git add --patch foo           # добавить несвязанные изменения в индекс
$ git stash push --staged       # сохранить эти изменения в тайник
# ... хак хак хак, закончить текущие изменения ...
$ git commit -m 'Масштабные'    # зафиксировать полностью протестированные изменения
$ git switch fixup-branch       # переключиться на другую ветку
$ git stash pop                 # закончить работу над сохранёнными изменениями
Восстановление записей тайника, которые были ошибочно очищены/удалены

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

git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

КОНФИГУРАЦИЯ

Дальнейшее содержание этого раздела, повторяет то, что может быть найдено в git-config[1]:

stash.index

Если установлено в true, git stash apply и git stash pop будут вести себя так, как будто был указан --index. По умолчанию false.

stash.showIncludeUntracked

Если установлено в true, команда git stash show будет показывать неотслеживаемые файлы записи в тайнике (stash). По умолчанию false.

stash.showPatch

Если установлено в true, команда git stash show без параметра будет показывать запись в тайнике (stash) в форме изменения (патча). По умолчанию false.

stash.showStat

Если установлено в true, команда git stash show без параметра будет показывать diffstat записи в тайнике (stash). По умолчанию true.

GIT

Является частью пакета git[1]