Table of Contents
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