українська мова ▾ Topics ▾ Latest version ▾ git-stash last updated in 2.52.0

НАЗВА

git-stash — Приховати зміни у робочій теці, що містить незбережені зміни

СИНОПСИС

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 [--index] [-q | --quiet] [<stash>]
git stash' apply [--index] [-q | --quiet] [<stash>]
git stash' branch <branchname> [<stash>]
git stash' [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
	     [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
	     [--pathspec-from-file=<file> [--pathspec-file-nul]]
	     [--] [<pathspec>…​]]
git stash' save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
          [-u | --include-untracked] [-a | --all] [<message>]
git stash clear
git stash create [<message>]
git stash store [(-m | --message) <message>] [-q | --quiet] <commit>
git stash export (--print | --to-ref <ref>) [<stash>…​]
git stash import <commit>

ОПИС

Використовуйте команду git stash, якщо ви хочете зберегти поточний стан робочої теки та індексу, але при цьому повернутися до чистої робочої теки. Ця команда зберігає ваші локальні зміни та відновлює робочу теку до стану, що відповідає коміту HEAD.

Зміни, збережені за допомогою цієї команди, можна переглянути за допомогою команди git stash list, перевірити за допомогою git stash show та відновити (можливо, поверх іншого коміту) за допомогою git stash apply. Виклик команди git stash без аргументів еквівалентний команді git stash push. Сховок зазвичай відображається як «WIP on “<branchname>” …​», але ви можете вказати більш описове повідомлення в командному рядку під час його створення. (Примітка: WIP, Work In Progress).

Остання створена вами схованка зберігається в refs/stash; старіші схованки можна знайти в reflog цього посилання та позначати за допомогою звичайного синтаксису 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) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]

Збережіть ваші локальні зміни в новому «записі stash» та поверніть їх до HEAD (у робочому дереві та в індексі). Частина <message> є необовʼязковою та містить опис разом зі станом stash.

Щоб швидко створити знімок, можна опустити «push». У цьому режимі аргументи, що не є опціями, заборонені, щоб уникнути створення небажаного запису в stash через помилку в написанні субкоманди. Є два винятки з цього правила: stash -p, що діє як псевдонім для stash push -p, та елементи шляху, які дозволяються після подвійного дефіса -- для усунення неоднозначності.

save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]

Цей параметр застарів на користь git stash push. Він відрізняється від «stash push» тим, що не може приймати pathspec. Натомість усі аргументи, що не є параметрами, обʼєднуються для формування повідомлення stash.

list [<log-options>]

Перелічити записи сховку, які у вас є на даний момент. Кожен «запис сховку» вказано разом із його назвою (наприклад, stash@{0} — це найновіший запис, stash@{1} — попередній тощо), назвою гілки, яка була активною на момент створення запису, та коротким описом коміту, на якому базується цей запис.

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

Команда використовує опції, що застосовуються до команди git log, щоб контролювати, що і як відображається. Див. git-log[1].

show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]

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

pop [--index] [-q | --quiet] [<stash>]

Видалити один стан зі списку сховків та застосувати його поверх поточного стану робочого дерева, тобто виконати операцію, зворотну до git stash push. Робоча тека має збігатись з індексом.

Застосування стану може завершитися невдачею через конфлікти; у цьому випадку він не видаляється зі списку відкладених змін. Вам потрібно вручну розвʼязати конфлікти, а потім вручну виконати команду git stash drop.

apply [--index] [-q | --quiet] [<stash>]

Як і pop, але не видаляти стан зі списку stash. На відміну від pop, <stash> може бути будь-яким комітом, який виглядає як коміт, створений за допомогою stash push або stash create.

branch <branchname> [<stash>]

Створює та переходить на нову гілку з іменем <branchname>, починаючи з коміту, в якому <stash> було спочатку створено, застосовує зміни, записані в <stash>, до нового робочого дерева та індексу. Якщо це вдається, і <stash> є посиланням у формі stash@{<ревізія>}, то <stash> видаляється.

