Как мне отменить неустановленные изменения в 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://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Есть пара разных случаев:
Если вы не поставили файл, то вы используете
git checkout
, Оформить заказ "обновляет файлы в рабочем дереве в соответствии с версией в индексе". Если файлы не были размещены (или добавлены в индекс)... эта команда по существу вернет файлы к тому, что было вашим последним коммитом.git checkout -- foo.txt
Если вы создали файл, используйте 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 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