git отменяет все незафиксированные или несохраненные изменения


834

Я пытаюсь отменить все изменения с момента моего последнего коммита. Я пробовал git reset --hardи git reset --hard HEADпосле просмотра этого поста . Я отвечаю с головой сейчас на 18c3773 ... но когда я смотрю на мой локальный источник все файлы все еще там. Что мне не хватает?


1
Это отличный ресурс прямо из Github: как отменить (почти) что-нибудь с помощью Git
jasonleonhard

Легко понять и просто прочитать: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Ответы:


1620
  • Это приведет к удалению всех файлов, с которыми вы могли подготовить git add:

    git reset
    
  • Это вернет все локальные незафиксированные изменения (должны быть выполнены в корне репо):

    git checkout .
    

    Вы также можете отменить незафиксированные изменения только для определенного файла или каталога:

    git checkout [some_dir|file.txt]
    

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

    git reset --hard HEAD
    
  • Это удалит все локальные неотслеживаемые файлы, поэтому остаются только файлы, отслеженные git:

    git clean -fdx
    

    ВНИМАНИЕ: -x также удалит все игнорируемые файлы, в том числе указанные .gitignore! Вы можете использовать -nдля предварительного просмотра файлов, которые будут удалены.


Подводя итог: выполнение приведенных ниже команд в основном эквивалентно свежему git cloneиз оригинального источника (но это ничего не перезагружает, поэтому намного быстрее):

git reset
git checkout .
git clean -fdx

Обычно это используется в сценариях сборки, когда вы должны убедиться, что ваше дерево абсолютно чистое - не имеет каких-либо модификаций, локально созданных объектных файлов или артефактов сборки, и вы хотите, чтобы оно работало очень быстро и не повторялось. клонировать весь репозиторий каждый раз.


@ Turibe это правильно. Мне пришлось запустить свой проект несколько раз, потому что он удалял все загруженные зависимости и мою папку .idea. Нужно лучшее решение.
EresDev

2
@ EresDev, вам не нужно выполнять git clean, это отменит незафиксированные изменения, но сохранит все неотслеживаемые или добавленные файлы. Но это может повлиять на результат сборки, поскольку некоторые неотслеживаемые файлы могут создавать помехи. Например, что если ваш каталог .idea поврежден?
Mvp

git resetговорит мне, что у меня есть изменения, которые нужно сохранить
Даниэль Спрингер,

1
Бег git clean -fdxудалил мой node_modulesи .env, отлично
fires3as0n

1
@ fires3as0n Что еще ты ожидал? Это должно было случиться. В ответе тоже есть предупреждение.
Ришав

148

Если вы хотите « отменить » все незафиксированные изменения, просто запустите:

git stash
git stash drop

Если у вас есть неотслеживаемые файлы (проверьте, запустив git status), их можно удалить, запустив:

git clean -fdx

git stashсоздает новый тайник, который станет тайником @ {0} . Если вы хотите проверить сначала, вы можете запустить, git stash listчтобы увидеть список ваших тайников. Это будет выглядеть примерно так:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Каждый тайник назван в честь предыдущего сообщения коммита.


2
Действительно, хорошее решение, но вам нужно внести изменения, используя git add .раньше, git stashпотому что оно показывало мне незафиксированные изменения даже послеgit stash
EresDev


12

Я использую дерево исходников .... Вы можете отменить все незафиксированные изменения, выполнив 2 простых шага:

1) просто нужно сбросить статус файла рабочей области

введите описание изображения здесь 2) выберите все нестандартные файлы (команда + a), щелкните правой кнопкой мыши и выберите удалить

введите описание изображения здесь

Это так просто: D


Если вы сбросите, а затем измените ветвь и перебазируете на сброшенной ветке, это повредит. Сброс полезен, но не должен использоваться для отбрасывания незафиксированных изменений. В случае сброса незафиксированных изменений просто спрятать тайник.
Дину Николае

11

Что я делаю

git add . (adding everything)
git stash 
git stash drop

Один лайнер: git add . && git stash && git stash drop


это лучшее
Madrugada

7

Для тех, кто достиг здесь поиска, если они могли отменить git clean -f -d, с помощью которого был создан файл, созданный в Eclipse ,

Вы можете сделать то же самое из пользовательского интерфейса, используя «восстановление из локальной истории» для ссылки: Восстановление из локальной истории


3
Я не голосовал против, однако ваш ответ менее чем ясен в ваших намерениях; было бы полезно, если бы вы перефразировали первое предложение в ответе.
Марк Шультхайс

5

Государства, переходящие с одного коммита на новый коммит

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Действие для перехода состояния

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Проверьте разницу

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Возврат к последнему коммиту

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Эквивалент git clone, без повторной загрузки

git reset && git checkout . && git clean -fdx

Я не понимаю, как это относится к задаваемому вопросу. Это просто серия странных рецептов, без каких-либо реальных веществ.
MVP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.