Пошук уроків, статей та іншого контенту
Освоїте збереження незавершеної роботи, перегляд stash та повернення змін у робочу директорію.
git stashІноді потрібно тимчасово відкласти незавершені зміни, не створюючи коміт. Наприклад:
ви працюєте над новою функцією;
з'явилося термінове виправлення в іншій гілці;
потрібно переключитися на іншу гілку;
поточні зміни ще не готові для коміту.
Команда git stash зберігає зміни окремо, а робочу директорію повертає до стану останнього коміту. Після цього можна виконати іншу роботу, а згодом повернути відкладені зміни.
git stashне створює звичайний коміт у вашій поточній гілці. Це тимчасове сховище змін Git.
Перевіримо стан репозиторію:
git statusЯкщо у файлах є незбережені зміни, виконайте:
git stashGit збереже зміни та очистить робочу директорію від них. Перевірити результат можна так:
git statusЗазвичай після цього Git повідомить, що робоча директорія чиста.
Уявімо, що файл app.js було змінено:
git status
# On branch main
# Changes not staged for commit:
# modified: app.jsЗбережемо зміни:
git stashПісля цього:
git status
# On branch main
# nothing to commit, working tree cleanНезавершена робота не втрачена. Вона зберігається у stash.
За замовчуванням Git створює опис на кшталт WIP on main. Щоб легше зрозуміти призначення збережених змін, можна додати власний опис:
git stash push -m "Незавершена форма входу"Форма git stash push є явнішою, ніж коротка git stash, і дає змогу використовувати параметри, наприклад повідомлення.
Щоб переглянути всі stash, використовуйте:
git stash listПриклад результату:
stash@{0}: On main: Незавершена форма входу
stash@{1}: On feature/header: Оновлення заголовкаКожен stash має назву:
stash@{0} — останній створений stash;
stash@{1} — stash, створений перед ним;
stash@{2} — ще старіший stash.
Нові stash отримують менший індекс, тому stash@{0} завжди є найновішим.
Щоб переглянути, які файли змінилися у конкретному stash:
git stash show stash@{0}За замовчуванням Git показує коротку статистику. Для перегляду повного diff використовуйте:
git stash show --patch stash@{0}Якщо потрібно переглянути останній stash, назву можна не вказувати:
git stash show --patchДля повернення збережених змін використовуйте git stash apply:
git stash applyЦя команда застосує останній stash до робочої директорії, але залишить його у списку stash.
Перевірити результат:
git statusЗміни знову з'являться у відповідних файлах.
Якщо потрібно застосувати не останній stash, вкажіть його назву:
git stash apply stash@{1}Git спробує додати зміни до поточного стану робочої директорії.
popКоманда:
git stash popзастосовує останній stash і, якщо застосування відбулося успішно, видаляє його зі списку.
Це поєднання двох дій:
повернути зміни;
видалити використаний stash.
Для конкретного stash:
git stash pop stash@{1}apply і pop| Команда | Повертає зміни | Видаляє stash | |---|---:|---:| | git stash apply | Так | Ні | | git stash pop | Так | Так, якщо застосування успішне |
Для початку безпечніше використовувати git stash apply. Так збережений варіант залишиться доступним, якщо під час повернення виникне проблема.
Звичайний git stash зберігає зміни лише у файлах, які Git уже відстежує. Нові невідстежувані файли до stash не потрапляють.
Наприклад, файл notes.txt було створено, але ще не додано командою git add. Звичайна команда:
git stashне збереже цей файл.
Щоб додати до stash також невідстежувані файли, використовуйте параметр --include-untracked або його коротку форму -u:
git stash push -u -m "Зміни разом із новими файлами"Тепер до stash потраплять:
зміни у відстежуваних файлах;
нові невідстежувані файли.
Файли, які підпадають під правила .gitignore, зазвичай не зберігаються. Для їх додавання існує параметр --all, але в повсякденній роботі найчастіше достатньо -u.
Після того як зміни більше не потрібні, конкретний stash можна видалити:
git stash drop stash@{0}Якщо назву не вказати, буде видалено останній stash:
git stash dropЩоб видалити всі stash одразу:
git stash clear
git stash clearвидаляє всі збережені stash без простого способу відновлення. Використовуйте цю команду обережно.
Нижче наведено типовий порядок дій:
# Перевіряємо поточний стан репозиторію
git status
# Тимчасово зберігаємо зміни разом із новими файлами
git stash push -u -m "Незавершене налаштування профілю"
# Переконуємося, що робоча директорія чиста
git status
# Переглядаємо всі доступні stash
git stash list
# Повертаємо останні збережені зміни, не видаляючи stash
git stash apply
# Перевіряємо повернуті зміни
git status
# Після перевірки видаляємо використаний stash
git stash drop stash@{0}Якщо поточні файли вже змінилися після створення stash, Git може не змогти застосувати зміни автоматично. У такому разі виникне конфлікт, подібний до конфлікту під час злиття гілок.
Перевірити конфліктні файли можна командою:
git statusУ файлі з конфліктом Git залишить спеціальні позначки:
<<<<<<< Updated upstream
поточний вміст
=======
вміст зі stash
>>>>>>> Stashed changesПотрібно:
вручну вибрати правильний варіант або об'єднати обидва;
видалити службові позначки;
зберегти файл;
додати виправлений файл до індексу:
git add шлях/до/файлуПісля цього можна продовжити роботу або створити коміт.
Якщо застосування stash завершилося конфліктом, не варто одразу виконувати git stash pop повторно. Спочатку розв'яжіть поточний конфлікт.
git stash збереже нові файлиНевідстежувані файли не зберігаються звичайною командою:
git stashВикористовуйте:
git stash -upopgit stash pop видаляє stash після успішного застосування. Якщо ви хочете залишити резервну копію, використовуйте:
git stash applyВидалити stash можна пізніше окремою командою.
Stash не прив'язаний назавжди до гілки, у якій його створили. Його можна застосувати в іншій гілці, але зміни можуть не відповідати її коду та спричинити конфлікти.
Перед застосуванням перевірте:
git branch
git stash listStash призначений для короткочасного відкладання роботи. Якщо зміни вже мають зрозумілий завершений етап, краще створити коміт. Коміти простіше переглядати, обговорювати та відновлювати.
git stash тимчасово зберігає незакомічені зміни.
git stash list показує всі збережені stash.
git stash show --patch показує вміст stash.
git stash apply повертає зміни, але залишає stash.
git stash pop повертає зміни та видаляє stash після успішного застосування.
git stash push -u також зберігає невідстежувані файли.
git stash drop видаляє один stash.
git stash clear видаляє всі stash.
Під час застосування stash можуть виникнути конфлікти, які потрібно розв'язати вручну.