User Tools

Site Tools


git_stash

git stash

Откладывание кода

Команда git stash позволяет на время “сдать в архив” (или отложить) изменения, сделанные в рабочей копии, чтобы мы могли применить их позже. Откладывание изменений полезно, если нам необходимо переключить контекст и мы пока не готовы к созданию коммита.

git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   index.html
        new file:   style.css
 
git stash
Saved working directory and index state WIP on master: 9c69611 3
 
git status
On branch master
nothing to commit, working tree clean

Теперь мы можем вносить изменения, создавать новые коммиты, переключаться между ветками и выполнять другие операции Git. По необходимости отложенные изменения можно будет применить позже.

Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.

Применение отложенных изменений

Чтобы применить ранее отложенные изменения, воспользуйтесь командой git stash pop:

git status
On branch master
nothing to commit, working tree clean
 
git stash pop
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   index.html
        new file:   style.css

При извлечении отложенных изменений они удаляются из хранилища и применяются к рабочей копии.

Также, мы можем применить изменения к рабочей копии, не удаляя их из набора отложенных изменений. Для этого воспользуйтесь командой git stash apply:

git stash apply
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   index.html
        new file:   style.css

Это весьма удобно, когда нам нужно применить одни и те же отложенные изменения к нескольким веткам.

<WRAP center round important 95%> Nota Bene!
Необходимо помнить о следующей особенности git stash: по умолчанию Git не создает отложенные изменения для не отслеживаемых или игнорируемых файлов </WRAP>

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

По умолчанию команда git stash создает следующие отложенные изменения:

  • изменения, добавленные в раздел проиндексированных файлов (индексированные изменения);
  • изменения в файлах, отслеживаемых Git в настоящее время (неиндексированные изменения).


При этом следующие файлы отложены не будут:

  • новые файлы в рабочей копии, которые еще не были проиндексированы;
  • игнорируемые файлы.


Поэтому если в приведенный выше пример добавить третий файл – неиндексированный (т. е. без выполнения команды git add), при выполнении команды git stash этот файл не будет отложен.

git status
On branch master
Changes to be committed:
        new file:   index.html
        new file:   style.css
 
Changes not staged for commit:
        modified:   3.txt
 
Untracked files:
        script.js
 
git stash
Saved working directory and index state WIP on master: 9c69611 3
 
git status
On branch master
Untracked files:
        script.js
 
nothing added to commit but untracked files present (use "git add" to track)

Запуск git stash с параметром -u (или –include-untracked) позволяет отложить не отслеживаемые файлы:

git status
On branch main
Changes to be committed:
 
    new file:   style.css
 
Changes not staged for commit:
 
    modified:   index.html
 
Untracked files:
 
    script.js
 
git stash -u
Saved working directory and index state WIP on main: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage
 
git status
On branch main
nothing to commit, working tree clean

Можно также отложить изменения, внесенные в игнорируемые файлы. Для этого используйте параметр -a (или –all) при запуске команды git stash.

Управление несколькими наборами отложенных изменений

Мы можем создать несколько наборов отложенных изменений. Команду git stash можно выполнить несколько раз, после чего можно будет просмотреть список созданных наборов с помощью команды git stash list. По умолчанию отложенные изменения имеют пометку WIP (work in progress (незавершенная работа)) наверху ветки или коммита, в которых они были отложены. Возможно, со временем нам будет трудно вспомнить содержимое каждого набора:

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

Рекомендуется добавлять к отложенным изменениям описание в качестве подсказки. Для этого используется команда git stash save “message”:

git stash save "add style to our site"
Saved working directory and index state On main: add style to our site
HEAD is now at 5002d47 our new homepage
 
git stash list
stash@{0}: On main: add style to our site
stash@{1}: WIP on main: 5002d47 our new homepage
stash@{2}: WIP on main: 5002d47 our new homepage

По умолчанию команда git stash pop применяет последний набор отложенных изменений: stash@{0}

Если нам нужно применить определенный набор ранее отложенных изменений, укажем его идентификатор в качестве последнего аргумента. Это можно сделать так:

git stash pop stash@{2}

Просмотр различий между наборами отложенных изменений

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

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

Или укажем параметр -p (или –patch), чтобы просмотреть разницу между наборами изменений:

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 stash параметр -p (или –patch), она будет выполняться для каждого измененного участка кода в рабочей копии, запрашивая подтверждение на откладывание:

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

Чтобы увидеть полный список команд, для работы с участками кода, вводим ?. Часто используемые команды:

/	# искать участок кода по регулярному выражению
?	# Справка
n	# не откладывать участок кода
q	# выйти (все выбранные участки будут отложены)
s	# разделить участок кода на меньшие части
y	# отложить участок кода

Специальной команды для прерывания не предусмотрено, но прекратить процесс откладывания можно, нажав CTRL-C (сигнал SIGINT).

Создание ветки из отложенных изменений

Если изменения в ветке отличаются от отложенных изменений, операции извлечения или применения последних могут привести к конфликтам. Вместо этого, мы можем создать новую ветку с помощью команды /html>git stash branch и применить отложенные изменения к ней. Это можно сделать так: <code bash> 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)</code> Новая ветка создается на основе коммита, изменения в котором использовались при создании хранилища. Затем к этой ветке применяются извлеченные изменения. =====Удаление отложенных изменений===== Удалить определенный набор отложенных изменений можно с помощью команды git stash drop'':

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

Следующая команда удаляет все наборы отложенных изменений:

git stash clear
git_stash.txt · Last modified: 2023/04/06 10:28 (external edit)