Как отменить незафиксированные изменения, включая файлы и папки?

1072

Существует ли команда git для отмены всех незафиксированных изменений в рабочем дереве и индексе, а также для удаления вновь созданных файлов и папок?

MEM
источник
1
Ну, я прочитал все разнообразные и трудно запоминающиеся ответы ниже, с их оговорками и крайними случаями и «не сработало, если у вас есть ххх», и застрял с удалением всего репо, клонируя его, чтобы удалить все отредактированные и добавленные файлы , Также есть только две команды. rm -r projectdir; мерзавец клон ххх. Для меня это частая операция - проверить репо с ним, а затем вернуться к чистой проверке, чтобы я мог начать ее модифицировать. Не отлично, но работает на 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
htanata
источник
147
Хорошая идея запустить git clean -nd для предварительного просмотра изменений перед запуском git clean, чтобы убедиться, что у вас нет отслеженных файлов или каталогов, которые вас интересуют и будут удалены.
jpw
80
Спасите кого-нибудь от поездки в документы: -f - это сила, -d - это удалить каталоги, -n - это пробный прогон (также - - пробежка; покажите вывод, ничего не делая)
Аарон Кэмпбелл
12
git clean -iдля интерактивного режима.
Галат
Это не сбрасывало мои неподготовленные файлы, я должен был сначала подготовить их.
Арон Лоринц
4
@IgorGanapolsky Вы, вероятно, в середине конфликта слияния. Попробуйте запустить git merge --abort.
htanata
555

Если вы хотите отменить изменения только в текущем рабочем каталоге, используйте

git checkout -- .

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

git checkout --
Рамашиш Баранвал
источник
1
Когда я пытаюсь это сделать, я получаю "error: pathspec '.' не соответствует ни одному файлу (файлам), известным git.
Майк К
34
в чем разница между этим и git reset --hard?
Фелипе Алмейда
104
'git reset --hard' отменит как поэтапные, так и не поэтапные изменения, тогда как 'git checkout -.' отменяет только не внесенные изменения
DivByZero
Но если вы используете checkout и изменили файлы, 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 Это удалит последний тайник, созданный в последней команде.
glumgold
источник
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опции clean:

git clean -fdx

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

Fr0sT
источник
что такое -fdx? «сила, каталог и х есть?»
Ади Прасетио
Флаг @AdiPrasetyo -x также удаляет все игнорируемые файлы; это может быть нежелательным эффектом, поэтому я обновил свой ответ.
Fr0sT
Я до сих пор не могу перебазировать. Я получаю сообщение об ошибке: ошибка: не удалось объединить изменения. Сбой исправления на 0003 Создание обратного вызова. Сбой исправления найден в:
IgorGanapolsky
13

Я думаю, что вы можете использовать следующую команду: git reset --hard

Josnidhin
источник
хм ... я сделал это, но мои файлы все еще там. Должен ли я сделать что-то после?
MEM
1
git reset только отменяет незафиксированные изменения в рабочем дереве. Это не удалит новые файлы и папки. Я не уверен, как это сделать с помощью git
Josnidhin,
1
Итак, если мы изменим системный каталог, добавив новые файлы и папки, а затем захотим вернуть этот каталог в предыдущее состояние (без этих файлов и папок), мы не сможем сделать это с помощью git? Так что лучшее, что мы можем, это вернуть состояния файлов? Но как только мы создадим файл, мы не сможем удалить этот файл, если не сделаем это вручную?
MEM
6

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

В моем случае я добавил настройки CRLF в .gitattributesфайл, и из-за этого все файлы остались в списке «измененных файлов». Изменение настроек .gitattributes заставило их исчезнуть.

обкрадывать
источник
6

Если у вас есть незафиксированное изменение (только в вашей рабочей копии), которое вы хотите вернуть к копии в своем последнем коммите, сделайте следующее:

git checkout filename
kgandroid
источник
Я пытаюсь это после незафиксированного 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

Чтобы восстановить все файлы в текущем каталоге

мерзавец восстановить.

Если вы хотите восстановить все исходные файлы C, чтобы они соответствовали версии в индексе, вы можете сделать

git restore '* .c'

TheKojuEffect
источник
1
это мерзавец 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
thinkhy
источник
Это то же самое, что предложил парень с 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
Aniket
источник