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.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
СИНОПСИС
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
. За замовчуванням stash відображається як "WIP on branchname …", але ви можете надати більш детальне повідомлення в командному рядку під час створення.
Останній створений вами хованку зберігається в 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
-p
, який діє як псевдонім дляstash
push
-p
, та елементи pathspec, які дозволені після подвійного дефісу--
для усунення неоднозначності. - 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, які у вас є на даний момент. Кожен «запис stash» перелічено з його назвою (наприклад,
stash@{0}
– це останній запис,stash@{1}
– попередній тощо), назвою гілки, яка була поточною на момент створення запису, та коротким описом коміту, на якому базувався запис.stash@{0}: Незавершене виконання при надсиланні: 6ebd0e2... Оновити документацію git-stash stash@{1}: На головному файлі: 9cc0589... Додати git-stash
Команда використовує опції, що застосовуються до команди «git log», щоб контролювати, що і як відображається. Див. git-log[1].
- show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]
-
Показати зміни, записані в записі stash, як різницю між вмістом 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
. Робочий каталог має відповідати індексу.Застосування стану може призвести до невдачі через конфлікти; у цьому випадку він не видаляється зі списку stash. Вам потрібно вирішити конфлікти вручну та після цього вручну викликати
git
stash
drop
. - apply [--index] [-q|--quiet] [<stash>]
-
Як і
pop
, але не видаляти стан зі списку stash. На відміну відpop
, <stash> може бути будь-яким комітом, який виглядає як коміт, створений за допомогоюstash
push
абоstash
create
. - branch <branchname> [<stash>]
-
Створює та витягує нову гілку з назвою <branchname>, починаючи з коміту, в якому <stash> було спочатку створено, застосовує зміни, записані в <stash>, до нового робочого дерева та індексу. Якщо це вдається, і <stash> є посиланням у формі
stash@{
<revision>}
, то <stash> видаляється.Це корисно, якщо гілка, на якій ви виконали
git
stash
push
, змінилася настільки, щоgit
stash
apply
не вдається виконати через конфлікти. Оскільки запис stash застосовується поверх коміту, який був HEAD на момент запускуgit
stash
, він відновлює початковий стан stash без конфліктів. - чисто
-
Видаліть усі записи зі сховища. Зверніть увагу, що ці записи потім будуть видалені, і їх може бути неможливо відновити (див. «Приклади» нижче для можливої стратегії).
- drop [-q|--quiet] [<stash>]
-
Видалити один запис stash зі списку записів stash.
- create
-
Створіть запис stash (який є звичайним об’єктом commit) та поверніть його назву об’єкта, не зберігаючи її ніде в просторі імен ref. Це призначено для використання у скриптах. Ймовірно, це не та команда, яку ви хочете використовувати; див. "push" вище.
- магазин
-
Зберегти заданий stash, створений за допомогою git stash create (що є завислим комітом злиття), у stash ref, оновлюючи stash reflog. Це призначено для використання скриптами. Ймовірно, це не та команда, яку ви хочете використовувати; див. "push" вище.
- export ( --print | --to-ref <ref> ) [<stash>…]
-
Експортувати зазначені сховища, або всі, якщо жодного не вказано, до ланцюжка комітів, які можна передати за допомогою звичайних механізмів fetch та push, а потім імпортувати за допомогою підкоманди
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> -
Генерувати різниці з <n> рядками контексту. За замовчуванням використовується
diff.context
або 3, якщо параметр конфігурації не встановлено. -
--inter-hunk-context=
<n> -
Показує контекст між різницями (diff hanks), до вказаної <кількості> рядків, таким чином об’єднуючи ханки, що знаходяться близько один до одного. За замовчуванням використовується значення
diff.interHunkContext
або 0, якщо параметр конфігурації не встановлено.
- -S
- --staged
-
Ця опція дійсна лише для команд
push
таsave
.Зберігає лише ті зміни, які зараз перебувають у індексі. Це схоже на базовий
git
commit
, за винятком того, що стан зберігається у сховищі, а не в поточній гілці.Опція
--patch
має пріоритет над цією. - --pathspec-from-file=<файл>
-
Ця опція дійсна лише для команди
push
.Специфікація шляху передається у <file> замість аргументів командного рядка. Якщо <file> дорівнює саме
-
, то використовується стандартний ввід. Елементи Pathspec розділяються символами LF або CR/LF. Елементи Pathspec можна брати в лапки, як пояснено для змінної конфігураціїcore.quotePath
(див. git-config[1]). Див. також--pathspec-file-nul
та глобальну змінну--literal-pathspecs
. - --pathspec-file-nul
-
Ця опція дійсна лише для команди
push
.Має значення лише з
--pathspec-from-file
. Елементи Pathspec розділяються символом NUL, а всі інші символи (включно з символами нового рядка та лапками) сприймаються буквально. - -q
- --quiet
-
Ця опція дійсна лише для команд
apply
,drop
,pop
,push
,save
,store
.Тихі, придушені повідомлення зворотного зв’язку.
-
Цей параметр дійсний лише для команди
export
.Створіть ланцюжок комітів, що представляють експортовані схованки, без їх збереження в просторі імен ref, та виведіть ідентифікатор об’єкта у стандартний вивід. Це розроблено для скриптів.
- --to-ref
-
Цей параметр дійсний лише для команди
export
.Створіть ланцюжок комітів, що представляють експортовані схованки, та збережіть його у вказаному посиланні.
- --
-
Ця опція дійсна лише для команди
push
.Відокремлює pathspec від опцій для усунення неоднозначності.
- <pathspec>…
-
Ця опція дійсна лише для команди
push
.Новий запис stash записує змінені стани лише для файлів, які відповідають специфікації шляху. Записи індексу та файли робочого дерева потім повертаються до стану, зазначеного в HEAD лише для цих файлів, залишаючи файли, які не відповідають специфікації шляху, недоторканими.
Для отримання додаткової інформації див. запис «pathspec» у gitglossary[7].
- <stash>
-
Цей параметр дійсний лише для команд
apply
,branch
,drop
,pop
,show
таexport
.Посилання у форматі
stash@{
<revision>}
. Якщо <stash> не вказано, передбачається, що це найновіший stash (тобтоstash@{0}
).
ОБГОВОРЕННЯ
Запис stash представлений як коміт, дерево якого записує стан робочого каталогу, а його перший батько – це коміт з HEAD
на момент створення запису. Дерево другого батька записує стан індексу на момент створення запису та стає дочірнім для коміту HEAD
. Граф предків виглядає так:
.----W / / -----H----I
де H
— це коміт HEAD
, I
— це коміт, який записує стан індексу, а W
— це коміт, який записує стан робочого дерева.
ПРИКЛАДИ
- В’їжджаєш у брудне дерево
-
Коли ви перебуваєте посеред чогось, ви дізнаєтеся, що є зміни в апстрімі, які, можливо, мають відношення до того, що ви робите. Коли ваші локальні зміни не конфліктують зі змінами в апстрімі, простий
git
pull
дозволить вам рухатися далі.Однак, бувають випадки, коли ваші локальні зміни конфліктують зі змінами, що були в основній базі даних, і
git
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]. Вміст такий самий, як і там:
Warning
|
Missing See original version for this content. |
GIT
Частина набору git[1]