Пошук уроків, статей та іншого контенту
Дізнаєтеся, як прибрати зміни з робочого дерева або Staging Area без випадкового видалення потрібних комітів.
git restoreКоманда git restore скасовує локальні зміни у файлах, не змінюючи вже створені коміти.
Вона може працювати з двома областями:
робоче дерево (Working Tree) — поточний стан файлів у каталозі проєкту;
Staging Area — зміни, підготовлені до наступного коміту.
Типовий стан файлу можна уявити так:
HEAD ──> Staging Area ──> Working TreeКоманда git restore копіює вміст із певного джерела до робочого дерева або до Staging Area.
git restoreне видаляє коміти. Для роботи з історією комітів використовують інші команди, наприклад
git resetgit revertЯкщо файл змінено, але ці зміни ще не додано до Staging Area, їх можна скасувати:
git restore app.jsGit відновить app.js до стану з індексу, тобто до стану, який відповідає Staging Area.
Якщо файл не був доданий до індексу, це зазвичай означає його останній зафіксований стан у HEAD.
echo "console.log('Нова функція');" >> app.js
git status
# У списку змінених файлів буде app.js
git restore app.js
git status
# Зміни app.js зникнутьПісля git restore app.js незбережений рядок буде видалено. Якщо зміни були важливими, відновити їх через Git може бути неможливо.
Можна вказати кілька шляхів:
git restore app.js styles.cssАбо відновити всі відстежувані файли в поточному каталозі:
git restore .Команда з крапкою діє на всі відповідні файли в поточному каталозі та його підкаталогах. Перед її виконанням варто перевірити результат:
git status
git diffПеред видаленням змін перегляньте їх за допомогою git diff:
git diffЦя команда показує зміни у робочому дереві, які ще не додано до Staging Area.
Для конкретного файлу:
git diff -- app.jsЯкщо зміни вже додано до Staging Area, використовуйте:
git diff --stagedАбо для одного файлу:
git diff --staged -- app.jsЗручна послідовність дій:
git status
git diff -- app.js
git restore app.jsІноді потрібно не видалити зміни, а лише прибрати їх зі Staging Area.
Наприклад:
git add app.jsТепер зміни app.js підготовлені до коміту. Перевірити це можна так:
git statusЩоб прибрати файл зі Staging Area, але залишити його зміни у робочому дереві, виконайте:
git restore --staged app.jsПісля цього:
зміни app.js залишаться у файлі;
файл більше не буде підготовлений до коміту;
коміти не зміняться.
# Додаємо зміни до Staging Area
git add app.js
git diff --staged
# Тут видно зміни, підготовлені до коміту
# Прибираємо зміни зі Staging Area
git restore --staged app.js
git diff
# Ті самі зміни тепер видно як зміни лише робочого дереваЦе корисно, якщо команда git add . випадково додала зайві файли, але самі зміни видаляти не потрібно.
Якщо файл уже додано до Staging Area, звичайна команда:
git restore app.jsвідновлює робоче дерево зі Staging Area. Вона не обов’язково скасовує зміни, які вже були підготовлені до коміту.
Щоб повністю повернути файл до стану останнього коміту, потрібно відновити його і в робочому дереві, і в Staging Area:
git restore --source=HEAD --staged --worktree app.jsСкорочений варіант:
git restore --source=HEAD --staged --worktree -- app.jsТут:
--source=HEAD вказує джерело відновлення — останній коміт поточної гілки;
--staged відновлює файл у Staging Area;
--worktree відновлює файл у робочому дереві;
-- відокремлює параметри команди від шляхів до файлів.
Після виконання цієї команди всі локальні зміни в app.js буде скасовано.
Перевірити результат:
git statusДля поточного коміту Git дозволяє використати:
git restore --staged --worktree -- app.jsЯкщо --source не вказано:
для робочого дерева джерелом зазвичай є Staging Area;
для Staging Area джерелом є HEAD.
Явний запис із --source=HEAD часто зрозуміліший і безпечніший під час навчання або виконання потенційно руйнівної операції.
--sourceЗа замовчуванням git restore використовує поточний стан індексу або HEAD, залежно від цільової області. Джерело можна вказати явно:
git restore --source=HEAD -- app.jsЦе відновить файл у робочому дереві зі стану останнього коміту.
Можна вказати інший коміт або гілку:
git restore --source=main -- app.jsУ цьому випадку Git візьме версію app.js із гілки main і запише її у робоче дерево.
Під час такої операції коміт не створюється, а поточна гілка не переміщується. Зміна просто з’являється як локальна зміна файлу.
Також можна використати конкретний коміт:
git restore --source=a1b2c3d -- app.jsде a1b2c3d — ідентифікатор потрібного коміту.
git restore і git resetДля роботи з локальними змінами варто розрізняти ці команди:
git restore file — відновлює файл, зазвичай скасовуючи зміни у робочому дереві;
git restore --staged file — прибирає файл зі Staging Area, зберігаючи його зміни;
git restore --staged --worktree file — скасовує зміни і в Staging Area, і в робочому дереві;
git reset має ширше призначення і може переміщувати вказівник поточної гілки між комітами.
Для простого скасування локальних змін краще використовувати команду, яка прямо описує потрібну операцію: git restore.
Перед скасуванням змін виконайте:
git status
git diff
git diff --stagedПотім визначте, що саме потрібно зробити:
Зміни у файлі непотрібні:
git restore -- app.jsФайл випадково додано до Staging Area, але зміни потрібні:
git restore --staged -- app.jsПотрібно повністю повернути файл до останнього коміту:
git restore --source=HEAD --staged --worktree -- app.jsПісля операції перевірте стан репозиторію:
git statusgit restore не робитьКоманда git restore не змінює історію комітів і не переміщує поточну гілку.
Якщо файл ще не додавали до Git, він є невідстежуваним. Команда git restore не видаляє такі файли.
Наприклад, якщо notes.txt показано в секції Untracked files, ця команда не видалить його:
git restore notes.txtДля невідстежуваних файлів потрібні інші дії, але вони не належать до призначення git restore.
Якщо зміни не були закомічені, збережені в іншому місці або винесені в stash, після git restore їх можна втратити.
git restore . без перевіркиКоманда:
git restore .може скасувати зміни в багатьох файлах одразу.
Безпечніше спочатку виконати:
git status
git diffа потім указати конкретні потрібні файли.
--staged і повним скасуваннямКоманда:
git restore --staged app.jsне повертає файл до попереднього стану. Вона лише прибирає його зі Staging Area.
Якщо потрібно видалити самі зміни, використовуйте:
git restore -- app.jsА якщо файл уже був staged і потрібно скасувати все:
git restore --source=HEAD --staged --worktree -- app.js--Якщо назва файлу може бути схожа на параметр командного рядка, використовуйте --:
git restore -- --configДля звичайних шляхів це також робить команду зрозумілішою:
git restore -- app.jsgit restore може остаточно видалити незакомічені зміни. Перед виконанням команди переконайтеся, що файл справді не потрібен.
git restore призначена для скасування локальних змін без видалення комітів.
git restore file відновлює файл у робочому дереві.
git restore --staged file прибирає файл зі Staging Area, але залишає зміни у файлі.
git restore --source=HEAD --staged --worktree -- file повністю повертає файл до стану останнього коміту.
Перед руйнівною операцією перевіряйте git status, git diff і git diff --staged.
git restore не видаляє коміти та невідстежувані файли.
Скасовані незакомічені зміни можуть бути втрачені назавжди.