Как отменить неустановленные изменения в Git?

Как мне отменить изменения в моей рабочей копии, которых нет в индексе?


person readonly    schedule 09.09.2008    source источник
comment
См. Также stackoverflow.com/questions / 22620393 /   -  person Cees Timmerman    schedule 04.02.2016
comment
git-clean удаляет только неотслеживаемые файлы из рабочего дерева git-scm.com/docs/git-clean   -  person Yega    schedule 15.09.2016
comment
Чтобы прояснить комментарий Asenar выше, git-clean -df может быть опасным. Он удалит локальные неотслеживаемые файлы (например, покрытые .gitignore). Внимательно прочтите все ниже и подумайте о git checkout. вместо   -  person jacanterbury    schedule 07.10.2016
comment
'git clean -df' Будьте осторожны! Я попробовал это и потерял ключевые папки, которые невозможно восстановить ... Ой!   -  person Gabe Karkanis    schedule 28.10.2016
comment
нажатие git status дает подсказку, как это сделать! git checkout -- .   -  person Paulo    schedule 21.12.2017
comment
В git gui есть функция, которая безопасно отменяет изменения. Эта программа почитает .gitignore, тогда как git-clean вообще не использует его.   -  person wheredidthatnamecomefrom    schedule 13.01.2018
comment
@Readonly Я думаю, вопрос должен заключаться в следующем: как отменить неустановленные изменения в рабочем дереве? Потому что вы можете отключить изменения в промежуточной области с помощью git reset HEAD file1, который перезаписывает file1 из самой последней фиксации в истории фиксации. В промежуточную область.   -  person overexchange    schedule 17.01.2019
comment
Думаю, надо поменять или вопрос, или название. Название не совпадает с заданным вопросом, неясно, охватывают ли ответы оба вопроса.   -  person Josh C    schedule 14.10.2019


Ответы (36)


Еще один более быстрый способ:

git stash save --keep-index --include-untracked

Вам не нужно включать --include-untracked, если вы не хотите вдаваться в подробности.

После этого вы можете сбросить этот тайник с помощью команды git stash drop, если хотите.

person Greg Hewgill    schedule 09.09.2008
comment
И чтобы быть внимательным к этому, вам также понадобится --include-untracked. - person T.J. Crowder; 23.03.2015
comment
Я думаю, что лучше использовать git reset --hard, если вы не хотите отслеживать изменения - person Karim Samir; 12.04.2015
comment
@KarimSamir: Вопрос конкретно касается изменений, которых нет в индексе. Команда git reset также отменяет изменения в индексе. - person Greg Hewgill; 12.04.2015
comment
git checkout -. намного быстрее - person Frank; 17.04.2015
comment
Ни git stash, ни какие-либо другие git checkout не отменяют неустановленные удаления. Согласно выводу git status, правильный ответ здесь - это некоторый вкус git reset HEAD - person Chris Warth; 28.05.2015
comment
Это загрязняет стек тайника. git checkout -- . выполняет работу только с помощью одной команды. - person Felipe Tonello; 09.09.2015
comment
@FelipeTonello Я хотел бы дать вам 100 репутации за этот комментарий. В моем тесте это выглядело именно так, как я хотел. Вместо этого я провел последний час, используя git checkout - * и работая над всеми неотслеживаемыми ошибками файлов. - person Buttle Butkus; 11.12.2015
comment
@ T.J.Crowder Как вообще Git знает, как вернуть неотслеживаемый файл? Он его просто удаляет? - person Nathan Arthur; 05.04.2016
comment
@NathanArthur: Верно. Git помещает неотслеживаемый файл в тайник, а затем удаляет его из рабочего дерева. При восстановлении тайника неотслеживаемый файл копируется в рабочее дерево, поэтому он снова отображается как новый неотслеживаемый файл. - person T.J. Crowder; 06.04.2016
comment
@ChrisWarth - git checkout - у меня не работает. Статус Git по-прежнему показывает неотслеживаемые изменения. - person HelloWorldNoMore; 09.05.2016
comment
Как мы можем сделать то же самое с помощью Source Tree? - person Mohammad Fareed; 14.06.2016
comment
git checkout - файл - person sunlover3; 30.06.2016
comment
В том же духе, что и этот ответ, если вы не хотите загрязнять тайник, вы можете просто создать новую ветку, вернуться к исходной ветке, выполнить сброс, а затем удалить вновь созданную ветку. - person Jonn; 12.08.2016
comment
Вы можете создать псевдоним для stash save --keep-index --include-untracked и использовать тайник как корзину, чтобы вы всегда могли легко восстановить свои изменения, если их очистка была ошибкой. - person Wojtek Owczarczyk; 07.09.2016
comment
@ T.J.Crowder Предупреждение, это приведет к безвозвратному удалению ваших файлов, если в вашем файле gitignore есть записи каталога / *. См. Этот пост: stackoverflow.com / questions / 835501 / - person ADJenks; 30.06.2017
comment
Однажды я потерял кучу вещей из-за этого. Тайник не отслеживается. - person ADJenks; 30.06.2017
comment
git clean имеет возможность пробного прогона, -n - person Justin Reeves; 06.06.2018
comment
Параметр save устарел в пользу git stash push. Он отличается от stash push тем, что не может принимать пути, а любые аргументы, не являющиеся опциями, формируют сообщение. git-scm.com - person negas; 13.03.2019
comment
@WojtekOwczarczyk Итак, после использования stash save --keep-index --include-untracked: как вы восстановите изменения, если поймете, что очистка была ошибкой? - person Max; 11.04.2019
comment
git stash save && git stash drop непригоден для использования в качестве общего сценария, поскольку он не будет работать (или делать неприятные вещи), если нечего хранить (и может потерять тайник, который вы, возможно, хотели сохранить). git checkout-index -afq && git clean -fdqx это настоящая сделка! - person jlh; 22.01.2021
comment
Это сработало для меня лучше всего, так как при необходимости я могу вернуть свои изменения. - person Hritik; 19.03.2021

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