Це корисно, якщо гілка, на якій ви виконали git stash push, змінилася настільки, що git stash apply не вдається виконати через конфлікти. Оскільки запис stash застосовується поверх коміту, який був HEAD на момент запуску git stash, він відновлює початковий стан stash без конфліктів.

clear

Видалить усі записи зі сховку. Зверніть увагу, що ці записи потім будуть видалені, і їх може бути неможливо відновити (див. «ПРИКЛАДИ» нижче для можливої стратегії).

drop [-q | --quiet] [<stash>]

Видалити один запис stash зі списку записів stash.

create

Створення запису сховку (який є звичайним об’єктом коміту) та повернення імені цього об’єкта без збереження його в просторі імен ref. Ця функція призначена для використання у скриптах. Ймовірно, це не та команда, яку ви хочете використовувати; див. «push» вище.

store

Зберегти заданий stash, створений за допомогою git stash create (що є завислим комітом злиття), у stash ref, оновлюючи stash reflog. Це призначено для використання скриптами. Ймовірно, це не та команда, яку ви хочете використовувати; див. "push" вище.

export ( --print | --to-ref <ref> ) [<stash>...]

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

import <commit>

Імпорт вказаних сховків з вказаного коміту, який мав бути створений за допомогою export, та додавання їх до списку сховків. Щоб замінити наявні сховки, спочатку скористайтеся clear.

ОПЦІЇ

-a
--all

Ця опція дійсна лише для команд push та save.

Усі проігноровані та невідстежувані файли також зберігаються у сховку, а потім видаляються за допомогою команди git clean.

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

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

При використанні з командою show, відображати невідстежувані файли у записі stash як частину різниці.

--only-untracked

Ця опція дійсна лише для команди show.

Показувати лише невідстежувані файли у записі stash як частину різниці.

--index

Цей параметр дійсний лише для команд pop та apply.

Намагатись відновити не лише зміни робочого дерева, а й зміни індексу. Однак це може не спрацювати, якщо виникають конфлікти (які зберігаються в індексі, через що ви більше не зможете застосувати зміни так, як вони були спочатку).

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

Ця опція дійсна лише для команд push та save.

Усі зміни, що вже додані до індексу, залишаються незмінними.

-p
--patch

Ця опція дійсна лише для команд push та save.

Інтерактивно вибирайте фрагменти з різниці між HEAD та робочим деревом для зберігання. Запис stash побудовано таким чином, що його індексний стан збігається зі станом індексу вашого репозиторію, а його робоче дерево містить лише зміни, вибрані вами інтерактивно. Потім вибрані зміни скасовуються з вашого робочого дерева. Дивіться розділ «Інтерактивний режим» у git-add[1], щоб дізнатися, як керувати режимом --patch.

Опція --patch має на увазі --keep-index. Ви можете скористатися --no-keep-index, щоб перевизначити це.

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

Створює файли відмінностей (diff) з <n> рядками контексту. Стандартно використовується diff.context або 3, якщо параметр конфігурації не встановлено.

--inter-hunk-context=<n>

Показує контекст між фрагментами відмінностей (diff hunks), до вказаної <кількості> рядків, таким чином обʼєднуючи фрагменти, що знаходяться близько один до одного. Стандартно використовується значення diff.interHunkContext або 0, якщо параметр конфігурації не встановлено.

-S
--staged

Ця опція дійсна лише для команд push та save.

Зберігає лише ті зміни, які зараз перебувають в індексі. Це схоже на базовий 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.

Створює ланцюжок комітів, що представляють експортовані сховки, без їх збереження в просторі імен ref, та виводить ідентифікатор обʼєкта у стандартний вивід. Це створено для скриптів.

--to-ref

Цей параметр дійсний лише для команди export.

Створює ланцюжок комітів, що представляють експортовані сховки, та зберігає його у вказаному посиланні.

--

Ця опція дійсна лише для команди push.

Відокремлює специфікатор шляху від опцій для усунення неоднозначності.

<pathspec>...

Ця опція дійсна лише для команди push.

