Как мне отменить изменения в моей рабочей копии, которых нет в индексе?
Как отменить неустановленные изменения в Git?
Ответы (36)
Еще один более быстрый способ:
git stash save --keep-index --include-untracked
Вам не нужно включать --include-untracked
, если вы не хотите вдаваться в подробности.
После этого вы можете сбросить этот тайник с помощью команды git stash drop
, если хотите.
--include-untracked
.
- person T.J. Crowder; 23.03.2015
git reset
также отменяет изменения в индексе.
- person Greg Hewgill; 12.04.2015
git stash
, ни какие-либо другие git checkout
не отменяют неустановленные удаления. Согласно выводу git status
, правильный ответ здесь - это некоторый вкус git reset HEAD
- person Chris Warth; 28.05.2015
git checkout -- .
выполняет работу только с помощью одной команды.
- person Felipe Tonello; 09.09.2015
stash save --keep-index --include-untracked
и использовать тайник как корзину, чтобы вы всегда могли легко восстановить свои изменения, если их очистка была ошибкой.
- person Wojtek Owczarczyk; 07.09.2016
git clean
имеет возможность пробного прогона, -n
- person Justin Reeves; 06.06.2018
save
устарел в пользу git stash push
. Он отличается от stash push тем, что не может принимать пути, а любые аргументы, не являющиеся опциями, формируют сообщение. git-scm.com
- person negas; 13.03.2019
stash save --keep-index --include-untracked
: как вы восстановите изменения, если поймете, что очистка была ошибкой?
- person Max; 11.04.2019
git stash save && git stash drop
непригоден для использования в качестве общего сценария, поскольку он не будет работать (или делать неприятные вещи), если нечего хранить (и может потерять тайник, который вы, возможно, хотели сохранить). git checkout-index -afq && git clean -fdqx
это настоящая сделка!
- person jlh; 22.01.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
(см. здесь), и таким образом устраняет неоднозначность аргумента.
git status
- person ABMagil; 18.08.2014
error: The following untracked working tree files would be overwritten by checkout: ...
.
- person Michael Iles; 24.08.2014
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
git checkout .
короче
- person Marc-André Lafortune; 06.11.2014
git checkout HEAD
фактически не отменяет для меня изменения, поэтому решение на основе stash
по-прежнему является предпочтительным.
- person alexykot; 01.04.2015
git checkout
, иначе он не уничтожит сделанные вами изменения! Уловка с .
заключается в том, что проверка с путем также включает все подкаталоги.
- person Robert Siemer; 19.04.2015
git clean -- .
должен делать то, что я хотел. Прочитав этот ответ и протестировав его, мы подтвердили это. Но почему-то НЕ РАБОТАЕТ В ПОДМОДУЛЯХ! Почему нет? <вздох>
- person Ted Middleton; 14.07.2015
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
git checkout -- path/to/file/to/revert
?
- person Frozen Flame; 10.12.2015
git checkout -- :/
(я сам искал это!)
- person waldyrious; 04.04.2016
git add <filename>
?
- person Khaino; 27.02.2019
git restore
, и это та, которую теперь дает git status
. См. Мое обновление 2019 г.
- person prosoitos; 11.09.2019
git checkout -f -- path/to/revert/
, тогда как это НЕ работает git checkout -f -- path/to/revert/*
, поскольку в новых файлах git нет записи.
- person Shane; 20.05.2020
Похоже, полное решение:
git clean -df
git checkout -- .
git clean
удаляет все неотслеживаемые файлы (предупреждение: пока он выиграл » t удаляет игнорируемые файлы, упомянутые непосредственно в .gitignore, может удалять игнорируемые файлы, находящиеся в папках) и git checkout
удаляет все неустановленные изменения.
git reset --hard
- person Amanuel Nega; 31.10.2014
-- .
? Говорит ли о проверке текущей последней фиксации в текущей папке?
- person Evan Hu; 18.01.2015
.gitignore
d .
- person leftaroundabout; 16.09.2016
git -df
, я рекомендую добавить параметр n
, если вы все еще новичок в выполнении команды, то есть git -dfn
. Это запустит его в dry-run
режиме, чтобы вы могли видеть, что будет удалено, без фактического удаления и каких-либо действий. Если вас устраивает результат, вы можете запустить его снова без опции n
.
- person Dan; 11.03.2019
git clean
, вариантов и использования: atlassian.com/git/ учебники / отмена-изменения / git-clean
- person Ambareesh; 08.09.2020
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
git stash save --keep-index
.
- person Rhubbarb; 15.06.2015
git checkout --
не работает, если у вас только одна ветка. git checkout .
всегда работает.
- person Ed Bayiates; 29.06.2018
git clean
, чтобы также удалить неотслеживаемые файлы.
- person jlh; 22.01.2021
git clean -df
Очищает рабочее дерево, рекурсивно удаляя файлы, не находящиеся под контролем версий, начиная с текущего каталога.
-d
: Удалять неотслеживаемые каталоги в дополнение к неотслеживаемым файлам
-f
: Force (может не понадобиться в зависимости от настройки clean.requireForce
)
Запустите git help clean
, чтобы просмотреть руководство
Обновление 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
.
git restore .
работал отлично. Спасибо.
- person Saurabh Misra; 02.12.2019
git restore <filename>
, и он отлично сработал.
- person Merlin; 14.01.2020
git restore .
восстанавливает все файлы в текущем каталоге, а не во всем репозитории.
- person jarno; 22.05.2020
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
-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
.
git reset --hard
? (что на самом деле эквивалентно git reset --hard HEAD
и должно работать независимо от текущего каталога ...)
- person ErikMD; 15.01.2018
git clean -dfx
, вот совет, который я использую, чтобы быть в безопасности перед ее запуском: просто запустите git clean -d -x -n
раньше, чтобы отобразить список файлов, которые необходимо удалить, затем подтвердите операцию, запустив git clean -d -x -f
(I поместите аргумент -n
или -f
в конце, чтобы иметь возможность быстро изменить его в терминале)
- person ErikMD; 15.01.2018
.gitignore
, вы потеряете их. Поэтому подумайте о резервном копировании вашего проекта перед этим.
- person Rob; 03.04.2018
Если вы просто хотите удалить изменения в существующих файлах, используйте checkout
(задокументировано здесь).
git checkout -- .
- Ветвь не указана, поэтому проверяется текущая ветка.
- Двойной дефис (
--
) сообщает Git, что следующее следует рассматривать как его второй аргумент (путь), что вы пропустили указание ветки. - Точка (
.
) указывает все пути.
Если вы хотите удалить файлы, добавленные с момента последней фиксации, используйте clean
(задокументировано здесь):
git clean -i
- Параметр
-i
запускает интерактивноеclean
, чтобы предотвратить ошибочное удаление. - Несколько других вариантов доступны для более быстрого выполнения; см. документацию.
Если вы хотите переместить изменения в пространство хранения для последующего доступа, используйте stash
(задокументировано здесь):
git stash
- Все изменения будут перемещены в Git's Stash для возможного последующего доступа.
- Несколько вариантов доступны для более тонкого хранения; см. документацию.
Я действительно нашел эту статью полезной для объяснения, когда какую команду использовать: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Есть несколько разных случаев:
Если вы не поставили файл, используйте
git checkout
. Checkout «обновляет файлы в рабочем дереве, чтобы они соответствовали версии в индексе». Если файлы не были добавлены в индекс (иначе говоря, добавлены в индекс) ... эта команда по существу вернет файлы к тому, что было вашей последней фиксацией.git checkout -- foo.txt
Если вы поставили файл, используйте git reset. Сброс изменяет индекс в соответствии с фиксацией.
git reset -- foo.txt
Я подозреваю, что использование git stash
- популярный выбор, поскольку он немного менее опасен. Вы всегда можете вернуться к нему, если случайно выбросите слишком много при использовании git reset. По умолчанию сброс выполняется рекурсивно.
Взгляните на статью выше для получения дополнительных советов.
Самый простой способ сделать это - использовать эту команду:
Эта команда используется для отмены изменений в рабочем каталоге -
git checkout -- .
https://git-scm.com/docs/git-checkout
В команде git сохранение неотслеживаемых файлов достигается с помощью:
git stash -u
http://git-scm.com/docs/git-stash
.
в конце. Для будущего меня: период необходим!
- person bejado; 16.06.2017
git clean -fd
, чтобы очистить файлы не в индексе.
- person oligofren; 28.11.2017
Если вы не заинтересованы в сохранении неустановленных изменений (особенно если поэтапные изменения - это новые файлы), я нашел это удобным:
git diff | git apply --reverse
Когда вы вводите git status, отображается (используйте «git checkout - ...», чтобы отменить изменения в рабочем каталоге).
e.g. git checkout -- .
git checkout -f
man git-checkout
:
-f, --force
При переключении ветвей продолжайте, даже если индекс или рабочее дерево отличается от HEAD. Это используется для удаления локальных изменений.
При проверке путей из индекса не допускайте сбоев при несоединенных записях; вместо этого не объединенные записи игнорируются.
Вы можете использовать git stash - если что-то пойдет не так, вы все равно можете вернуться из тайника. Подобно другому ответу здесь, но этот также удаляет все неустановленные файлы, а также все неустановленные удаления:
git add .
git stash
Если вы проверите, что все в порядке, выбросьте тайник:
git stash drop
Ответ Билала Максуда с git clean
также сработал для меня, но с тайником у меня больше контроля - если я сделаю что-то случайно, я все равно могу вернуть свои изменения
ОБНОВЛЕНИЕ
Я думаю, есть еще одно изменение (не знаю, почему это сработало для меня раньше):
git add . -A
вместо git add .
без -A
удаленные файлы не будут размещены
Вместо того, чтобы отменить изменения, я сбрасываю свой пульт в исходное состояние. Примечание. Этот метод предназначен для полного восстановления вашей папки до репо.
Поэтому я делаю это, чтобы убедиться, что они не сидят там, когда я git reset (позже - исключает gitignores в Origin / branchname)
ПРИМЕЧАНИЕ. Если вы хотите сохранить файлы, которые еще не отслеживаются, но не в GITIGNORE, вы можете пропустить этот шаг, так как он сотрет эти неотслеживаемые файлы, которых нет в вашем удаленном репозитории (спасибо @XtrmJosh).
git add --all
Затем я
git fetch --all
Затем я возвращаюсь в исходное положение
git reset --hard origin/branchname
Это вернет все на круги своя. Точно так же, как ПОВТОРНОЕ Клонирование ветки, ПОКА все мои файлы с gitignored сохраняются локально и на месте.
Обновлено для каждого комментария пользователя ниже: Вариант для сброса на любую текущую ветку, в которой находится пользователь.
git reset --hard @{u}
--untracked-files[=<mode>]
, что неотслеживаемые файлы по умолчанию отображаются в git status
, и вы могу сказать, чтобы не показывать им, если это вас беспокоит! Для записи git add --all
подготовит файлы к фиксации, после чего git распознает их (следовательно, git reset --hard будет работать). git clean
удаляет неотслеживаемые файлы см. Здесь
- person XtrmJosh; 19.11.2015
git reset --hard @{u}
, который сбрасывает ветвь туда, где находится текущая ветка удаленного отслеживания.
- person user2221343; 06.01.2016
Пробовал все вышеперечисленные решения, но все еще не смог избавиться от новых неустановленных файлов.
Используйте 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 -u
скоро (Git 2.14.x / 2.15, Q3 2017) немного изменится: stackoverflow.com/a/46027357/6309 < / а>
- person VonC; 03.09.2017
git stash -k
.
- person snap; 01.02.2018
просто скажи
git stash
Это удалит все ваши локальные изменения. Вы также можете использовать позже, сказав
git stash apply
или git stash pop
у вас очень простая команда git git checkout .
Это работает даже в каталогах, которые; за пределами обычных разрешений git.
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
Случилось со мной недавно
git help clean
-d Удалять неотслеживаемые каталоги в дополнение к неотслеживаемым файлам.
- person GlassGhost; 11.12.2014
Независимо от того, в каком состоянии находится ваше репо, вы всегда можете вернуться к любой предыдущей фиксации:
git reset --hard <commit hash>
Это отменит все изменения, сделанные после этого коммита.
По моему мнению,
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).
То, что далее следует, на самом деле является решением только в том случае, если вы работаете с вилкой репозитория, где вы регулярно синхронизируете (например, запрос на перенос) с другим репо. Краткий ответ: удалите 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.
У меня была странная ситуация, когда файл всегда не размещался, это помогает мне решить.
git rm .gitattributes
git add -A
git reset --hard
Если вы хотите передать тайник кому-то другому:
# 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
[править] как прокомментировано, можно называть тайники. Что ж, используйте это, если хотите поделиться своим кошельком;)
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, который содержит множество псевдонимов:
Если у вас есть подмодуль и никакие другие решения не работают, попробуйте:
Чтобы проверить, в чем проблема (возможно, «грязный» случай), используйте:
git diff
Чтобы удалить тайник
git submodule update
Если все поэтапные файлы были фактически зафиксированы, то ветку можно просто сбросить, например. из графического интерфейса пользователя примерно тремя щелчками мыши: Переход, Сброс, Да!
То, что я часто делаю на практике, чтобы отменить нежелательные локальные изменения, - это зафиксировать все хорошие вещи, а затем сбросить ветку.
Если хороший материал зафиксирован в одной фиксации, вы можете использовать «изменить последнюю фиксацию», чтобы вернуть его в состояние постановки или неустановки, если вы в конечном итоге захотите зафиксировать его немного по-другому.
Возможно, это не то техническое решение, которое вы ищете для своей проблемы, но я считаю его очень практичным решением. Он позволяет выборочно отбрасывать неустановленные изменения, сбрасывая те изменения, которые вам не нравятся, и сохраняя те, которые вы делаете.
Таким образом, я просто выполняю фиксацию, сброс ветки и исправление последней фиксации.
Если практически невозможно исключить модификации файлов, не рассматривали ли вы их игнорирование? Если это утверждение верно и вы не будете трогать эти файлы во время разработки, эта команда может быть полезна:
git update-index --assume-unchanged file_to_ignore
Ни одно из решений не работает, если вы просто изменили разрешения для файла (это в 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
Напоминаем, что в новых версиях git есть команда восстановления, которая также предлагается при вводе git status при изменении файлов:
(используйте git add ..., чтобы обновить то, что будет зафиксировано)
(используйте git restore ..., чтобы отменить изменения в рабочем каталоге)
Итак, git 'restore' - современное решение этой проблемы. Всегда полезно прочитать предложения от git после ввода git status :-)
Просто используйте:
git stash -k -u
Это сохранит неустановленные изменения и неотслеживаемые файлы (новые файлы) и сохранит подготовленные файлы.
Это лучше, чем _2 _ / _ 3 _ / _ 4_, потому что вы можете захотеть их вернуть позже (до git stash pop
). Лучше хранить их в тайнике, чем выбрасывать.
Если вы хотите восстановить неустановленные файлы, используйте git restore --staged.
git-clean
удаляет только неотслеживаемые файлы из рабочего дерева git-scm.com/docs/git-clean а> - person Yega   schedule 15.09.2016git-clean -df
может быть опасным. Он удалит локальные неотслеживаемые файлы (например, покрытые .gitignore). Внимательно прочтите все ниже и подумайте о git checkout. вместо - person jacanterbury   schedule 07.10.2016git status
дает подсказку, как это сделать!git checkout -- .
- person Paulo   schedule 21.12.2017git reset HEAD file1
, который перезаписываетfile1
из самой последней фиксации в истории фиксации. В промежуточную область. - person overexchange   schedule 17.01.2019git status
дает предложение:git restore
.git restore
- новая команда именно для этой цели. См. мое обновление за 2019 год. - person prosoitos   schedule 12.09.2019