git checkout -- .

Для конкретного файла используйте:

git checkout -- path/to/file/to/revert

-- здесь, чтобы устранить двусмысленность (это известно как устранение неоднозначности аргумента).

Начиная с Git 2.23, можно использовать более конкретный

git restore .

соотв.

git restore path/to/file/to/revert

который вместе с git switch заменяет перегруженный git checkout (см. здесь), и таким образом устраняет неоднозначность аргумента.

person Tobi    schedule 09.09.2008
comment
Кажется, это канонический способ git. т.е. именно то, что git говорит вам делать, если вы набираете git status - person ABMagil; 18.08.2014
comment
Не работает, если есть неотслеживаемые файлы. Git говорит error: The following untracked working tree files would be overwritten by checkout: .... - person Michael Iles; 24.08.2014
comment
вопрос новичка, что делает git checkout -. значит семантически? - person kaid; 07.09.2014
comment
Майкл: начните с git clean -df, чтобы сначала удалить все неотслеживаемые файлы, как это было предложено в ответе Мариуша выше. - person Godsmith; 26.09.2014
comment
@Ninjack git checkout -- . означает то же самое, что и git checkout ., за исключением того, что вы явно указываете тот факт, что вы не указываете имя ветки. Они оба говорят проверить версию HEAD в ветке, в которой я сейчас работаю '.' или './'. Если вы делаете git checkout branch-name directory-or-file-name в целом, вы получаете HEAD-версию directory-or-file-name в ветке branch-name. - person akgill; 29.10.2014
comment
git checkout . короче - person Marc-André Lafortune; 06.11.2014
comment
IMO это предложение не обрабатывает удаления, в то время как вариант тайника. - person Martin Dvorak; 24.11.2014
comment
git checkout path / to / file / to / revert, что я должен добавить, если я нахожусь в ветке, и хочу, чтобы содержимое файла было заменено последней версией этого файла в ветке. - person Alexey Tigarev; 17.12.2014
comment
IMO этот вариант несовершенный, так как он не обрабатывает ситуацию, когда ваш измененный репозиторий не находится в ревизии HEAD на момент очистки изменений, и вы НЕ хотите обновлять его до HEAD, а хотите просто очистить изменения. - person alexykot; 05.01.2015
comment
Обновление @alexykot до HEAD означает очистку от изменений. HEAD - это ревизия, которая в настоящее время проверена. - person Xandaros; 31.03.2015
comment
да, действительно, у меня плохо. Однако git checkout HEAD фактически не отменяет для меня изменения, поэтому решение на основе stash по-прежнему является предпочтительным. - person alexykot; 01.04.2015
comment
@alexykot: вы должны указать путь с git checkout, иначе он не уничтожит сделанные вами изменения! Уловка с . заключается в том, что проверка с путем также включает все подкаталоги. - person Robert Siemer; 19.04.2015
comment
Я делаю это и получаю предупреждения о несоединенных файлах. Как мне отбросить эти не объединенные файлы? - person Erel Segal-Halevi; 19.05.2015
comment
Это приведет к отмене изменений только в существующих файлах. Он не отбрасывает новые файлы, которые вы добавили с момента последней фиксации. - person AndroidDev; 07.06.2015
comment
Интересно. По какой-то причине это не работает в подмодуле. Это просто сводило меня с ума! Я был НЕОБХОДИМ, что git clean -- . должен делать то, что я хотел. Прочитав этот ответ и протестировав его, мы подтвердили это. Но почему-то НЕ РАБОТАЕТ В ПОДМОДУЛЯХ! Почему нет? <вздох> - person Ted Middleton; 14.07.2015
comment
Я предпочитаю решение git stash save --keep-index, потому что оно создает фиксацию. Даже если я сделаю git stash drop сразу после stash save, фиксацию все равно можно будет восстановить. Так что решение git stash save ... безопаснее на тот случай, если вы выбросили слишком много. Например. используя stackoverflow.com/questions/89332/recover-dropped- stash-in-git - person René Link; 17.07.2015
comment
Хотя это кажется очевидным, я думаю, стоит отметить, что эту команду следует запускать из каталога верхнего уровня репозитория, поскольку она очищает только текущий рабочий каталог. - person Michał Trybus; 19.08.2015
comment
Вот сценарий, в котором git checkout -. работал хорошо: я перенес репозиторий из Cygwin в Linux через USB-накопитель в формате FAT. После переноса данных в Linux, git status и git diff показали признаки многих изменений прав доступа к файлам. Были также некоторые другие файлы (заметки и прочее). Я использовал git checkout -. чтобы отменить изменения прав доступа к файлу. Теперь git diff чистый, а статус git показывает только несколько добавленных файлов. Чистый шаг из другого ответа был бы полезен, если бы я хотел избавиться от неотслеживаемых файлов. - person cardiff space man; 15.09.2015
comment
Всегда ли лучше использовать двойное тире git checkout -- path/to/file/to/revert? - person Frozen Flame; 10.12.2015
comment
@ MichałTrybus, чтобы очистить весь репозиторий независимо от того, где вы в нем находитесь, вы можете использовать git checkout -- :/ (я сам искал это!) - person waldyrious; 04.04.2016
comment
Я очень смущен, это (git checkout -.) Просто не работает. У меня все еще есть все мои файлы изменений (неустановленные). - person PandaWood; 24.05.2016
comment
Странный PandaWood. Я просто использовал это решение, и оно сделало именно то, что я хотел. - person Wylliam Judd; 23.07.2016
comment
Предположим, я внес изменения в файл A (state1), и файл был изменен на Master (state2). Если я сделаю git checkout A, на какое состояние он будет указывать сейчас, предыдущее состояние1 или обновленное состояние2 .. ?? - person Bhavuk Mathur; 18.10.2016
comment
На основании информации из других источников и личного эксперимента git checkout -. Учитывает перезапись файлов только в том случае, если соответствующий файл уже существует в индексе. @MichaelIles Мне кажется, что файлы, вызывающие у вас проблемы, должны были иметь зарегистрированные версии где-то еще. - person Cris P; 27.02.2018
comment
Это удаляет все незафиксированные изменения. Если я хочу удалить только изменения, внесенные после git add <filename>? - person Khaino; 27.02.2019
comment
@ABMagil: теперь есть новая команда: git restore, и это та, которую теперь дает git status. См. Мое обновление 2019 г. - person prosoitos; 11.09.2019
comment
Чтобы вернуть всю подпапку, это хорошо работает для меня git checkout -f -- path/to/revert/ , тогда как это НЕ работает git checkout -f -- path/to/revert/*, поскольку в новых файлах git нет записи. - person Shane; 20.05.2020
comment
У меня были только неустановленные изменения и git checkout -. работал у меня. Спасибо. - person Rajkumar M; 13.07.2021

Похоже, полное решение:

git clean -df
git checkout -- .

git clean удаляет все неотслеживаемые файлы (предупреждение: пока он выиграл » t удаляет игнорируемые файлы, упомянутые непосредственно в .gitignore, может удалять игнорируемые файлы, находящиеся в папках) и git checkout удаляет все неустановленные изменения.

person Mariusz Nowak    schedule 29.08.2012
comment
Два других ответа на самом деле не работают, а этот. - person John Hunt; 01.09.2014
comment
по какой-то причине это вернулось к предыдущей фиксации - person dval; 01.10.2014
comment
@dval это потому, что первая команда удалила неиндексированные файлы, а вторая удалила неустановленные изменения (индексированных файлов). Поэтому, если у вас не было никаких поэтапных изменений, это то же самое, что вернуться к последней фиксации с помощью git reset --hard - person Amanuel Nega; 31.10.2014
comment
используйте -dff, если неотслеживаемый каталог является клоном git. - person accuya; 16.12.2014
comment
Как понять эту команду? -- .? Говорит ли о проверке текущей последней фиксации в текущей папке? - person Evan Hu; 18.01.2015
comment
Будьте осторожны, выполняя git clean -df. Если вы не понимаете, что он делает, возможно, вы удаляете файлы, которые хотите сохранить, например robots.txt, загруженные файлы и т. Д. - person ctlockey; 28.01.2015
comment
Как сказал @ctlockey, первая команда также удаляет каталоги, если они состоят только из игнорируемых файлов ... В моем проекте потеряна целая куча файлов конфигурации :( Будьте осторожны. - person Maxime Lorant; 16.07.2015
comment
На самом деле это правильный ответ. stash and checkout применяется только для поэтапных изменений. git clean подойдет - person Junchao Gu; 01.10.2015
comment
@ctlockey, если они есть в вашем репозитории, у вас большие проблемы. - person rightfold; 28.12.2015
comment
Два приведенных выше ответа не работают для неустановленных изменений, только этот. - person Michael IV; 16.05.2016
comment
Я подозреваю, что это работает там, где другие не работают, возможно, потому что в моем случае я удалил не только файлы, но и папки. - person Goose; 13.06.2016
comment
Эрорг !!! Я только что удалил папки проекта с помощью git clean -df? Как мне вернуть это? Пожалуйста помоги!!!! Я сделал команду ls, и я не вижу другую папку, которую я не собирался удалять - person user2441441; 29.07.2016
comment
@ user2441441: вам не повезло: вы очистили файлы, которые не находились под контролем версий. Важные файлы должны всегда находиться под контролем версий (не обязательно как часть репозитория, в котором они находятся: вы можете поместить их в другой частный репозиторий и создать на них символическую ссылку). И файлы, которые находятся в рабочем каталоге репо, но не в версии, контролируемой этим репо, всегда должны быть .gitignored . - person leftaroundabout; 16.09.2016
comment
Я использую эти команды в течение многих лет. есть случай, когда ни один из них не работает. он просто продолжает говорить об изменениях, не предназначенных для фиксации, и перечисляет одни и те же файлы. нет никаких ошибок, когда я убираю или оформляю заказ! - person Sonic Soul; 29.11.2016
comment
Вы должны находиться в корне репозитория git, чтобы это работало правильно. - person bejado; 03.06.2017
comment
Проголосовали против, так как это может удалить ваши файлы. Не надежное решение. - person Footniko; 02.03.2018
comment
Чтобы понять и привыкнуть, как работает git -df, я рекомендую добавить параметр n, если вы все еще новичок в выполнении команды, то есть git -dfn. Это запустит его в dry-run режиме, чтобы вы могли видеть, что будет удалено, без фактического удаления и каких-либо действий. Если вас устраивает результат, вы можете запустить его снова без опции n. - person Dan; 11.03.2019
comment
@Footniko, удаление неотслеживаемых файлов может быть частью желаемого поведения, в зависимости от того, что подразумевается под изменениями только для чтения. - person Keith Russell; 03.06.2019
comment
иногда нам нужно сохранить тестовые файлы, поэтому это решение опасно, мы вообще не хотим хранить в тайнике, и нам просто нужно, чтобы мы избегали команды stash для извлечения данных. - person wui; 13.02.2020
comment
Хорошее объяснение git clean, вариантов и использования: atlassian.com/git/ учебники / отмена-изменения / git-clean - person Ambareesh; 08.09.2020
comment
Один из моих любимых ответов на SO, к которому я возвращаюсь. Как и в случае с упомянутыми выше некоторыми комментаторами, всему есть свое время и место. Мой лучший вариант использования для этого заключается в том, что я только что отправил рабочую версию на пульт, и теперь я начал работать над чем-то, что не должно увидеть свет, и я просто хочу вернуться к предыдущей версии и не возражать против всех изменения (файлы / каталоги) удаляются. - person Shawn Frank; 06.03.2021
comment
Этот ответ был ключевой частью моего ответа на Почему git не может выполнять жесткий / мягкий сброс по пути? / Как сделать git _1 _ / _ 2_ сбрасывает по пути. - person Gabriel Staples; 09.03.2021
comment
Обновление: git clean -df и git checkout-index -fa намного лучше. Я думаю, что git checkout-index -fa дает более желаемый результат, чем git checkout -- .. Я добавил эти команды с подробными пояснениями к своему ответу здесь: Используя git, как сбросить рабочее дерево (локальная файловая система state) в состояние индекса («поэтапные» файлы)?. - person Gabriel Staples; 11.03.2021

Это проверяет текущий индекс для текущего каталога, отбрасывая все изменения в файлах из текущего каталога вниз.

git checkout .

или это, которое проверяет все файлы из индекса, перезаписывая файлы рабочего дерева.

git checkout-index -a -f
person CB Bailey    schedule 20.06.2009
comment
+1 Это ПРАВИЛЬНЫЙ ОТВЕТ, поскольку он правильно обрабатывает случай, когда в некоторых файлах есть как поэтапные , так и неэтапные изменения. Обратите внимание, что это решение ОТКАЗЫВАЕТ неустановленные изменения; если вы хотите сохранить их, вам следует использовать ответ @ greg-hewgill git stash save --keep-index. - person Rhubbarb; 15.06.2015
comment
git checkout -- не работает, если у вас только одна ветка. git checkout . всегда работает. - person Ed Bayiates; 29.06.2018
comment
Большое спасибо! Наконец ответ, который ВСЕГДА работает! Это можно комбинировать с git clean, чтобы также удалить неотслеживаемые файлы. - person jlh; 22.01.2021

git clean -df

Очищает рабочее дерево, рекурсивно удаляя файлы, не находящиеся под контролем версий, начиная с текущего каталога.

-d: Удалять неотслеживаемые каталоги в дополнение к неотслеживаемым файлам

-f: Force (может не понадобиться в зависимости от настройки clean.requireForce)

Запустите git help clean, чтобы просмотреть руководство

person E Ciotti    schedule 07.12.2011
comment
почему за этот ответ проголосовали не все? ответил еще в 2011 году и до сих пор правильно. - person Eugene Braginets; 01.03.2018

Обновление 2019

Теперь вы можете отменить неустановленные изменения в одном отслеживаемом файле с помощью:

git restore <file>

и в всех отслеживаемых файлах в текущем каталоге (рекурсивно) с помощью:

git restore .

Если вы запустите последний из корня репозитория, он отменит неустановленные изменения во всех отслеживаемых файлах в проекте.

Примечания

  • git restore был представлен в июле 2019 и выпущен в версии 2.23 как часть git checkout в git restore для файлов и в git switch для веток.
  • git checkout по-прежнему ведет себя как раньше, и более старые ответы остаются совершенно верными.
  • При запуске git status с неустановленными изменениями в рабочем дереве теперь Git предлагает использовать именно это, чтобы отменить их (вместо git checkout -- <file>, как это было до v2.23).
  • Как и в случае с git checkout -- ., это отменяет только изменения в отслеживаемых файлах. Таким образом, ответ Мариуша Новака все еще применяется, и если вы хотите отменить все неустановленные изменения, включая неотслеживаемые файлы, вы можете запустить, поскольку он предлагает дополнительный git clean -df.
person prosoitos    schedule 11.09.2019
comment
Я хотел отменить только мои неустановленные изменения, не затрагивая вновь добавленные файлы, поэтому git restore . работал отлично. Спасибо. - person Saurabh Misra; 02.12.2019
comment
Я сделал git restore <filename>, и он отлично сработал. - person Merlin; 14.01.2020
comment
У меня сработало нормально. - person Hashim Aziz; 12.03.2020
comment
Согласно странице руководства git restore . восстанавливает все файлы в текущем каталоге, а не во всем репозитории. - person jarno; 22.05.2020
comment
Ты прав. Спасибо! Я только что проверил, и это действительно так. Однако он рекурсивен. Таким образом, при запуске из корня проекта он применяется ко всему репозиторию. Отредактирую свой ответ. - person prosoitos; 22.05.2020
comment
comment
Спасибо @Tycholiz. В то время, когда был задан вопрос и принят ответ, этой новой команды не существовало :) Так что логично, что это не принятый ответ :) - person prosoitos; 20.09.2020
comment
Должен быть принятый ответ в 2020 году! - person Colin McDonnell; 13.12.2020
comment
Спасибо! Это меняет жизнь. Я раньше делал git commit -m "wip" && git reset --hard && git reset --soft HEAD~1 && git reset. - person Alexandre Gomes; 12.02.2021

Мой любимый

git checkout -p

Это позволяет выборочно возвращать фрагменты.

Смотрите также:

git add -p
person Ben    schedule 10.10.2014
comment
Мне нравится возможность увидеть реальное изменение, прежде чем оно будет отброшено. - person Penghe Geng; 04.02.2015
comment
Это то, что я использую. git checkout -p, а затем a, чтобы принять все. - person Mattis; 24.04.2015
comment
Я никогда не думал об этом. Это -p добавляет хороший дополнительный уровень безопасности. Объедините его с git clean -d, чтобы ответить на OP. - person Stephan Henningsen; 27.04.2016

Поскольку ни один ответ не предлагает точную комбинацию опций, которую я использую, вот она:

git clean -dxn .  # dry-run to inspect the list of files-to-be-removed
git clean -dxf .  # REMOVE ignored/untracked files (in the current directory)
git checkout -- . # ERASE changes in tracked files (in the current directory)

Это текст интерактивной справки по используемым git clean параметрам:

-d

Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим репозиторием Git, он не удаляется по умолчанию. Дважды используйте параметр -f, если вы действительно хотите удалить такой каталог.

-x

Не используйте стандартные правила игнорирования, считываемые из .gitignore (для каждого каталога) и $GIT_DIR/info/exclude, но все же используйте правила игнорирования, указанные с параметрами -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это можно использовать (возможно, вместе с git reset) для создания нетронутого рабочего каталога для тестирования чистой сборки.

-n

На самом деле ничего не удаляйте, просто покажите, что будет сделано.

-f

Если для переменной конфигурации Git clean.requireForce не задано значение false, Git clean откажется удалять файлы или каталоги, если не указано -f, -n или -i. Git откажется удалять каталоги в подкаталоге или файле .git, если не указан второй -f.

person Martin G    schedule 28.04.2016
comment
+1 за это решение. Что касается вашего замечания, что git checkout. нужно сделать в корне репо, возможно, вы могли бы упомянуть, что вместо этого мы можем просто сделать git reset --hard? (что на самом деле эквивалентно git reset --hard HEAD и должно работать независимо от текущего каталога ...) - person ErikMD; 15.01.2018
comment
Также в отношении первой команды git clean -dfx, вот совет, который я использую, чтобы быть в безопасности перед ее запуском: просто запустите git clean -d -x -n раньше, чтобы отобразить список файлов, которые необходимо удалить, затем подтвердите операцию, запустив git clean -d -x -f (I поместите аргумент -n или -f в конце, чтобы иметь возможность быстро изменить его в терминале) - person ErikMD; 15.01.2018
comment
Обратите внимание, что это необратимо, и если у вас есть файлы в .gitignore, вы потеряете их. Поэтому подумайте о резервном копировании вашего проекта перед этим. - person Rob; 03.04.2018
comment
@MartinG Я просто воспользовался возможностью включить свои два предложений, включая одно который добавляет этап пробного прогона (лучше перестраховаться, чем потом сожалеть!). В любом случае, не стесняйтесь вносить поправки в мою правку, если это необходимо! - person ErikMD; 26.06.2020

Если вы просто хотите удалить изменения в существующих файлах, используйте checkout (задокументировано здесь).

git checkout -- .
  • Ветвь не указана, поэтому проверяется текущая ветка.
  • Двойной дефис (--) сообщает Git, что следующее следует рассматривать как его второй аргумент (путь), что вы пропустили указание ветки.
  • Точка (.) указывает все пути.

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

git clean -i 
  • Параметр -i запускает интерактивное clean, чтобы предотвратить ошибочное удаление.
  • Несколько других вариантов доступны для более быстрого выполнения; см. документацию.

Если вы хотите переместить изменения в пространство хранения для последующего доступа, используйте stash (задокументировано здесь):

git stash
  • Все изменения будут перемещены в Git's Stash для возможного последующего доступа.
  • Несколько вариантов доступны для более тонкого хранения; см. документацию.
person 2540625    schedule 18.03.2018
comment
Это точно преобразует ваши изменения и отбросит новые добавленные файлы из предыдущей фиксации. - person Yohan Chung; 21.02.2019
comment
удалит ли только что добавленные файлы? или просто отменить изменения в старых неустановленных файлах? - person KawaiKx; 09.11.2020

Я действительно нашел эту статью полезной для объяснения, когда какую команду использовать: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Есть несколько разных случаев:

  1. Если вы не поставили файл, используйте git checkout. Checkout «обновляет файлы в рабочем дереве, чтобы они соответствовали версии в индексе». Если файлы не были добавлены в индекс (иначе говоря, добавлены в индекс) ... эта команда по существу вернет файлы к тому, что было вашей последней фиксацией.

    git checkout -- foo.txt

  2. Если вы поставили файл, используйте git reset. Сброс изменяет индекс в соответствии с фиксацией.

    git reset -- foo.txt

Я подозреваю, что использование git stash - популярный выбор, поскольку он немного менее опасен. Вы всегда можете вернуться к нему, если случайно выбросите слишком много при использовании git reset. По умолчанию сброс выполняется рекурсивно.

Взгляните на статью выше для получения дополнительных советов.

person blak3r    schedule 13.08.2012

Самый простой способ сделать это - использовать эту команду:

Эта команда используется для отмены изменений в рабочем каталоге -

git checkout -- .

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

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

git stash -u

http://git-scm.com/docs/git-stash

person A H M Forhadul Islam    schedule 12.04.2017
comment
Дважды я приходил сюда, читал этот ответ и забывал . в конце. Для будущего меня: период необходим! - person bejado; 16.06.2017
comment
Мне нужно было избавиться от всех локальных изменений в подкаталоге, не отменяя всех остальных изменений. Этот ответ очень помог, спасибо - person Ally; 07.09.2017
comment
Пожалуйста, опишите, что делают две команды. Отсутствие объяснения действительно бесполезно. - person Chris Kennedy; 09.09.2017
comment
превосходно. касса делает за одну команду то, что самая популярная - за две. также может сопровождаться git clean -fd, чтобы очистить файлы не в индексе. - person oligofren; 28.11.2017

Если вы не заинтересованы в сохранении неустановленных изменений (особенно если поэтапные изменения - это новые файлы), я нашел это удобным:

git diff | git apply --reverse
person Joshua Kunzmann    schedule 28.07.2011

Когда вы вводите git status, отображается (используйте «git checkout - ...», чтобы отменить изменения в рабочем каталоге).

e.g. git checkout -- .

person Erdem ÖZDEMİR    schedule 17.05.2016
comment
Проголосовали против, потому что это не помогает быстро удалить все файлы. Три точки означают, что вам необходимо перечислить все файлы. Это особенно плохо, если вам нужно сразу выбросить кучу файлов, например. во время большого слияния после того, как вы поставили все модификации, которые хотите сохранить - person usr-local-ΕΨΗΕΛΩΝ; 09.06.2016
comment
Конечно, правильная команда - это git checkout -. единственная точка. В комментарии три точки были грамматическими, чтобы указать, что есть много других вариантов, которые можно было использовать. - person Josef.B; 20.09.2016

git checkout -f


man git-checkout:

-f, --force

При переключении ветвей продолжайте, даже если индекс или рабочее дерево отличается от HEAD. Это используется для удаления локальных изменений.

При проверке путей из индекса не допускайте сбоев при несоединенных записях; вместо этого не объединенные записи игнорируются.

person Bijan    schedule 17.05.2014
comment
Это отменит изменения в индексе !! (И OP требует оставить их как есть.) - person Robert Siemer; 19.04.2015

Вы можете использовать git stash - если что-то пойдет не так, вы все равно можете вернуться из тайника. Подобно другому ответу здесь, но этот также удаляет все неустановленные файлы, а также все неустановленные удаления:

git add .
git stash

Если вы проверите, что все в порядке, выбросьте тайник:

git stash drop

Ответ Билала Максуда с git clean также сработал для меня, но с тайником у меня больше контроля - если я сделаю что-то случайно, я все равно могу вернуть свои изменения

ОБНОВЛЕНИЕ

Я думаю, есть еще одно изменение (не знаю, почему это сработало для меня раньше):

git add . -A вместо git add .

без -A удаленные файлы не будут размещены

person Asped    schedule 11.09.2015

Вместо того, чтобы отменить изменения, я сбрасываю свой пульт в исходное состояние. Примечание. Этот метод предназначен для полного восстановления вашей папки до репо.

Поэтому я делаю это, чтобы убедиться, что они не сидят там, когда я git reset (позже - исключает gitignores в Origin / branchname)

ПРИМЕЧАНИЕ. Если вы хотите сохранить файлы, которые еще не отслеживаются, но не в GITIGNORE, вы можете пропустить этот шаг, так как он сотрет эти неотслеживаемые файлы, которых нет в вашем удаленном репозитории (спасибо @XtrmJosh).

git add --all

Затем я

git fetch --all

Затем я возвращаюсь в исходное положение

git reset --hard origin/branchname

Это вернет все на круги своя. Точно так же, как ПОВТОРНОЕ Клонирование ветки, ПОКА все мои файлы с gitignored сохраняются локально и на месте.

Обновлено для каждого комментария пользователя ниже: Вариант для сброса на любую текущую ветку, в которой находится пользователь.

git reset --hard @{u}
person Nick    schedule 07.08.2015
comment
Это мой предпочтительный вариант, но почему вы сначала добавляете все изменения? Насколько мне известно, это просто изменяет список каталогов в файлах Git, а при использовании git reset --hard это все равно будет потеряно, а каталоги все равно будут удалены. - person XtrmJosh; 30.09.2015
comment
Я не использую mac или linux, github windows powershell иногда оставляет файлы там после сброса. Я думаю, это потому, что git reset устанавливает все файлы в репо в исходное состояние. Если они не добавлены, они не будут затронуты. Затем настольный клиент получит сообщение, что этот файл находится здесь, и его необходимо зафиксировать. - person Nick; 01.10.2015
comment
Смысл сделан. Я не использую Windows, поэтому не видел этой проблемы (по крайней мере, не использовал Windows последние несколько месяцев, мало что помню до этого - это одно огромное прискорбное размытие). Возможно, стоит отметить обоснование в вашем основном ответе :) - person XtrmJosh; 02.10.2015
comment
Я столкнулся с этой проблемой и на Mac. Если файл не отслеживается в репо, иногда git reset его не трогает. Я не могу действительно изолировать ПОЧЕМУ, но когда это произойдет, если я перезагружу, и у меня все еще есть один или два незафиксированных файла, я добавляю --all и снова сбрасываю --hard - person Nick; 19.11.2015
comment
Если вы не зафиксировали или не поставили новый файл, git полностью его игнорирует и не трогает. Он не хочет случайно удалять то, что вам может понадобиться. Вы можете увидеть здесь на --untracked-files[=<mode>], что неотслеживаемые файлы по умолчанию отображаются в git status, и вы могу сказать, чтобы не показывать им, если это вас беспокоит! Для записи git add --all подготовит файлы к фиксации, после чего git распознает их (следовательно, git reset --hard будет работать). git clean удаляет неотслеживаемые файлы см. Здесь - person XtrmJosh; 19.11.2015
comment
Спасибо - так что в основном, если вы git add --all, вы можете сбросить, или вам нужно git add --all, тогда получите чистый Guess clean - это на несколько символов меньше;) - person Nick; 21.11.2015
comment
В значительной степени, хотя, если остались неотслеживаемые файлы, я обычно оставляю их в покое. Паранойя и все такое, заставляет меня думать, что я что-нибудь сломаю: D - person XtrmJosh; 22.11.2015
comment
Мне нравится небольшой приятный вариант - git reset --hard @{u}, который сбрасывает ветвь туда, где находится текущая ветка удаленного отслеживания. - person user2221343; 06.01.2016

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

Используйте git clean -f для удаления этих новых файлов - с осторожностью! Обратите внимание на параметр принудительного выполнения.

person artur    schedule 14.10.2011

Чтобы сделать безвозвратный сброс: git reset --hard

Чтобы сохранить изменения на потом: git stash

person SANGEETHA P.H.    schedule 03.07.2019

Просто используйте:

git stash -u

Выполнено. Легкий.

Если вы действительно заботитесь о своем стеке тайника, вы можете продолжить с git stash drop. Но в этот момент вам лучше использовать (от Мариуша Новака):

git checkout -- .
git clean -df

Тем не менее, мне нравится git stash -u больше всего, потому что он «отбрасывает» все отслеживаемые и неотслеживаемые изменения всего одной командой. Однако git checkout -- . отбрасывает только отслеженные изменения, а git clean -df отбрасывает только неотслеживаемые изменения ... и ввод обеих команд далеко слишком трудоемок :)

person Ben Wilde    schedule 08.09.2016

просто скажи

git stash

Это удалит все ваши локальные изменения. Вы также можете использовать позже, сказав

git stash apply 

или git stash pop

person piyushmandovra    schedule 24.04.2015

у вас очень простая команда git git checkout .

person Khem Raj Regmi    schedule 27.08.2019

Это работает даже в каталогах, которые; за пределами обычных разрешений git.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Случилось со мной недавно

person GlassGhost    schedule 05.09.2013
comment
Однако помните, что игнорируемый git контент не сохранит исходные разрешения! Следовательно, это может вызвать угрозу безопасности. - person twicejr; 10.12.2014
comment
@twicejr Вы ошибаетесь, прочтите, пожалуйста, git help clean -d Удалять неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. - person GlassGhost; 11.12.2014
comment
Почему вы установили для всех файлов режим чтения и записи? Не лучшая практика. - person Ghoti; 28.09.2015
comment
@Ghoti мой плохой, 664 правильный? вы также можете редактировать ответ. - person GlassGhost; 28.09.2015
comment
Установка всех разрешений на 664 делает множество предположений о том, какие разрешения нужны проекту. Я думаю, что использование этой части команды вызовет проблемы у некоторых людей. - person ianrandmckenzie; 20.11.2018

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

git reset --hard <commit hash>

Это отменит все изменения, сделанные после этого коммита.

person msangel    schedule 05.02.2016
comment
Это также отбросит все в индексе (а не только то, что не в индексе), что выходит за рамки того, что запрашивает OP. - person Linus Arver; 08.07.2018

По моему мнению,

git clean -df

должен сделать свое дело. Согласно документации Git по git clean

git-clean - Удаляет неотслеживаемые файлы из рабочего дерева

Описание

Очищает рабочее дерево, рекурсивно удаляя файлы, не находящиеся под контролем версий, начиная с текущего каталога.

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

Если указаны какие-либо необязательные аргументы ..., затрагиваются только эти пути.

Параметры

-d Удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим репозиторием Git, он не удаляется по умолчанию. Дважды используйте параметр -f, если вы действительно хотите удалить такой каталог.

-f --force Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется запускаться, если не задано -f, -n или -i.

person Lahiru    schedule 14.07.2016

Другой способ избавиться от новых файлов, который является более конкретным, чем git clean -df (он позволит вам избавиться от некоторых файлов, не обязательно от всех), - сначала добавить новые файлы в индекс, затем спрятать, а затем отбросить тайник.

Этот метод полезен, когда по какой-то причине вы не можете легко удалить все неотслеживаемые файлы каким-либо обычным механизмом (например, rm).

person tjb    schedule 15.06.2012

То, что далее следует, на самом деле является решением только в том случае, если вы работаете с вилкой репозитория, где вы регулярно синхронизируете (например, запрос на перенос) с другим репо. Краткий ответ: удалите fork и refork, но прочтите предупреждения на github.

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

Мне часто приходилось получать такие сообщения о статусе git (включая как минимум 2/4 файла):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

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

Мне удалось решить проблему, удалив свой разветвленный репозиторий и все локальные репозитории, а также изменив структуру. Одного этого было недостаточно; upstream должен был переименовать файлы, о которых идет речь, на новые имена файлов. Если у вас нет незавершенной работы, нет вики и проблем, которые расходятся с исходным репозиторием, все будет в порядке. Апстрим может быть вами не очень доволен, мягко говоря. Что касается моей проблемы, это, несомненно, ошибка пользователя, поскольку я не настолько разбираюсь в git, но тот факт, что исправить это далеко не просто, указывает на проблему с git.

person bbarker    schedule 05.01.2014

У меня была странная ситуация, когда файл всегда не размещался, это помогает мне решить.

git rm .gitattributes
git add -A
git reset --hard

person SDV    schedule 08.02.2017

Если вы хотите передать тайник кому-то другому:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[править] как прокомментировано, можно называть тайники. Что ж, используйте это, если хотите поделиться своим кошельком;)

person twicejr    schedule 08.07.2013
comment
На самом деле у Git stash может быть заголовок. Например git stash save "Feature X work in progress". - person Colin D Bennett; 10.12.2014

Вы можете создать собственный псевдоним, описывающий, как это сделать.

Я использую следующий псевдоним, чтобы отменить изменения.


Отменить изменения в (списке) файлов в рабочем дереве

discard = checkout --

Затем вы можете использовать его как следующий, чтобы отменить все изменения:

discard .

Или просто файл:

discard filename

В противном случае, если вы хотите отменить все изменения, а также неотслеживаемые файлы, я использую сочетание проверки и очистки:

Очистить и отменить изменения и неотслеживаемые файлы в рабочем дереве

cleanout = !git clean -df && git checkout -- .

Таким образом, использование простое, как следующее:

cleanout

Теперь он доступен в следующем репозитории Github, который содержит множество псевдонимов:

person Pau    schedule 05.06.2017

Если у вас есть подмодуль и никакие другие решения не работают, попробуйте:

  • Чтобы проверить, в чем проблема (возможно, «грязный» случай), используйте:

    git diff

  • Чтобы удалить тайник

    git submodule update

person onalbi    schedule 01.10.2015

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

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

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

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

Таким образом, я просто выполняю фиксацию, сброс ветки и исправление последней фиксации.

person Ivan    schedule 20.03.2015

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

git update-index --assume-unchanged file_to_ignore

person Jesús Castro    schedule 31.07.2017

Ни одно из решений не работает, если вы просто изменили разрешения для файла (это в DOS / Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

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

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

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

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Единственный способ исправить это - вручную сбросить разрешения для измененных файлов:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff

person Malcolm Boekhoff    schedule 23.11.2015

Напоминаем, что в новых версиях git есть команда восстановления, которая также предлагается при вводе git status при изменении файлов:

(используйте git add ..., чтобы обновить то, что будет зафиксировано)

(используйте git restore ..., чтобы отменить изменения в рабочем каталоге)

Итак, git 'restore' - современное решение этой проблемы. Всегда полезно прочитать предложения от git после ввода git status :-)

person The Schwartz    schedule 18.09.2020
comment
Просто повторите stackoverflow.com/a/57880896/6309. - person VonC; 18.09.2020
comment
Конечно, просто констатирую очевидное и что git пытается помочь с комментариями из вызова 'git status' :-) - person The Schwartz; 21.09.2020

Просто используйте:

git stash -k -u

Это сохранит неустановленные изменения и неотслеживаемые файлы (новые файлы) и сохранит подготовленные файлы.

Это лучше, чем _2 _ / _ 3 _ / _ 4_, потому что вы можете захотеть их вернуть позже (до git stash pop). Лучше хранить их в тайнике, чем выбрасывать.

person Xaree Lee    schedule 23.12.2016

Если вы хотите восстановить неустановленные файлы, используйте git restore --staged.

person Fairoz    schedule 08.07.2021