Як видалити файли з області постановки 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.