Как удалить один файл из промежуточной области Git, но не удалить его из индекса или отменить изменения самого файла?

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

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

20 ответов

Решение

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

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

Увидеть git reset Страница man для деталей.

git rm --cached FILE

,

git rm -r --cached CVS */CVS

git reset <file>

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

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

git reset HEAD -- <file>

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

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

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

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

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

git reset filename.txt

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

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

git reset -p

или же

git reset -p <file_name>

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

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

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

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

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

Я думаю, ты мог бы пойти на

git restore --staged <path/to/file_name>

Я думаю, что вы, вероятно, запутались с понятием индекса, как заметил @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>

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

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

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

Когда вы делаете git statusGit говорит вам, как выполнить unstatage:

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

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

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

      git checkout -- <file>

Ты хочешь:

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

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

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

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

и решение

git reset HEAD file_name.ext

или же

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

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

git add .

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

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

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

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

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

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

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

Мой образец:

$ 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)

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

git reset HEAD .

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

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

git reset HEAD -- .

git checkout -- <file>

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

В моем случае я делаю

git checkout -- FILE
Другие вопросы по тегам