Как удалить один файл из промежуточной области Git, но не удалить его из индекса или отменить изменения самого файла?
Ситуация: у меня есть репозиторий Git с файлами уже в индексе. Я делаю изменения в нескольких файлах, открываю Git и добавляю эти файлы в мою область с помощью "git add".
Вопрос: Как удалить один из этих файлов из области подготовки, но не удалить его из индекса или отменить изменения в самом файле?
20 ответов
Если я правильно понимаю вопрос, вы просто хотите "отменить" git add
это было сделано для этого файла.
Если вам нужно удалить один файл из области подготовки, используйте
git reset HEAD -- <file>
Если вам нужно удалить весь каталог (папку) из области подготовки, используйте
git reset HEAD -- <directoryName>
Ваши модификации будут сохранены. Когда ты бежишь git status
файл снова будет отображаться как измененный, но еще не подготовленный.
Увидеть git reset
Страница man для деталей.
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 status
Git говорит вам, как выполнить 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>
Он отлично работает для удаления файлов из промежуточной области