Новий елемент stash записує змінені стани лише для файлів, які відповідають специфікатору шляху. Записи індексу та файли робочого дерева потім повертаються до стану, зазначеного в HEAD лише для цих файлів, залишаючи файли, які не відповідають специфікатору шляху, без змін.

Для отримання додаткової інформації див. елемент «pathspec» у gitglossary[7].

<stash>

Цей параметр дійсний лише для команд apply, branch, drop, pop, show та export.

Посилання у форматі stash@{<версія>}. Якщо <stash> не вказано, передбачається, що це найновіший stash (тобто stash@{0}).

ОБГОВОРЕННЯ

Запис stash представлений як коміт, дерево якого записує стан робочої теки, а його перший батько  — це коміт з HEAD на момент створення запису. Дерево другого батька записує стан індексу на момент створення запису та стає дочірнім для коміту HEAD. Граф предків виглядає так:

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

де H — це коміт HEAD, I  — це коміт, який записує стан індексу, а `W — це коміт, який записує стан робочого дерева.

ПРИКЛАДИ

Втягування у дерево зі змінами

Коли ви працюєте над чимось, ви дізнаєтеся, що в основному репозиторії відбулися зміни, які, можливо, мають стосунок до вашої роботи. Якщо ваші локальні зміни не суперечать змінам в основному репозиторії, проста команда git pull дозволить вам продовжити роботу.

Однак трапляються випадки, коли ваші локальні зміни суперечать змінам з основного репозиторію, і команда git pull відмовляється перезаписувати ваші зміни. У такому випадку ви можете приховати свої зміни, виконати pull, а потім відновити їх, як показано нижче:

$ git pull
 ...
Файл foobar не оновлений, об'єднання неможливе.
$ git stash
$ git pull
$ git stash pop
Перерваний робочий процес

Коли ви перебуваєте в процесі роботи, до вас заходить керівник і вимагає негайно щось виправити. Зазвичай ви б зробили коміт у тимчасову гілку, щоб зберегти свої зміни, а потім повернулися до початкової гілки, щоб виконати термінове виправлення, наприклад так:

# ... відповідь на головне питання про життя, Всесвіт і все інше ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git switch my_wip
$ git reset --soft HEAD^
# ... продовжуємо розмірковувати ...

Ви можете скористатися git stash для спрощення вищезазначеного, ось так:

# ... відповідь на головне питання про життя, Всесвіт і все інше...
$ git stash
$ edit emergency fix
$ 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    # зберегти всі інші зміни до сховку
$ edit/build/test first part
$ git commit -m 'First part'     # зафіксувати повністю перевірені зміни
$ git stash pop                  # підготуватися до роботи над усіма іншими змінами
# ... повторюйте вищезазначені пʼять кроків, поки не залишиться один коміт ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'
Збереження непов’язаних змін для подальшого використання

Коли ви перебуваєте посеред масштабних змін і знаходите якусь неповʼязану проблему, яку не хочете забути виправити, ви можете внести зміни, проіндексувати їх та використати git stash push --staged, щоб зберегти їх для подальшого використання. Це схоже на коміт проіндексованих змін, тільки коміт потрапляє до сховку, а не до поточної гілки.

# ... відповідь на головне питання про життя, Всесвіт і все інше...
$ git add --patch foo           # додати неповʼязані зміни до індексу
$ git stash push --staged       # зберегти ці зміни у сховищі
# ... відповідь на головне питання про життя, Всесвіт і все інше, плюс  завершити поточні зміни ...
$ git commit -m 'Massive'       # зафіксувати повністю перевірені зміни
$ 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 покаже файли, що не відстежуються, в елементі сховища. Стандартне значення — false.

stash.showPatch

Якщо для цього параметра встановлено значення true, команда git stash show без додаткових опцій відображатиме запис про тимчасове збереження у вигляді латки. Стандартне значення — false.

stash.showStat

Якщо для цього параметра встановлено значення true, команда git stash show без додаткових опцій відображатиме diffstat запису в сховку. Стандартне значення — true.

GIT

Частина набору git[1]