Как удалить один файл из области подготовки (отменить git add)?


1233

Ситуация: у меня есть Git-репозиторий с файлами уже в индексе. Я делаю изменения в нескольких файлах, открываю Git и добавляю эти файлы в мою область с помощью «git add».

Вопрос: Как удалить один из этих файлов из области подготовки, но не удалить его из индекса или отменить изменения в самом файле?


40
Зона подготовки является индексом, так что, возможно, вы могли бы уточнить, что именно вы имеете в виду?
CB Bailey


Ответы:


1903

Если я правильно понимаю вопрос, вы просто хотите «отменить» то, git addчто было сделано для этого файла.

Если вам нужно удалить один файл из области подготовки, используйте

git reset HEAD -- <file>

Если вам нужно удалить весь каталог (папку) из области подготовки, используйте

git reset HEAD -- <directoryName>

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

Смотрите git resetman-страницу для подробностей.


41
Спасибо ... Я только что заметил, что это указано прямо над подготовленными файлами. Думаю, я смотрел на этот экран так долго, что выборочно выбирал то, что хотел увидеть.
PHLAK

2
Это unstages все мои изменения, вопреки всем советам, которые я получил где-либо (man-страницы, здесь, друзья и т. Д.). Я продолжаю думать, что однажды он будет делать то, что рекламируется, но нет.
ректида

6
Есть ли способ удалить файлы из постановки, если в репо не было никаких коммитов?
Джаред Форсайт

3
Я продолжаю приходить и подходить к этому вопросу. Почему я не могу объявить это больше раз? :)
Puce

3
@Jared Forsyth Чтобы удалить файл, который никогда не был передан со сцены, используйте команду, git rm --cached FILEпредложенную другим ответом.
chmike

151
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
правда, но лучше использовать git resetздесь, я думаю, так как вы можете опустить опцию --chached и быстро огорчиться с помощью git rmкоманды :-) Если git resetвы в безопасности, если вы забудете добавить «некоторую опцию», это сохранить изменения, чтобы они были «безопаснее» для ежедневного использования (я говорю о git reset --hard).
Конрад 'Ктосо' Малавский

20
Этот метод полезен, если у вас нет предыдущих коммитов.
SomeKittens

2
git rm --cached FILEЭтапы удаления файла, без удаления файла из рабочего дерева. Это отличается от вопроса, который был о уничтожении git add.
Сампо Смоландер

1
Этот ответ выдает ошибку, если вы удалили файл из рабочего дерева.
Сэмюэль Роберт

3
git rm --cachedприведет к удалению файла из индекса, то есть файл станет неотслеживаемым . Я не думаю, что это то, чего хочет ОП. Пожалуйста, смотрите связанную
ветку

89

git reset <file>

Работает, есть ли у вас какие-либо предыдущие коммиты.


53

Итак, небольшой тим к ответу Тима Хенигана: нужно использовать - перед именем файла. Это будет выглядеть так:

git reset HEAD -- <file>

6
Что делает --и зачем его добавлять? Я сделал, git reset HEAD <file>и это сработало.
Паоло

15
--это своего рода разделитель. В случае, если имя файла нетрадиционно, например ( -fили master) git интерпретирует его как аргумент командной строки или имя ветви вместо имени файла. Смотрите здесь
Андрей

3
Это работало для меня, где команда без - не из-за отсутствия предыдущих коммитов для этого файла. Спасибо.
Мэтт

18
git reset filename.txt

Если у вас есть изменение в filename.txt, вы добавили его на сцену по ошибке и хотите удалить файл из промежуточной, но не хотите потерять изменения.


6

Если вы просто хотите удалить подмножество изменений в вашем файле, вы можете использовать:

git reset -p

или

git reset -p <file_name>

Эта команда в основном обратная git add -p: она удалит только выбранные изменения из области подготовки. Я нахожу это чрезвычайно полезным для «добавления» чего-то, что я добавил по ошибке.


4

Если вы хотите удалить файлы по определенному шаблону, и вы используете git rm --cached, вы также можете использовать шаблоны файловых глобусов.

Смотрите здесь .


