Отменить «git add <dir>»?

186

Я по ошибке добавил файлы, используя команду "git add dir". Я еще не запускал "git commit". Есть ли способ удалить этот каталог и все содержащиеся в нем из коммита?

Я пытался git reset dir, но это не сработало. Видимо, git reset fileэто способ отменить это. Но у меня так много файлов и так мало времени.

neoneye
источник
6
git reset <path>обновляет индекс для этого пути, чтобы он соответствовал HEAD(текущий коммит). Это не касается рабочего дерева.
Каскабель

Ответы:

279

Чтобы удалить каталог и все внутри него из индекса,

git rm --cached -r dir

В --cachedвыключателе марка git rmработает на индексе только и не прикасайтесь к рабочей копии. -rПереключатель делает его рекурсивным.

Аристотель Пагальтзис
источник
12
«Удалить весь промежуточный каталог из индекса» было бы немного лучшим объяснением команды git, так как для начинающих git, таких как я, команда выглядит очень похоже, если бы она могла даже удалить каталог в файловой системе. Просто дело вкуса.
Саша Готфрид
1
Вот почему я смел --cachedвыключатель. Тем не менее, я отредактировал ответ, чтобы уточнить, что он относится только к индексу.
Аристотель Пагальцис
@SaschaGottfried спасибо за разъяснения, сначала я был напуган даже с правкой, но ваш комментарий прояснил это :)
Макс фон Хиппель
я почти удалил всю свою папку: S после этого ... все git reset HEAD folderисправляю ... но прежде чем сделать это, сделайте git status folder, и убедитесь, что там написано, что он "удалил" все файлы в этой папке
Бенгала
21

Вы захотите использовать git rm --cached -r <dir>. эта команда удалит содержимое промежуточного каталога из индекса.

если каталог уже отслежен, вы должны вручную найти новые и старые файлы и удалить их…

Вероятно, git reset <dir>после этого запустится для сброса существующих (и уже отслеженных) файлов внутри каталога.


Обновление 2019:

Просто запустите git reset directory, он отключит все вновь добавленные файлы.

knittl
источник
не git reset <dir>достаточно одинок?
Бананач
@Bananach Я только что попробовал, и кажется, что да, git reset <dir>будет работать. Ответ с 2011 года, поэтому я не уверен, что это уже работало 8 лет назад. Я обновлю ответ. Спасибо за подсказку!
knittl
11

Нестадийный каталог

$ git reset <dir>

Unstages все файлы и папки, с которыми я поставил:

$ git add <dir>

Подтвердите каталог без тегов

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

$ git status

или

$ git diff --staged --name-only 

чтобы убедиться, что ни одна из папок или файлов, ранее созданных, не была сохранена.

mrduncle1
источник
2

Одной простой командой для удаления подготовленного файла / папки, которые еще не зафиксированы, является - git restore --staged <dir>.

введите описание изображения здесь

Тофан Йена
источник