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


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.