Как отменить изменения в моей рабочей копии, которых нет в индексе?
git
version-control
Readonly
источник
источник
git-clean
только удаляет неотслеживаемые файлы из рабочего дерева git-scm.com/docs/git-cleangit-clean -df
может быть опасно. Он удалит локальные неотслеживаемые файлы (например, закрытые .gitignore). Внимательно прочитайте все ниже и рассмотрите git checkout. вместо этогоgit status
дает предложение о том, как это сделать!git checkout -- .
git status
дает предложение:git restore
.git restore
это новая команда именно для этой цели. Смотрите мое обновление 2019 года .Ответы:
Другой более быстрый способ:
Вам не нужно включать
--include-untracked
если вы не хотите быть тщательным об этом.После этого вы можете сбросить этот тайник с помощью
git stash drop
команды, если хотите.источник
--include-untracked
.git reset
также отменит изменения в индексе.git stash
, ни другое неgit checkout
отменяет неустановленные удаления. Согласно выводуgit status
, фактический правильный ответ здесь - это немного ароматаgit reset HEAD
git checkout -- .
выполняет работу только с одной командойДля всех неподготовленных файлов в текущем рабочем каталоге используйте:
Для конкретного файла используйте:
--
здесь, чтобы удалить аргумент неоднозначности .источник
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
означает то же самоеgit checkout .
, за исключением того, что вы явно говорите о том, что вы не указываете имя ветви. Они оба говорят, что стоит проверить версию HEAD в той ветке, в которой я сейчас нахожусь. или './'. Если вы делаетеgit checkout branch-name directory-or-file-name
в целом, вы получаете версию HEADdirectory-or-file-name
на веткеbranch-name
.Похоже, полное решение:
git clean
удаляет все неотслеживаемые файлы ( предупреждение : хотя он не удаляет проигнорированные файлы, упомянутые непосредственно в .gitignore, он может удалять игнорируемые файлы, находящиеся в папках ) иgit checkout
удаляет все неотмеченные изменения.источник
git reset --hard
Это проверяет текущий индекс для текущего каталога, отбрасывая все изменения в файлах из текущего каталога вниз.
или этот, который проверяет все файлы из индекса, перезаписывая файлы рабочего дерева.
источник
git checkout .
иgit checkout -- .
?git stash save --keep-index
.Очищает рабочее дерево путем рекурсивного удаления файлов, которые не находятся под контролем версий, начиная с текущего каталога.
-d
: Удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам-f
: Сила (может не требоваться в зависимости отclean.requireForce
настроек)Запустите,
git help clean
чтобы увидеть руководствоисточник
Мой любимый
Это позволяет вам выборочно возвращать фрагменты.
Смотрите также:
источник
-p
добавляет хороший дополнительный уровень безопасности. Объедините это с,git clean -d
чтобы фактически ответить на OP.Поскольку ни один ответ не предлагает точную комбинацию опций, которую я использую, вот она:
Это текст интерактивной справки для используемых
git clean
опций:-d
Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим Git-репозиторием, по умолчанию он не удаляется. Используйте
-f
опцию дважды, если вы действительно хотите удалить такой каталог.-f
Если переменная конфигурации Git
clean.requireForce
не установленfalse
, Git чистый откажет удалять файлы или каталоги , если не дано-f
,-n
или-i
. Git откажется от удаления каталогов в.git
подкаталоге или файле, если-f
не дается секунда .-x
Не используйте правила игнорирования из
.gitignore
(для каждого каталога) и$GIT_DIR/info/exclude
, но все же используйте правила игнорирования, заданные с-e
опциями. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это можно использовать (возможно, в сочетании сgit reset
) для создания первичного рабочего каталога для тестирования чистой сборки.Также
git checkout .
необходимо сделать в корне репо.источник
git reset --hard
вместо этого? (что на самом деле эквивалентноgit reset --hard HEAD
и должно работать в зависимости от текущего каталога ...)git clean -dfx
Что касается первой команды , вот подсказка, которую я использую, чтобы быть в безопасности перед ее выполнением: просто запуститеgit clean -d -x -n
прежде, чтобы отобразить список файлов, которые нужно удалить, затем подтвердите операцию, выполнивgit clean -d -x -f
(я поставил аргумент-n
и, соответственно,-f
в конце, чтобы иметь возможность быстро изменить его в терминале).gitignore
вы потеряете их. Поэтому подумайте о резервном копировании вашего проекта до этого.Если вы просто хотите удалить изменения в существующих файлах , используйте
checkout
( документировано здесь ).--
) говорит Git, что последующее должно быть взято как его второй аргумент (путь), что вы пропустили спецификацию ветви..
) указывает все пути.Если вы хотите удалить файлы, добавленные с момента вашей последней фиксации, используйте
clean
( задокументировано здесь ):-i
опции инициирует интерактивныйclean
, для предотвращения ошибочных удалений.Если вы хотите переместить изменения в область хранения для последующего доступа , используйте
stash
( задокументировано здесь ):источник
Я действительно нашел эту статью полезной для объяснения, когда использовать какую команду: 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. Сброс является рекурсивным по умолчанию.Посмотрите на статью выше для дальнейших советов.
источник
Самый простой способ сделать это с помощью этой команды:
Эта команда используется для отмены изменений в рабочем каталоге -
https://git-scm.com/docs/git-checkout
В команде git сохранение неотслеживаемых файлов достигается с помощью:
http://git-scm.com/docs/git-stash
источник
.
в конце. Для будущего меня: период необходим !git clean -fd
выполнить очистку файлов, отсутствующих в индексе.Если вы не заинтересованы в сохранении неизмененных изменений (особенно, если внесенные изменения представляют собой новые файлы), я нашел это удобным:
источник
git checkout -f
man git-checkout
:-f, --force
При переключении веток продолжайте работу, даже если индекс или рабочее дерево отличается от HEAD. Это используется, чтобы выбросить локальные изменения.
При проверке путей из индекса не допускайте сбоев при незакрытых записях; вместо этого необработанные записи игнорируются.
источник
По мере ввода состояния git (используйте «git checkout - ...» для отмены изменений в рабочем каталоге) .
например
git checkout -- .
источник
Вы можете использовать git stash - если что-то пойдет не так, вы все равно сможете вернуться из stash. Подобный некоторому другому ответу здесь, но этот также удаляет все неустановленные файлы, а также все немаркированные удаляет:
если вы проверите, что все в порядке, выбросьте тайник:
Ответ от Bilal Maqsood
git clean
также сработал для меня, но с тайником у меня больше контроля - если я делаю что-то случайно, я все равно могу вернуть свои измененияОБНОВИТЬ
Я думаю, что есть еще 1 изменение (не знаю, почему это работало для меня раньше):
git add . -A
вместоgit add .
без
-A
удаленных файлов не будут поставленыисточник
2019 обновление:
С июля 2019 года , там была новая команда , которая делает именно это:
git restore
.В
git status
, теперь Git рекомендует использовать эту команду вместо того,git checkout
как раньше.Хотя эту команду также можно использовать для восстановления рабочего дерева до определенного коммита или для восстановления содержимого индекса, по умолчанию рабочее дерево восстанавливается до состояния в индексе (о чем здесь говорится).
Таким образом, чтобы восстановить файлы, соответствующие спецификациям пути (избавиться от их неизмененных изменений), вы должны сделать:
Например, чтобы восстановить все неотмеченные изменения в текущем каталоге, вы можете выполнить:
Если вы запустите это из корня проекта, он восстановит все неустановленные изменения во всем хранилище.
Обратите внимание, что, как и в случае с
git checkout -- .
(как указал Mariusz Nowak), при этом будут отменены только изменения в файлах, отслеживаемых Git, и не будут удалены любые новые неотслеживаемые файлы. Если вы хотите отменить любые неотмеченные изменения, включая новые неотслеживаемые файлы, вы можете запустить дополнительные:Будьте очень осторожны с этой более поздней командой, поскольку вы можете отбросить файлы, от которых вы не собираетесь избавляться.
Примечание
git restore
: поскольку это новая команда, ее страница руководства выдает предупреждение:Таким образом, возможно, что этот ответ может устареть, если поведение изменится в будущем. Таким образом, может быть целесообразно быстро запустить его
man git-restore
перед использованием.источник
git restore .
работал отлично. Спасибо.git restore <filename>
и это сработало отлично.git restore .
восстанавливает все файлы в текущем каталоге, а не во всем хранилище.Вместо того, чтобы отменить изменения, я перенастроил свой пульт на источник. Обратите внимание - этот метод предназначен для полного восстановления вашей папки в папку репо.
Так что я делаю это, чтобы убедиться, что они не сидят там, когда я сбрасываю git (позже - исключая gitignores для Origin / branchname)
ПРИМЕЧАНИЕ. Если вы хотите, чтобы файлы еще не отслеживались, но не в GITIGNORE, вы можете пропустить этот шаг, так как он будет стирать эти неотслеживаемые файлы, не найденные в вашем удаленном хранилище (спасибо @XtrmJosh).
Затем я
Потом я сбрасываю на источник
Это вернет его на круги своя. Точно так же, как повторное клонирование ветки, пока все мои gitignored файлы хранятся локально и на месте.
Обновлен для каждого комментария пользователя ниже: Вариант для сброса текущей ветки, в которой находится пользователь.
источник
git reset --hard @{u}
который сбрасывает ветку туда, где находится текущая ветвь удаленного отслеживанияПерепробовал все вышеперечисленные решения, но так и не смог избавиться от новых, неподготовленных файлов
Используйте
git clean -f
для удаления этих новых файлов - однако, с осторожностью! Обратите внимание на параметр силы.источник
просто скажи
Это удалит все ваши локальные изменения. Вы также можете использовать позже, сказав
или Git Stash поп
источник
Просто используйте:
Выполнено. Легко.
Если вы действительно заботитесь о своем стековом стеке, тогда вы можете следовать с ним
git stash drop
. Но в этот момент вам лучше использовать (от Мариуша Новака):Тем не менее, мне нравится
git stash -u
больше всего, потому что он «отбрасывает» все отслеженные и неотслеживаемые изменения всего одной командой . Тем не менее ,git checkout -- .
только отбрасывает отслеживаются изменения, иgit clean -df
только отбрасывает неотслеживаемые изменения ... и вводить обе команды это далеко слишком много работы :)источник
git stash -u
скоро (Git 2.14.x / 2.15, 3-й квартал 2017 г.) будет немного развиваться: stackoverflow.com/a/46027357/6309git stash -k
на мой взгляд.Чтобы сделать постоянный сброс:
git reset --hard
Чтобы сохранить изменения на потом:
git stash
источник
Это работает даже в каталогах, которые есть; за пределами нормальных разрешений git.
Случилось со мной недавно
источник
git help clean
"-d Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам".у вас очень простая команда git
git checkout .
источник
источник
По моему мнению,
должен сделать свое дело. Согласно документации Git по git clean
Описание
Опции
источник
Независимо от того, в каком состоянии находится ваш репо, вы всегда можете вернуться к любой предыдущей фиксации:
Это отменит все изменения, которые были сделаны после этого коммита.
источник
Другой способ избавиться от новых файлов, который более специфичен, чем git clean -df (это позволит вам избавиться от некоторых файлов, не обязательно всех), - сначала добавить новые файлы в индекс, затем спрятать, а затем удалить заначка.
Этот метод полезен, когда по какой-то причине вы не можете легко удалить все неотслеживаемые файлы каким-либо обычным механизмом (например, rm).
источник
То, что следует, действительно является только решением, если вы работаете с форком репозитория, где вы регулярно синхронизируете (например, запрос на извлечение) с другим репо. Краткий ответ: удалите fork и refork, но прочтите предупреждения на github .
У меня была похожая проблема, возможно, не идентичная, и мне грустно говорить, что мое решение не идеально, но в конечном итоге оно эффективно.
У меня часто бывали такие сообщения о состоянии git (по крайней мере, 2/4 файла):
Зоркий глаз заметит, что в этих файлах есть допплангеры, которые в случае отключения - одна буква. Каким-то образом, и я понятия не имею, с чего начался этот путь (поскольку я сам не работал с этими файлами из репозитория верхнего уровня), я переключил эти файлы. Попробуйте множество решений, перечисленных на этой странице (и других страницах), похоже, не помогло.
Я смог решить эту проблему, удалив свой разветвленный репозиторий и все локальные репозитории, а затем повторив его. Одного этого было недостаточно; апстрим должен был переименовать файлы в новые имена файлов. До тех пор, пока у вас не будет никакой беспристрастной работы, нет вики и нет проблем, которые расходятся с вышестоящим хранилищем, у вас все будет в порядке. Upstream может быть не очень доволен вами, если не сказать больше. Что касается моей проблемы, то это, несомненно, ошибка пользователя, так как я не настолько опытен в git, но тот факт, что исправить проблему с git также нелегко.
источник
Когда вы хотите передать тайник кому-то еще:
[отредактируйте] как прокомментировано, можно назвать тайники. Ну, используйте это, если вы хотите поделиться своим тайником;)
источник
git stash save "Feature X work in progress"
.Вы можете создать свой собственный псевдоним, который описывает, как сделать это в описательной форме.
Я использую следующий псевдоним, чтобы отменить изменения.
Отменить изменения в (списке) файлах в рабочем дереве
Затем вы можете использовать его как следующий, чтобы отменить все изменения:
Или просто файл:
В противном случае, если вы хотите отменить все изменения, а также неотслеживаемые файлы, я использую сочетание checkout и clean:
Очистить и отменить изменения и неотслеживаемые файлы в рабочем дереве
Таким образом, использование просто как следующее:
Теперь доступно в следующем репозитории Github, который содержит много псевдонимов:
источник
У меня была странная ситуация, когда файл всегда был неподготовленным, это помогает мне решить проблему.
источник