Перейти к содержимому

git stash

Определение

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

stash

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

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

Git stash

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

Git stash

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

Git stash

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

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

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

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

Git stash

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

Git stash

bash
git stash pop
bash
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

bash
git stash -u

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

Git stash

bash
git stash -a

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

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

Git stash

bash
git stash list
bash
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@

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

Git stash

bash
git stash pop stash@{3}
bash
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

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

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

Git stash

bash
git stash show -p
bash
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

bash
git stash -p
bash
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

bash
git stash branch add-stylesheet stash@{1}
bash
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

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

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

Git stash

bash
git stash clear

Practice

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

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.