W3docs

git stash

On this page you will find useful information about git stash command and how to stash your work, as well as learn about multiple and partial stashes.

Определение

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

stash

Сохранение изменений

Команда git stash сохраняет как подготовленные (staged), так и неподготовленные (unstaged) изменения, сохраняет их для последующего использования, а затем удаляет из рабочей копии. Сначала выполните git status, чтобы увидеть текущее состояние файлов. Затем выполните git stash, чтобы сохранить изменения:

Git stash

git status
On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html

Git stash

$ git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Git stash

$ git status
On branch master
nothing to commit, working tree clean

Повторное применение сохранённых изменений

Команда git stash pop удаляет изменения из очереди сохранений и повторно применяет их к рабочей копии.

Альтернативный способ — выполнить git stash apply, если вы хотите повторно применить изменения, но сохранить их в очереди сохранений:

Git stash

git status
On branch master
nothing to commit, working tree clean

Git stash

git stash pop
On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Сохранение неотслеживаемых или игнорируемых файлов

Команда git stash сохраняет изменения, добавленные в индекс (подготовленные изменения), и изменения в файлах, которые уже отслеживаются Git (неподготовленные изменения). Она не будет сохранять новые файлы в рабочей копии, которые ещё не были подготовлены, а также игнорируемые файлы. В таких случаях поможет опция git stash -u (или --include-untracked), которая позволяет сохранить неотслеживаемые файлы.

Git stash

git stash -u

Вы также можете сохранить изменения в игнорируемых файлах, используя опцию -a (или --all) при выполнении git stash.

Git stash

git stash -a

Несколько сохранений

Вы можете выполнить git stash несколько раз, чтобы создать несколько сохранений, а затем выполнить git stash list, чтобы просмотреть их. По умолчанию сохранения помечаются как «WIP» (work in progress — работа в процессе). Они создаются поверх текущей ветки и коммитов, с которых было выполнено сохранение.

Git stash

git stash list
stash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 5002d47 our new homepage
stash@{2}: WIP on master: 5002d47 our new homepage

Рекомендуется добавлять пояснение с помощью git stash push -m "сообщение"

По умолчанию git stash pop повторно применит последнее созданное сохранение: stash@0

Вы можете выбрать, какое именно сохранение применить, следующим образом:

Git stash

git stash pop stash@{3}
Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Просмотр разницы сохранений

Используйте git stash show, чтобы просмотреть краткую сводку сохранённых изменений:

Git stash

git stash show
index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)

Вы также можете использовать опции -p или --patch, чтобы увидеть полную разницу (diff) для сохранения:

Git stash

git stash show -p
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>

Частичное сохранение

Git позволяет выбрать, хотите ли вы сохранить только один файл, несколько файлов или отдельные изменения внутри файлов. Команда git stash -p проходит по каждому «хунку» (hunk — фрагменту изменений в Git) в рабочей копии и спрашивает, хотите ли вы сохранить его:

Git stash

git stash -p
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? n

Команды для работы с хунками

CommandDescription
/Поиск хунка по регулярному выражению.
?Вывод справки.
nНе сохранять хунк.
aСохранить этот хунк и все последующие хунки в файле.
dНе сохранять этот хунк и любые последующие хунки в файле.
eВручную отредактировать текущий хунк
qВыйти (выбранные хунки будут сохранены)
sРазделить хунк на более мелкие части.
yСохранить хунк.

Создание ветки из сохранения

Вы можете создать новую ветку для применения сохранённых изменений с помощью git stash branch:

Git stash

git stash branch add-stylesheet stash@{1}
Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Очистка очереди сохранений

Вы можете удалить сохранение с помощью git stash drop:

Git stash

git stash drop stash@{1}
Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)

Если вы выполните git stash clear, будут удалены все сохранения:

Git stash

git stash clear

Practice

Практика

Какие возможности и функции есть у команды 'git stash'?