Как удалить файлы из области размещения git?

552

Я внес изменения в некоторые из моих файлов в моем локальном репо, а затем сделал то, git add -Aчто, по-моему, добавил слишком много файлов в промежуточную область. Как я могу удалить все файлы из области подготовки?

После того, как я это сделаю, я сделаю это вручную git add "filename".

омега
источник
2
Надеюсь, вы ищете это: stackoverflow.com/questions/1505948/…
sumitb.mdi
27
git statusуже говорит вам, что делать, если вы хотите удалить файлы.
Майкл Фукаракис
6
@MichaelFoukarakis git status не так полезен, если вы хотите отключить весь каталог, если он заполняет терминал выводом (например, node_modules)
whiterook6
2
В будущем, вместо добавления всего, вы можете захотеть освоиться с git add -pили git add --patch(они одинаковы). Этот флаг позволяет вам в интерактивном режиме выбирать, какие файлы или отдельные изменения вы хотите внести - тогда вы можете получить более детальное представление о том, какую работу вы включаете в коммит.
Гейб

Ответы:

691

Вы можете удалить файлы из индекса, используя

git reset HEAD -- path/to/file

Также как git addвы можете рекурсивно разархивировать файлы по каталогу и т. Д., Чтобы разархивировать все сразу, запустите это из корневого каталога вашего репозитория:

git reset HEAD -- .

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

Эш Уилсон
источник
5
$ git reset HEAD -- .произвел fatal: Failed to resolve 'HEAD' as a valid ref.примечание, что я никогда не делал никакой фиксации; это первый git addпослеgit init
Патрицио Бертони
5
Вы также можете использовать git reset @.
Алекс
@alex Это лучше, чем просто git reset?
Энтони Хэтчкинс
7
@AntonyHatchkins @является синонимом HEAD.
alex
Полностью сработал для меня, спасибо!
Wayneseymour
306

использование

git reset

удалить все поставленные файлы.

Энтони Хэтчкинс
источник
3
Могу я спросить, чем это отличается git reset HEAD --или это просто более лаконичный способ выполнения той же операции?
ProNotion
1
@ProNotion Reset использует HEADпо умолчанию. Какова цель тех --в вашем git reset HEAD --?
Энтони Хэтчкинс
@AntonyHatchkins за ним должна была следовать точка (точка), и она была взята из примера в принятом ответе.
ProNotion
11
@ProNotion Извините, я вас неправильно понял. git reset HEAD -- .отличается тем, что сбрасывает только файлы в текущем каталоге и ниже, а git resetсбрасывает все файлы в проекте.
Энтони Хэтчкинс
101

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

git rm --cached -r .

--cachedговорит ему об удалении путей из промежуточной и индексной, не удаляя сами файлы, и -rрекурсивно работает с каталогами. Вы можете затем git addлюбые файлы, которые вы хотите отслеживать.

Максимум
источник
Я полагаю, это "Git Rm -."
Александр Миллс
1
есть неустранимая ошибка не удалять файлы с помощью "git rm -."
Александр Миллс
@AlexMills Я обновляю свой ответ, чтобы упомянуть фактические параметры для rmудаления всех файлов.
Макс
2
Я попробовал это на отдельном файле, например: «git rm --cached my / file.java», и я вижу, что этот файл все еще находится в промежуточной области, но удален! @ Макс, когда вы запускаете эту команду, ваши файлы на самом деле удаляются или просто не помещаются? Если вы не ищете такое поведение, я бы пошел с ответом.
ОруэллХинденберг,
@ OrwellHindenberg, спасибо за то, что указал на это! --cachedдействительно, чтобы остановить отслеживание файлов, которые вы уже зафиксировали. Таким образом, файл на самом деле не удален, но Git считает, что это так. Я уточнил это в своем ответе.
Макс
30

Вы могли бы использовать

git reset HEAD

затем добавьте конкретные файлы, которые вы хотите с

git add [directory/]filename
алоза
источник
Вы можете добавить параметр -x и игнорируемые файлы также будут удалены. Это полезно, если вы запутались в своем .gitignore и у вас есть что-то полезное (как в моем случае). ( git-scm.com/docs/git-clean )
Keeprock
1
С лишними папками, git statusскажу вам, рабочий каталог чист - ложь! git clean -dfсделал эту работу, спасибо.
Лев
5
Обратите внимание, что git clean -dfудалит файлы навсегда. В UNIX-подобных системах он будет вызываться, unlink()и ваши удаленные файлы не будут восстановлены.
Hanxue
11
ОП запрашивает удаление файлов. Вы советуете ему удалить файлы. Я бы посоветовал вам прочитать о том, что такое область подготовки, прежде чем ответить.
Энтони Хэтчкинс
Спасибо за удаление всего моего несохраненного проекта.
Вансуита младший
7

Как отмечено в других ответах, вы должны использовать git reset. Это отменит действие git add -A.

Примечание: git reset эквивалентно тому, git reset --mixedчто делает это

Сбрасывает индекс, но не рабочее дерево (т. Е. Измененные файлы сохраняются, но не помечаются для фиксации) и сообщает, что не было обновлено. Это действие по умолчанию. [ git reset ]

Дэн Розенстарк
источник
2
.. и удалить один файл из области подготовки, вы можете сделатьgit reset filenameToNotCommit
SherylHohman
5

Теперь на v2.24.0 предлагает

git restore --staged .

удалить файлы.

norixxx
источник
1

Вы можете сбросить область подготовки несколькими способами:

  1. Сбросьте HEAD и добавьте все необходимые файлы для повторной регистрации, как показано ниже:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    
Амит Канерия
источник
Чем этот ответ отличается от существующих шести ответов?
Энтони Хэтчкинс
1

Для удаления всех файлов из области подготовки используйте -
git reset
Для удаления конкретного файла используйте -
git reset "File path"

Акаш Бисария
источник
1

использование

git reset HEAD

Это удалит все файлы из области подготовки

Ajith
источник
1

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

$ git reset HEAD file
# Or everything
$ git reset HEAD .

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

git checkout -- .
Влад Безден
источник
0

Используйте " git reset HEAD <file>...", чтобы расшарить файлы

например: удалить все файлы

git reset HEAD .

удалить из файла один файл

git reset HEAD nameFile.txt
Amirouche Zeggagh
источник
-3

Я испробовал все эти методы, но ни один не работал для меня. Я удалил .git файл с помощью rm -rf .gitобразуют локальное хранилище , а затем снова сделал git initи git addи обычные команды. Это сработало.

Бхаскар Дхариял
источник
4
Чтение git docs обычно более полезно, чем следование совету xkcd.com/1597 ;)
Энтони Хэтчкинс,
1
Возможно, у вас была проблема с целостностью в вашем конкретном случае, и этот вариант остался, но это не рекомендуется.
Шад
Пожалуйста, не делайте этого, вы уничтожите весь свой git-репо.
Леннарт Роллан
-5

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

данные пикселей
источник
2
Это неправильно и опасно !!! OP хочет «просто вручную» добавить файлы обратно потом, но --hardудаляет их навсегда.
Энтони Хэтчкинс