Як відновити незапущені зміни, включаючи файли та папки?


1071

Чи є команда git для відновлення всіх неподілених змін у робочому дереві та індексі, а також для видалення новостворених файлів і папок?



1
Ну, я прочитав усі різноманітні та важко запам'ятовуються відповіді нижче, з їх застереженнями та крайовими справами та "не працював, якщо у вас є ххх", і затримався зі видаленням всього репо, клонувавши його, щоб видалити всі відредаговані та додані файли . Також є лише дві команди. rm -r projectdir; git clone xxx Для мене це часта операція - перегляньте репорт з нею, потім захочете повернутися до чистої каси, щоб я міг почати її змінювати. Не чудово, але працює на 100%. Сподіваючись, що одного дня вони додадуть для цього просту команду.
— Джон Літтл

Відповіді:


1771

Ви можете запустити ці дві команди:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
хороша ідея запустити 'git clean -nd' для попереднього перегляду змін перед запуском git clean, щоб переконатися, що у вас немає неподілених файлів або каталогів, які вам важливі щодо цього, буде видалено.
— jpw

79
Збережіть кого-небудь поїздку до документів: -f - це сила, -d - видалення каталогів, -n - це сухий пробіг (також - пробний запуск; покажіть вихід, поки нічого не роблячи)
— Аарон Кемпбелл

12
git clean -iдля інтерактивного режиму.
— галат

Це не скинуло мої нестандартні файли, я повинен був спершу поставити їх.
— Арон Лорінц

4
@IgorGanapolsky Ви, мабуть, опинилися в конфлікті злиття. Спробуйте запустити git merge --abort.
— htanata

555

Якщо ви хочете відновити зміни лише в поточному робочому каталозі, використовуйте

git checkout -- .

А перед цим ви можете перелічити файли, які будуть повернені, фактично не роблячи жодних дій, просто перевірити, що буде, за допомогою:

git checkout --

1
Коли я намагаюся це, я отримую "помилку: pathspec". " не відповідали жодному файлу, відомому git.
— Майк К

34
яка різниця між цим і git reset --hard?
— Феліпе Альмейда

104
'git reset --hard' скасує як поетапні, так і нестандартні зміни, тоді як 'git checkout -.' скасує лише нестандартні зміни
— divideByZero

Але якщо ви використовуєте замовлення, і у вас є змінені файли, cmd повернеться, що мені потрібно зробити злиття, навіть коли мені просто потрібно відновити ці зміни
— Vinicius Monteiro

7
git checkout - буде просто перераховано файли, які будуть повернені (ніяких дій, лише список). це корисно, якщо ви хочете побачити, на які файли впливатиме перед тим, як робити git checkout -.
— Кріш Шрінівасан

107

Використовуйте "git checkout - ...", щоб скасувати зміни в робочому каталозі

git checkout -- app/views/posts/index.html.erb

або

git checkout -- *

видаляє всі зміни, внесені до нестандартних файлів у статусі git, наприклад

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *не працює для мене, якщо я не знаходжусь у каталозі, де знаходяться змінені файли. Щоб перевірити всі файли у всьому сховищі, потрібно зробитиgit checkout -- :/
— waldyrious

В git checkout -- *, зірку замінює Shell, з усіма файлами та каталогами в поточному каталозі. Тож воно має йти у підкаталогах. Це працює для мене. Але завдяки виділенню синтаксису ": /", який, на мою думку, виглядає чистішим.
— mcoolive

53

Один нетривіальний спосіб - запустити ці дві команди:

  1. git stash Це змістить ваші зміни в сховище, повернувши вас до стану HEAD
  2. git stash drop Це видалить останню скриньку, створену в останній команді.

3
Це не працює для неспроможних змін, а лише здійснених змін.
— b0xxed1n

4
Я використовував його для невмілих змін, і він працює.
— Пол Д. Іден

7
@ b0xxed1n Stashing - це все про незапущені зміни, і, очевидно, це працює для них.
— TJ

git stash було зроблено, щоб зберегти незаконні зміни, щоб ви могли .. зберегти їх, не вчиняючи.
— Роб

git stash призводить до такої помилки:fatal: git-write-tree: error building trees Cannot save the current index state
— IgorGanapolsky

19
git clean -fd

не допомогло, нові файли залишилися. Що я зробив, це повністю видалити все робоче дерево, а потім

git reset --hard

Див. Розділ " Як очистити свій локальний робочий каталог в git? ", Щоб отримати поради -xщодо очищення:

git clean -fdx

-xПрапор примітки видалить усі ігноровані Git файли, тому будьте обережні (див. Обговорення у відповіді, на яку я посилаюся).


що таке -fdx? "сила, каталог і х є?
— Аді Прасетьо

@AdiPrasetyo -x прапор також видаляє всі ігноровані файли; це може бути небажаним ефектом, тому я оновив свою відповідь.
— Fr0sT

Я досі не можу перезавантажити. Я отримую помилку: error: Не вдалося об'єднати зміни. Не вдалося виконати виправлення в 0003 Створити передзвонення в Копію виправленого патча знайдено в:
— ІгорГанапольський

13

Я думаю, ви можете використовувати таку команду: git reset --hard


хммм ... Я це зробив, але мої файли все ще є. Чи варто щось робити після?
— MEM

1
git reset повертає лише невпорядковані зміни в робочому дереві. Не вдасться видалити нові файли та папки. Я не впевнений, як це зробити з git
— Josnidhin

1
Отже, якщо ми змінимо системний каталог, додавши нові файли та папки, а потім хочемо повернути цей каталог до попереднього стану (без / вилучення цих файлів і папок), ми не можемо зробити це з git? Тож найкраще, що ми можемо, це відновити стан файлів? Але як тільки ми створимо файл, ми не зможемо видалити його, якщо це не зробити вручну?
— MEM

6

Зауважте, що все ще можуть бути файли, які, схоже, не зникають - вони можуть бути відредаговані, але git, можливо, позначив їх як відредаговані через зміни CRLF / LF. Подивіться, чи .gitattributesнещодавно ви внесли якісь зміни .

У моєму випадку я додав у .gitattributesфайл налаштування CRLF, і всі файли через це залишилися у списку "модифікованих файлів". Змінивши налаштування .gitattributes, вони зникли.


6

Якщо у вас є неопублікована зміна (її є лише у вашій робочій копії), яку ви хочете повернути до копії в останньому документі, виконайте наступне:

git checkout filename

Я пробую це після неприпустимого git rm filename, і це не працює. error: pathspec 'filename' did not match any file(s) known to git.
— falsePockets

Рішення для смерті git rmцеgit checkout master -- filename
— falsePockets

3

У Git 2.23 введена git restoreкоманда відновлення файлів робочого дерева.

https://git-scm.com/docs/git-restore

Для відновлення всіх файлів у поточному каталозі

відновлення git.

Якщо ви хочете відновити всі вихідні файли C, щоб відповідати версії в індексі, ви можете зробити це

git recovery '* .c'


1
це git 2,23 , а не 2,13
— phuclv

2

Ви можете просто скористатися наступною командою git, яка може повернути всі неподані зміни, внесені у ваше сховище:

git checkout .

Приклад:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Я зазвичай використовую такий спосіб, який добре працює:

mv fold/file /tmp
git checkout fold/file

Це саме те, що запропонував хлопець із 357 «лайками». Тільки щоб ви навіть створили резервну копію нещодавно перевіреного файлу.
— Маттіас

-3

Безпечний і довгий шлях:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Використання:

git reset HEAD filepath

Наприклад:

git reset HEAD om211/src/META-INF/persistence.xml
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.