Пошук уроків, статей та іншого контенту
Відновлюйте файли з індексу або commit і безпечно скасовуйте зміни у робочій директорії.
git restoreКоманда git restore скасовує зміни у файлах Git-репозиторію. Вона може відновити файл із:
індексу — поточного стану, підготовленого до коміту;
певного коміту;
поточної версії гілки, зазвичай HEAD.
За замовчуванням git restore змінює робочу директорію, але не індекс. Тобто команда прибирає незбережені зміни у файлі, повертаючи його до стану з індексу.
git restore app.jsПісля виконання:
зміни app.js у робочій директорії буде скасовано;
файл повернеться до стану, який зараз збережений в індексі;
коміти та інші файли не зміняться.
Скасовані зміни у відстежуваному файлі не можна відновити за допомогою Git. Перед виконанням команди перевірте, що файл справді потрібно відновити.
Перед деструктивною операцією корисно переглянути стан репозиторію:
git statusЩоб побачити зміни у робочій директорії порівняно з індексом:
git diffЩоб побачити зміни, які вже додано до індексу:
git diff --stagedНаприклад, git status може показати:
Changes to be committed:
modified: app.js
Changes not staged for commit:
modified: styles.cssУ цьому випадку:
app.js має зміни в індексі;
styles.css має зміни лише у робочій директорії.
Команда без додаткових параметрів відновлює файли з індексу:
git restore styles.cssЦе еквівалентно дії:
«Зробити робочу копію
styles.cssтакою, як версія цього файлу в індексі».
Якщо файл не має підготовлених змін, він повернеться до останнього коміту, оскільки індекс збігається з HEAD.
Можна відновити кілька файлів:
git restore app.js styles.cssАбо всі відстежувані файли в поточній директорії:
git restore .Остання команда може скасувати велику кількість локальних змін, тому використовуйте її лише після перевірки git diff.
Параметр --source задає джерело, з якого потрібно взяти файл:
git restore --source HEAD~1 app.jsКоманда відновить app.js у робочій директорії з коміту, який є батьківським для поточного HEAD.
Ідентифікатором джерела може бути:
хеш коміту;
HEAD;
HEAD~1;
назва гілки;
тег.
Наприклад:
git restore --source feature/login app.jsФайл буде взято зі стану app.js у гілці feature/login, але поточна гілка при цьому не зміниться.
Важливо: без --staged ця команда змінює лише робочу директорію. Якщо в індексі вже була інша версія файлу, вона залишиться в індексі.
Перевірити результат можна так:
git status
git diff
git diff --stagedПараметр --staged змінює не робочу директорію, а індекс:
git restore --staged app.jsЦе прибирає файл з індексу, тобто скасовує дію git add app.js.
При цьому зміни у робочій директорії залишаються:
До команди:
індекс: нова версія app.js
робоча директорія: нова версія app.js
Після git restore --staged app.js:
індекс: версія з HEAD
робоча директорія: нова версія app.jsЦе корисно, якщо ви випадково додали файл до майбутнього коміту, але ще хочете продовжити редагування.
Після команди:
git statusфайл зазвичай переміститься з розділу Changes to be committed до розділу Changes not staged for commit.
--stagedКоли використовується --staged, джерелом за замовчуванням є HEAD:
git restore --staged app.jsТобто індекс буде відновлено зі стану файлу в останньому коміті.
Явно вказати те саме можна так:
git restore --source HEAD --staged app.jsЩоб повністю повернути файл до стану певного коміту, потрібно змінити і індекс, і робочу директорію:
git restore --source HEAD --staged --worktree app.jsПісля цього:
робоча копія app.js відповідатиме HEAD;
індекс також відповідатиме HEAD;
локальні зміни цього файлу буде скасовано.
Якщо вказано --staged і --worktree, Git використовує джерело з --source. Наприклад, щоб повністю взяти файл із попереднього коміту:
git restore --source HEAD~1 --staged --worktree app.jsТепер у поточному коміті файл залишиться незмінним, але робоча директорія та індекс міститимуть версію з HEAD~1. Щоб зберегти цей стан у поточній гілці, файл можна закомітувати:
git commit -m "Restore app.js from previous version"Можна передати кілька шляхів:
git restore --source HEAD --staged --worktree app.js styles.cssДля всіх файлів у поточній директорії:
git restore --source HEAD --staged --worktree .Для конкретної вкладеної директорії:
git restore --source HEAD --worktree src/Перед використанням . або директорії варто переглянути список змінених файлів:
git status --short
git diff --name-onlyНехай файл config.js випадково змінили, а потім додали до індексу:
git add config.jsТепер ви хочете залишити зміни у робочому файлі, але прибрати їх із майбутнього коміту:
git restore --staged config.jsПереконайтеся, що зміни залишилися:
git diff -- config.jsЯкщо після цього ви вирішили повністю скасувати зміни:
git restore config.jsТепер файл повернеться до стану індексу, який після першої команди відповідає HEAD.
Повна послідовність:
# Перевіряємо стан репозиторію
git status
# Прибираємо файл із індексу, але зберігаємо зміни у робочій директорії
git restore --staged config.js
# Перевіряємо незбережені зміни
git diff -- config.js
# Повністю скасовуємо зміни у робочому файлі
git restore config.js
# Перевіряємо фінальний стан
git statusЯкщо відстежуваний файл видалили, git restore може повернути його:
git restore app.jsЯкщо файл потрібно повернути одночасно в індекс і робочу директорію:
git restore --staged --worktree app.jsЗа замовчуванням файл буде взято з HEAD.
Файл, який ніколи не був доданий до Git, цією командою відновити не можна. Такі файли є невідстежуваними, і Git не має їхньої версії в комітах або індексі.
git restore не робитьgit restore:
не створює коміт;
не змінює історію комітів;
не перемикає гілку;
не видаляє невідстежувані файли;
не скасовує зміни в інших файлах, якщо їх явно не вказано;
не відновлює втрачені локальні зміни після успішного виконання команди.
Команда працює з файлами та індексом, але не змінює вказівник поточної гілки.
git restore app.jsСкасовує зміни у робочій директорії, але не прибирає файл з індексу.
Для скасування підготовки до коміту потрібен параметр:
git restore --staged app.js--staged видалить локальні зміниКоманда:
git restore --staged app.jsзмінює лише індекс. Вона не змінює файл у робочій директорії.
Щоб скасувати і підготовку, і локальні зміни:
git restore --staged --worktree app.jsКоманда:
git restore .може відновити всі відстежувані файли в поточній директорії. Перед нею перевірте:
git diff --stat
git diffgit restore не працює як загальний інструмент резервного копіювання. Якщо файл має статус ??, Git не має збереженої версії, з якої його можна відновити.
Команда:
git restore --source HEAD~1 app.jsзмінює робочу копію, але не індекс. Через це стан файлу може відрізнятися між робочою директорією та індексом.
Якщо потрібен однаковий стан в обох місцях, використовуйте:
git restore --source HEAD~1 --staged --worktree app.js| Потреба | Команда | |---|---| | Скасувати локальні зміни у файлі | git restore file | | Прибрати файл із індексу, залишивши зміни | git restore --staged file | | Відновити файл із конкретного коміту | git restore --source COMMIT file | | Відновити файл із коміту і в індексі, і в робочій директорії | git restore --source COMMIT --staged --worktree file | | Відновити всі файли поточної директорії | git restore . |
git restore file відновлює робочу директорію зі стану індексу.
git restore --staged file відновлює індекс зі стану HEAD, не змінюючи робочий файл.
--source дає змогу вибрати коміт, гілку або інше джерело.
--staged --worktree відновлює файл одночасно в індексі та робочій директорії.
Перед скасуванням змін перевіряйте git status, git diff і git diff --staged.
git restore не змінює історію та не працює з невідстежуваними файлами.