git reset --hard HEAD оставляет неотслеживаемыми файлы

584

Когда я бегу git reset --hard HEAD, он должен восстановить исходную версию того, что вы вытащили, насколько я понимаю. К сожалению, он оставляет файлы без дела, поскольку git statusпоказывает большой список неотслеживаемых файлов.

Как вы говорите git «Просто верните его ТОЧНО, что было в последнем потоке, ни больше, ни меньше»?

Карл
источник
44
git reset --hardсбрасывает ваш индекс и возвращает отслеживаемые файлы обратно в состояние, в котором они находятся в HEAD. Он оставляет файлы без отслеживания в покое.
fifigyuri

Ответы:

904

Вы должны использовать, git clean -f -dчтобы избавиться от неотслеживаемых файлов и каталогов в вашей рабочей копии.

Если вам нужно сбросить весь репозиторий на master, включая все подмодули git, запустите этот скрипт:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status
knittl
источник
56
Также, -xесли вы хотите удалить ваши файлы .gitignored и вернуться в первоначальное состояние.
jtdubs
44
Добавить -nв тест будет удален в первую очередь. объединить их все в один аргумент:-dfn
HyBRiD 30.12.12
31
Моя общая команда git clean -qfdxздесь. Удалить все и сделать это молча.
aragaer
3
-d -fможет быть decalred дважды -dffза -d -f -fэто удалит все неотслеживаемые каталоги, в том числе защищенных неотслеживаемых каталогов.
ThorSummoner
3
@BKSpurgeon: да, он удаляет файлы. Что вы имеете в виду под «Я хочу, чтобы неотслеживаемые файлы были такими, какими они были раньше»? Git ничего не знает о неотслеживаемых файлах, кроме того, что они существуют. Он не отслеживает несколько версий этих файлов (так как они не отслеживаются ).
Knittl
61

Если у вас есть файлы, которые вы все еще хотите сохранить:

git clean -di сделает интерактивную чистку, которая позволяет вам удалять только те файлы / каталоги, которые вам больше не нужны.

Sogger
источник
48
git reset --hard && git clean -dfx

или zsh предоставляет псевдоним gpristine:

alias gpristine='git reset --hard && git clean -dfx'

Что действительно удобно.

Если вы работаете с разветвленным репо, убедитесь, что вы выбрали и сбросили из правильного репо / ветви, например:

git fetch upstream && git reset --hard upstream/master && git clean -df
jjnevis
источник
8
Извиняюсь, если это не безопасная команда - я не пытался быть в безопасности, я пытался ответить на вопрос. Не могли бы вы прокомментировать, отвечает ли это на вопрос?
jjnevis
3
Это хорошо работает и должно быть встроено в git IMHO (хотя я не уверен, что буду использовать -x регулярно). Очень часто я работаю над локальным проектом, еще не синхронизированным с github и т. Д., И грязный рефакторинг выходит из строя за пределами состояния отмены IDE. Мой инстинкт заключается в том, чтобы вернуться к последнему коммиту, но поиск в Google обычно приводит к ответам на предпоследний коммит, а не на последний коммит. Все, что я хочу, это вернуться к последнему коммиту. Это делает это. Хотя должно быть проще. Спасибо Линус! ;-)
Делл Андерсон
5
Это опасно, потому что он также удаляет проигнорированные файлы с -xподобным, если бы вы только что клонировали репо. Если это то, что вы хотите, это прекрасно. Если вы просто хотите удалить неотслеживаемые файлы, удаление -xопции работает хорошо.
Эмиль Бержерон
2
Слава Богу заgpristine
Snowcrash
2
и удаляет intellij настройки;)
Kalpesh Soni
17

Пользовательский интерактивный подход:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i для интерактивной
-f для принудительной
-d для директории
-x для игнорируемых файлов (добавьте при необходимости)

Примечание: Добавьте -n или --dry-run, чтобы просто проверить, что он будет делать.

bit_cracker007
источник
4

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

git stash --include-untracked

Тогда просто бросьте последнюю запись в тайник

git stash drop

Для этого вы можете создать псевдоним удобного денди и назвать его, git wipeнапример:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"
Никола Диклич
источник
2

Команда, которую вы ищете git clean

Джагрити Кумари
источник
4
В следующий раз, пожалуйста, добавьте немного больше описания / примеров и т. Д. Что бы ни помогло пользователю понять, что он делает, и, в этом случае, какие параметры использовать.
rugk
1

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

-dиспользовать, когда путь не указан. Так что git recurse в неотслеживаемые каталоги удаляет их.

-f/--force Удалить вложенные неотслеживаемые файлы.

-i/--interactive Покажите, что будет сделано, и очистите файлы в интерактивном режиме.

-n/--dry-run Покажите, что будет, не удаляя ничего.

-x игнорировать файлы

пример: git clean -f -d-> Удалить все неотслеживаемые файлы в текущем каталоге из любых подкаталогов.

Юреш Карунанаяке
источник
-16

Возможно, в какой-то момент вы сделали мягкий сброс, вы можете решить эту проблему, выполнив

git add .
git reset --hard HEAD~100
git pull
user3780587
источник
7
Я не думаю, что это то, что хотел ОП. Любой из других ответов гораздо лучше показывает, как это исправить.
Авери
1
Это также может быть медленным, если у вас есть много файлов для добавления.
Девин Г. Род
4
совершенно не связано.
Азим Хасни
1
При этом неотслеживаемые файлы удаляются. Но, как программисты, каждый должен пытаться найти правильное решение проблем без использования обходных путей и улыбки.
Юреш Карунанаяке