Як видалити файли з області постановки git?


548

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

Після того як я це зроблю, я буду робити це вручну git add "filename".


2
Сподіваюся , що ви шукаєте це: stackoverflow.com/questions/1505948 / ...
— sumitb.mdi

27
git statusвже розповідає, що саме робити, якщо ви хочете знеструмити файли.
— Майкл Фукаракіс

6
@MichaelFoukarakis статус git не настільки корисний, якщо ви хочете знеструмити весь каталог, якщо він затопить термінал з виходом (наприклад, node_modules)
— whiterook6

2
Надалі, замість того, щоб додавати все, ви, можливо, захочете заспокоїтись git add -pабо git add --patch(вони однакові). Цей прапор дозволяє вам інтерактивно вибирати файли чи окремі зміни, які ви хочете виконати. Ви можете отримати набагато більш детальну інформацію про роботу, яку ви включите до комітету.
— Гейб

Відповіді:


689

Ви можете видалити файли з індексу за допомогою

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

@alex Це краще, ніж просто git reset?
— Антоні Хеткінс

7
@AntonyHatchkins @є синонімом до HEAD.
— алекс

Повністю працював для мене, дякую!
— wayneseymour

303

Використовуйте

git reset

для видалення всіх інсценованих файлів.


3
Чи можу я запитати, чим це відрізняється, git reset HEAD --чи це просто більш стислий спосіб виконання тієї ж операції?
— ProNotion

1
@ProNotion Reset використовує HEADза замовчуванням. Яка мета тих --у вас git reset HEAD --?
— Антоні Хетчкінс

@AntonyHatchkins після цього слід було пройти повну зупинку (період) і було взято з прикладу у прийнятій відповіді.
— ProNotion

11
@ProNotion Вибачте, що я вас зрозумів неправильно. git reset HEAD -- .відрізняється тим, що він скидає лише файли в поточному каталозі та нижче, в той час як git resetскидає всі файли в проекті.
— Ентоні Хетчкінс

100

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

git rm --cached -r .

--cachedговорить йому, щоб видалити шляхи з інсценізації та індексу, не видаляючи самі файли, і -rпрацює в каталогах рекурсивно. Потім ви можете git addбудь-які файли, які ви хочете відстежувати.


Я припускаю, що це "git rm -."
— Олександр Міллс

1
є фатальна помилка щодо не видалення файлів з "git rm -."
— Олександр Міллс

@AlexMills Я оновлюю свою відповідь, щоб згадати фактичні варіанти rmзнеструмлення всіх файлів.
— Макс

2
Я спробував це в сингулярному файлі, як це: "git rm --cached my / file.java", і я бачу, що цей файл все ще знаходиться в області постановки, але як видалений! @Max, коли ви запускаєте цю команду, ваші файли фактично видаляються чи просто нестатуються? Якщо ви не шукаєте такої поведінки, я б пішов з відповіддю.
— OrwellHindenberg

@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 .

до нестабільних файлів.


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

Це видалить усі файли з області постановки


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

-3

Я спробував усі ці методи, але жоден не працював на мене. Я видалив .git файл, використовуючи rm -rf .gitформу локального сховища, а потім знову зробив git initі git addі рутинні команди. Це спрацювало.


4
Читання документів git, як правило, корисніше, ніж дотримання порад xkcd.com/1597 ;)
— Ентоні Хетчкінс

1
Можливо, у вас виникли проблеми з цілісністю у вашому конкретному випадку, і цей варіант залишився, але це не рекомендується.
— Шад

Будь ласка, не робіть цього, ви знищите всю свою git repo.
— Леннарт Ролланд

-5

Найкращий спосіб скасувати файл, який вже є в області постановки, - це скинути git - твердий, який повертає ваші поетапні файли назад. Обережно, що вилучите поетапні та нестандартні зміни.


2
Це неправильно і небезпечно !!! OP хоче "просто вручну додати" файли знову після цього, але --hardвидаляє їх назавжди.
— Антоні Хеткінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.