2

Ты хочешь:

  • Влияние на один файл

  • Удалить файл из области подготовки

  • Не удалять один файл из индекса

  • Не отменяй само изменение

и решение

git reset HEAD file_name.ext

или

git reset HEAD path/to/file/file_name.ext

2

Когда вы это сделаете git status, Git скажет вам, как выполнить unstatage:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Так git reset HEAD <file>сработало для меня, и изменения не были затронуты.


2

Я думаю, что вы, вероятно, запутались с понятием индекса , как заметил @CB Bailey:

Зона подготовки является индексом.

Вы можете просто рассматривать промежуточный каталог и индекс как одно и то же.
Так что, как и ответ @Tim Henigan , я думаю:

Вы просто хотите "отменить" то, git addчто было сделано для этого файла.



Вот мой ответ:

Как правило, есть два способа отменить операцию этапа , как уже упоминалось в других ответах:

git reset HEAD <file>

а также

git rm --cached <file>

Но в чем разница?

Предположим , что файл был поставлен и существует в рабочем каталоге также использовать , git rm --cached <file>если вы хотите , чтобы удалить его из устроив каталога , и сохранить файл в рабочем каталоге . Но обратите внимание, что эта операция не только удалит файл из промежуточного каталога, но также пометит файл как deletedв промежуточном каталоге , если вы используете

git status

после этой операции вы увидите это:

        deleted:    <file>

Это запись об удалении файла из промежуточного каталога . Если вы не хотите сохранять эту запись и просто хотите отменить предыдущую операцию файла, используйтеgit reset HEAD <file> вместо этого.


-------- КОНЕЦ ОТВЕТА --------

PS: я заметил несколько упомянутых ответов:

git checkout -- <file>

Эта команда для ситуации , когда файл был поставлен , но файл был изменен в рабочем каталоге после того, как она была поставлена, использовать эту операцию , чтобы восстановить файл в рабочем каталоге из устроив каталога . Другими словами, после этой операции изменения происходят в вашем рабочем каталоге , а НЕ в вашем промежуточном каталоге .


2

После версии 2.23Git ввел git restoreкоманду, которую вы можете использовать для этого. Цитирование официальной документации:

Восстановите указанные пути в рабочем дереве с некоторым содержимым из источника восстановления. Если путь отслеживается, но не существует в источнике восстановления, он будет удален в соответствии с источником.

Команду также можно использовать для восстановления содержимого в индексе с помощью --stagedили для восстановления как рабочего дерева, так и индекса с помощью --staged --worktree.

Таким образом, вы можете вызвать git restore --staged <path>и удалить файл, но также сохранить сделанные вами изменения. Помните, что если файл не был подготовлен, вы потеряете все внесенные в него изменения.


2

Для более новых версий Git есть git restore --staged <file>.

Когда я делаю git statusс версией Git, 2.26.2.windows.1это также рекомендуется для unstaging:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Этот пост показывает, что в более ранних версиях git reset HEADбыл рекомендован на данный момент)

Я очень рекомендую этот пост , объясняющий различия между git revert, git restoreи git resetа также дополнительные параметры git restore.


1

Если вы вносите изменения во многие отслеживаемые файлы, но хотите создать только несколько из них, выполните

git add .

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

и это не идеально делать кучу

git add path/to/file1 path/to/file2

если у вас много вложенных каталогов (что имеет место в большинстве проектов) - раздражает

Вот когда Git GUI полезен (вероятно, только когда я его использую). Просто откройте Git GUI, он показывает разделенные и неподготовленные разделы файла. Выберите из промежуточного раздела файлы, которые вы хотите удалить, и нажмите

Ctrl+U (для окон)

расшатать их.


0

Мой образец:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Как вы можете заметить

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

-1

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

git reset HEAD .

Предполагается, что вам нужно сбросить только один файл.



-10

git checkout -- <file>

Он отлично работает для удаления файлов из промежуточной области


4
как отмечено ниже, это отменяет изменения в файле, что на шаг дальше, чем хочет OP.
Столли

git rm flie.txt
Хуан Рамирес,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.