Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.54.0
2026-04-20
- 2.53.0 no changes
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.43.1 → 2.50.1 no changes
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 no changes
-
2.42.0
2023-08-21
- 2.39.1 → 2.41.3 no changes
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 no changes
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 no changes
-
2.35.0
2022-01-24
- 2.32.1 → 2.34.8 no changes
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 no changes
-
2.31.0
2021-03-15
- 2.26.1 → 2.30.9 no changes
-
2.26.0
2020-03-22
- 2.24.1 → 2.25.5 no changes
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 no changes
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 no changes
-
2.22.0
2019-06-07
- 2.17.1 → 2.21.4 no changes
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
- 2.15.4 no changes
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.8.6 → 2.10.5 no changes
-
2.7.6
2017-07-30
- 2.1.4 → 2.6.7 no changes
-
2.0.5
2014-12-17
ОБЗОР
gitstashlist[<параметры-журнала>]gitstashshow[-u|--include-untracked|--only-untracked] [<параметры-diff>] [<тайник>]gitstashdrop[-q|--quiet] [<тайник>]gitstashpop[--index] [-q|--quiet] [<тайник>]gitstashapply[--index] [-q|--quiet] [<тайник>]gitstashbranch<имя-ветки> [<тайник>]gitstash[push[-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [(-m|--message) <сообщение>] [--pathspec-from-file=<файл> [--pathspec-file-nul]] [--] [<спецификатор-пути>…]]gitstashsave[-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<сообщение>]gitstashcleargitstashcreate[<сообщение>]gitstashstore[(-m|--message) <сообщение>] [-q|--quiet] <коммит>gitstashexport(--to-ref<ссылка>) [<тайник>…]gitstashimport<коммит>
ОПИСАНИЕ
Используйте 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, который действует как псевдоним дляstashpush-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 (например,
gitstashshow-pstash@{1}для просмотра второй по свежести записи в виде изменения). Если не указан <параметр-diff>, поведение по умолчанию определяется переменными конфигурацииstash.showStatиstash.showPatch. Вы также можете использоватьstash.showIncludeUntracked, чтобы указать, включён ли--include-untrackedпо умолчанию. -
pop[--index] [-q|--quiet] [<тайник>] -
Удаляет одно сохранённое состояние из списка тайников и применяет его поверх текущего состояния рабочего каталога, т.е. выполняет операцию, обратную
gitstashpush. Рабочий каталог должен соответствовать индексу.Применение состояния может завершиться ошибкой из-за конфликтов; в этом случае оно не удаляется из списка тайников. Вам нужно разрешить конфликты вручную и затем вызвать
gitstashdropвручную. -
apply[--index] [-q|--quiet] [<тайник>] -
Как
pop, но не удаляет состояние из списка тайников. В отличие отpop, <тайник> может быть любым коммитом, похожим на коммит, созданныйstashpushилиstashcreate. -
branch<имя-ветки> [<тайник>] -
Создаёт и переключает новую ветку с именем <имя-ветки>, начиная с коммита, на котором <тайник> был изначально создан, применяет изменения, записанные в <тайник>, к новому рабочему каталогу и индексу. Если это успешно и <тайник> является ссылкой вида
stash@{<редакция>}, то затем удаляет <тайник>.Это полезно, если ветка, в которой вы выполнили
gitstashpush, изменилась настолько, чтоgitstashapplyзавершается ошибкой из-за конфликтов. Поскольку запись тайника применяется поверх коммита, который был HEAD на момент выполненияgitstash, она восстанавливает исходное сохранённое состояние без конфликтов. -
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.Все игнорируемые и неотслеживаемые файлы также сохраняются в тайнике, а затем очищаются с помощью
gitclean. -
-u -
--include-untracked -
--no-include-untracked -
При использовании с командами
pushиsaveвсе неотслеживаемые файлы также сохраняются в тайнике, а затем очищаются с помощьюgitclean.При использовании с командой
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). Это похоже на обычный
gitcommit, за исключением того, что состояние фиксируется в тайнике, а не в текущей ветке.Параметр
--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) репозитории, которые могут быть актуальны для того, чем вы занимаетесь. Когда ваши локальные изменения не конфликтуют с изменениями в вышестоящем репозитории, простой
gitpullпозволит вам двигаться дальше.Однако бывают случаи, когда ваши локальные изменения конфликтуют с изменениями в вышестоящем репозитории, и
gitpullотказывается перезаписывать ваши изменения. В таком случае вы можете спрятать (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 # ... продолжить взлом ...
- Тестирование частичных коммитов
-
Вы можете использовать
gitstashpush--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 'Оставшиеся части'
- Сохранение несвязанных изменений для будущего использования
-
Когда вы находитесь в процессе масштабных изменений и находите какую-то несвязанную проблему, которую не хотите забыть исправить, вы можете сделать изменение(я), проиндексировать их и использовать
gitstashpush--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,
gitstashapplyиgitstashpopбудут вести себя так, как будто был указан--index. По умолчанию false. -
stash.showIncludeUntracked -
Если установлено в true, команда
gitstashshowбудет показывать неотслеживаемые файлы записи в тайнике (stash). По умолчанию false. -
stash.showPatch -
Если установлено в true, команда
gitstashshowбез параметра будет показывать запись в тайнике (stash) в форме изменения (патча). По умолчанию false. -
stash.showStat -
Если установлено в true, команда
gitstashshowбез параметра будет показывать diffstat записи в тайнике (stash). По умолчанию true.
GIT
Является частью пакета git[1]