Пошук уроків, статей та іншого контенту
Навчитеся створювати, переглядати, застосовувати, вилучати й очищати окремі записи stash.
stashgit stash зберігає незакомічені зміни окремо від історії комітів. У репозиторії можна мати не один, а багато таких записів.
Це корисно, коли потрібно:
тимчасово відкласти зміни однієї задачі;
зберегти зміни іншої задачі;
швидко перемикатися між різними наборами незавершеної роботи;
застосувати лише потрібний запис stash.
Git зберігає записи у спеціальному стеку. Новий запис додається на початок цього стека:
stash@{0} найновіший запис
stash@{1} попередній запис
stash@{2} ще старіший записПісля створення нового запису номери попередніх можуть змінитися.
Щоб створити запис із назвою, використовуйте:
git stash push -m "опис змін"Наприклад:
git stash push -m "оновлення форми входу"
git stash push -m "чернетка сторінки профілю"Параметр -m додає повідомлення, за яким легше знайти потрібний запис.
За замовчуванням git stash push зберігає зміни у відстежуваних файлах. Щоб додати також нові невідстежувані файли, використовуйте -u або --include-untracked:
git stash push -u -m "форма реєстрації з новим компонентом"Зміни в ігнорованих файлах можна додати за допомогою -a або --all, але це варто робити обережно:
git stash push -a -m "усі локальні зміни"git stash не створює запис, якщо Git не бачить змін. Перевірити стан робочого дерева можна командою:
git statusstashЩоб переглянути всі записи:
git stash listПриклад результату:
stash@{0}: On main: чернетка сторінки профілю
stash@{1}: On main: оновлення форми входу
stash@{2}: On feature/catalog: виправлення фільтраУ кожного запису є:
ідентифікатор, наприклад stash@{1};
гілка, у якій запис створили;
повідомлення, передане через -m.
Для пошуку записів можна використовувати додаткові параметри:
git stash list --grep="форма"Ця команда покаже записи, у повідомленнях яких є слово форма.
Щоб переглянути короткий опис змін у найновішому записі:
git stash show stash@{0}За замовчуванням команда показує лише перелік змінених файлів і статистику.
Щоб переглянути повний diff:
git stash show --patch stash@{0}Або скорочено:
git stash show -p stash@{0}Якщо ідентифікатор не вказати, Git використає stash@{0}:
git stash show -pДля перегляду іншого запису явно вкажіть його ідентифікатор:
git stash show -p stash@{2}Команда git stash apply застосовує зміни, але залишає запис у списку:
git stash apply stash@{1}Це зручно, якщо той самий набір змін потрібно застосувати в кількох місцях або спочатку перевірити результат.
Після застосування можна переглянути стан робочого дерева:
git statusЗапис при цьому залишиться:
git stash listПід час створення stash Git може зберегти окремо:
зміни, додані до індексу;
зміни, які ще не додані до індексу.
Звичайна команда apply відновлює вміст файлів, але не завжди відновлює їхній попередній стан в індексі. Щоб попросити Git відновити також індекс, використовуйте --index:
git stash apply --index stash@{1}Це може не спрацювати, якщо поточний стан індексу конфліктує зі збереженим.
Команда git stash pop застосовує запис і після успішного застосування вилучає його зі списку:
git stash pop stash@{0}Якщо ідентифікатор не вказати, використовується найновіший запис:
git stash popРізниця між командами:
git stash apply застосувати, але залишити запис
git stash pop застосувати й вилучити запис після успіхуЯкщо під час застосування виник конфлікт, Git не вилучає запис автоматично. Після розв’язання конфлікту можна:
перевірити зміни;
додати виправлені файли до індексу;
за потреби вручну вилучити запис командою git stash drop.
Не покладайтеся лише на номер запису. Спочатку перегляньте список:
git stash listПотім перевірте потрібний запис:
git stash show -p stash@{2}І лише після цього застосуйте його:
git stash apply stash@{2}Оскільки після додавання або вилучення записів нумерація змінюється, stash@{1} сьогодні може бути не тим самим записом, що stash@{1} після наступної операції.
Якщо запис більше не потрібен, його можна вилучити:
git stash drop stash@{1}Git попросить підтвердити операцію повідомленням на кшталт:
Dropped stash@{1} (...).Якщо ідентифікатор не вказати, буде вилучено найновіший запис:
git stash dropdrop лише вилучає запис зі списку. Він не застосовує його зміни до робочого дерева.
Щоб вилучити всі записи stash:
git stash clearЦя операція видаляє весь локальний список stash. Застосовуйте її обережно, оскільки відновлення таких записів не є звичайною операцією Git.
Перед очищенням можна перевірити список:
git stash listНижче наведено послідовність команд для типового сценарію. Вона передбачає, що репозиторій уже містить файл app.js.
# Перевіряємо початковий стан репозиторію
git status
# Вносимо зміни першої задачі
printf '\nconsole.log("login form");\n' >> app.js
git stash push -m "форма входу"
# Вносимо зміни другої задачі
printf '\nconsole.log("profile page");\n' >> app.js
git stash push -m "сторінка профілю"
# Переглядаємо всі збережені записи
git stash list
# Перевіряємо вміст старішого запису
git stash show -p stash@{1}
# Застосовуємо старіший запис і залишаємо його в списку
git stash apply stash@{1}
# Перевіряємо застосовані зміни
git status
# Скасовуємо локальні зміни, щоб продемонструвати інший запис
git restore app.js
# Застосовуємо найновіший запис і вилучаємо його зі списку
git stash pop stash@{0}
# Переглядаємо список після вилучення
git stash list
# Якщо старіший запис більше не потрібен, вилучаємо його
git stash drop stash@{0}Порядок важливий: після pop або drop номери записів можуть змінитися. Тому перед кожною операцією з конкретним записом корисно знову виконати git stash list.
Якщо зміни збережені в stash, їх можна застосувати в новій гілці за допомогою:
git stash branch feature/profile stash@{0}Git створить гілку feature/profile, перемкнеться на неї та застосує вказаний запис. Якщо застосування пройшло успішно, запис stash буде вилучено.
Це зручно, коли зміни потрібно продовжити розробляти окремо від поточної гілки.
Конфлікт може виникнути, якщо поточний код уже змінив ті самі рядки, які містить stash.
Після команди apply або pop перевірте стан:
git statusУ конфліктному файлі Git залишить спеціальні маркери:
<<<<<<< HEAD
поточний варіант
=======
варіант зі stash
>>>>>>> stashПотрібно вручну залишити правильний варіант, видалити маркери та додати виправлений файл:
git add app.jsЯкщо конфлікт виник під час pop, запис зазвичай залишається у списку, доки його не буде вилучено окремо:
git stash drop stash@{0}Перед вилученням переконайтеся, що потрібні зміни не втрачено.
Команда без ідентифікатора працює з stash@{0}:
git stash applyЯкщо потрібно застосувати старіший запис, вкажіть його явно:
git stash apply stash@{2}apply вилучить записapply лише застосовує зміни:
git stash apply stash@{1}Для вилучення після успішного застосування використовуйте pop або окремий drop.
Команда:
git stash clearвилучає всі записи, а не лише поточний. Для одного запису використовуйте:
git stash drop stash@{1}Новий файл не буде збережений звичайною командою:
git stash push -m "зміни"Якщо потрібно зберегти також невідстежувані файли, додайте -u:
git stash push -u -m "зміни з новим файлом"Після pop, drop або створення нового stash порядок записів змінюється. Перед наступною операцією перевіряйте:
git stash listКілька записів створюють командою git stash push -m "опис".
Повний список переглядають через git stash list.
Вміст запису переглядають через git stash show -p stash@{n}.
git stash apply застосовує зміни й залишає запис.
git stash pop застосовує зміни та вилучає запис після успішного застосування.
Окремий запис вилучають командою git stash drop stash@{n}.
Усі записи очищають командою git stash clear.
Перед роботою з номером запису варто перевіряти актуальний результат git stash list.
Для відновлення також проіндексованих змін можна використати --index.