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

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

41 ответ

Решение

Другой более быстрый способ:

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

Вам не нужно включать --include-untracked если вы не хотите быть тщательным об этом.

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

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

git checkout -- .

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

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

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

Кажется, что полное решение:

git clean -df
git checkout -- .

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

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

git checkout .

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

git checkout-index -a -f
git clean -df

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

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

-f: Сила (может быть необязательна в зависимости от clean.requireForce установка)

Бежать git help clean чтобы увидеть руководство

Обновление 2019

git restoreбыл представлен в июле 2019 года и выпущен в версии 2.23 Git как часть разделенияgit checkout команда (git restore для файлов и git switch для филиалов).

git checkout по-прежнему ведет себя так же, как и раньше, и все предыдущие ответы по-прежнему полностью действительны, но при запуске git status с неустановленными изменениями в рабочем дереве Git предлагает использовать git restore <file> чтобы отменить эти изменения (вместо git checkout -- <file> как это было до v2.23).

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

git restore <file>

Чтобы отменить все неустановленные изменения в отслеживаемых файлах в текущем каталоге (это рекурсивно), вы можете запустить:

git restore .

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

Обратите внимание, что, как и в случае с git checkout -- .(как указал Мариуш Новак), это приведет к отмене изменений только в файлах, отслеживаемых Git, и не приведет к отмене каких-либо новых неотслеживаемых файлов. Если вы хотите отменить любые неустановленные изменения, включая новые неотслеживаемые файлы, вы можете запустить дополнительный:

git clean -df

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


Примечание о git restore: поскольку это новая команда, на ее странице руководства выдается предупреждение:

Это экспериментальная команда. Поведение может измениться.

Так что вполне возможно, что этот ответ может устареть, если поведение действительно изменится в будущем. Таким образом, было бы разумно запустить быстрыйman git-restore перед его использованием.

Мой любимый

git checkout -p

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

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

git add -p

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

git clean -dfx
git checkout .

Это текст интерактивной справки для использованных git clean опции:

-d

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

-f

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

-x

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

Также, git checkout . нужно сделать в корне репо.

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

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

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

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

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

git stash
  • Все изменения будут перенесены в Git's Stash для последующего доступа.
  • Несколько вариантов доступны для более детального хранения; см. документацию

Самый простой способ сделать это с помощью этой команды:

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

git checkout -- .

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

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

git stash -u

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

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

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

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

    git checkout -- foo.txt

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

    git reset -- foo.txt

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

Посмотрите на статью выше для дальнейших советов.

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

git diff | git apply --reverse

По мере ввода состояния git (используйте "git checkout -..." для отмены изменений в рабочем каталоге).

например git checkout -- .

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

git add .
git stash

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

git stash drop

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

ОБНОВИТЬ

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

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

без -A удаленные файлы не будут поставлены

git checkout -f


man git-checkout:

-f, --force

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

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

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

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

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

git add --all

Затем я

git fetch --all

Потом я сбрасываю на источник

git reset --hard origin/branchname

Это вернет его на круги своя. Точно так же, как повторное клонирование ветки, пока все мои gitignored файлы хранятся локально и на месте.

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

git reset --hard @{u}

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

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

Git reset --hard -> Отменить все навсегда

git stash -> Отменить все локальные изменения, но сохранить их на потом

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

git stash -u

Готово. Легко.

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

git checkout -- .
git clean -df

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

Просто скажи

git stash

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

git stash apply 

или Git Stash поп

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

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

git reset --hard <commit hash>

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

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

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

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

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

Окончательный рабочий раствор

      git restore .
git clean -f   
git clean -df (if you have folders in your local changes)

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

git clean -df

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

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

Описание

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

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

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

Опции

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

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

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

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

      git checkout .

Это отменит любые незафиксированные изменения в ветке. Он не сбросит его обратно, если были зафиксированы какие-либо изменения. Это удобно, когда вы внесли какие-то изменения и решили, что по какой-то причине они вам не нужны, и вы НЕ зафиксировали эти изменения. На самом деле он просто снова проверяет ветку и отбрасывает все текущие незафиксированные изменения.

(должно быть в корневом или домашнем каталоге приложения, чтобы это работало)

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

git update-index --assume-unchanged file_to_ignore

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

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

Другие вопросы по тегам