Ситуация: у меня есть Git-репозиторий с файлами уже в индексе. Я делаю изменения в нескольких файлах, открываю Git и добавляю эти файлы в мою область с помощью «git add».
Вопрос: Как удалить один из этих файлов из области подготовки, но не удалить его из индекса или отменить изменения в самом файле?
git
version-control
staging
PHLAK
источник
источник
Ответы:
Если я правильно понимаю вопрос, вы просто хотите «отменить» то,
git add
что было сделано для этого файла.Если вам нужно удалить один файл из области подготовки, используйте
git reset HEAD -- <file>
Если вам нужно удалить весь каталог (папку) из области подготовки, используйте
git reset HEAD -- <directoryName>
Ваши модификации будут сохранены. При запуске
git status
файл снова будет отображаться как измененный, но еще не подготовленный.Смотрите
git reset
man-страницу для подробностей.источник
git rm --cached FILE
предложенную другим ответом.,
источник
git reset
здесь, я думаю, так как вы можете опустить опцию --chached и быстро огорчиться с помощьюgit rm
команды :-) Еслиgit reset
вы в безопасности, если вы забудете добавить «некоторую опцию», это сохранить изменения, чтобы они были «безопаснее» для ежедневного использования (я говорю оgit reset --hard
).git rm --cached FILE
Этапы удаления файла, без удаления файла из рабочего дерева. Это отличается от вопроса, который был о уничтоженииgit add
.git rm --cached
приведет к удалению файла из индекса, то есть файл станет неотслеживаемым . Я не думаю, что это то, чего хочет ОП. Пожалуйста, смотрите связаннуюgit reset <file>
Работает, есть ли у вас какие-либо предыдущие коммиты.
источник
Итак, небольшой тим к ответу Тима Хенигана: нужно использовать - перед именем файла. Это будет выглядеть так:
источник
--
и зачем его добавлять? Я сделал,git reset HEAD <file>
и это сработало.--
это своего рода разделитель. В случае, если имя файла нетрадиционно, например (-f
илиmaster
) git интерпретирует его как аргумент командной строки или имя ветви вместо имени файла. Смотрите здесьЕсли у вас есть изменение в filename.txt, вы добавили его на сцену по ошибке и хотите удалить файл из промежуточной, но не хотите потерять изменения.
источник
Если вы просто хотите удалить подмножество изменений в вашем файле, вы можете использовать:
или
Эта команда в основном обратная
git add -p
: она удалит только выбранные изменения из области подготовки. Я нахожу это чрезвычайно полезным для «добавления» чего-то, что я добавил по ошибке.источник
Если вы хотите удалить файлы по определенному шаблону, и вы используете
git rm --cached
, вы также можете использовать шаблоны файловых глобусов.Смотрите здесь .
источник
Ты хочешь:
Влияние на один файл
Удалить файл из области подготовки
Не удалять один файл из индекса
Не отменяй само изменение
и решение
или
источник
Когда вы это сделаете
git status
, Git скажет вам, как выполнить unstatage:Так
git reset HEAD <file>
сработало для меня, и изменения не были затронуты.источник
Я думаю, что вы, вероятно, запутались с понятием индекса , как заметил @CB Bailey:
Вы можете просто рассматривать промежуточный каталог и индекс как одно и то же.
Так что, как и ответ @Tim Henigan , я думаю:
Вот мой ответ:
Как правило, есть два способа отменить операцию этапа , как уже упоминалось в других ответах:
а также
Но в чем разница?
Предположим , что файл был поставлен и существует в рабочем каталоге также использовать ,
git rm --cached <file>
если вы хотите , чтобы удалить его из устроив каталога , и сохранить файл в рабочем каталоге . Но обратите внимание, что эта операция не только удалит файл из промежуточного каталога, но также пометит файл какdeleted
в промежуточном каталоге , если вы используетепосле этой операции вы увидите это:
Это запись об удалении файла из промежуточного каталога . Если вы не хотите сохранять эту запись и просто хотите отменить предыдущую операцию файла, используйте
git reset HEAD <file>
вместо этого.-------- КОНЕЦ ОТВЕТА --------
PS: я заметил несколько упомянутых ответов:
git checkout -- <file>
Эта команда для ситуации , когда файл был поставлен , но файл был изменен в рабочем каталоге после того, как она была поставлена, использовать эту операцию , чтобы восстановить файл в рабочем каталоге из устроив каталога . Другими словами, после этой операции изменения происходят в вашем рабочем каталоге , а НЕ в вашем промежуточном каталоге .
источник
После версии
2.23
Git ввелgit restore
команду, которую вы можете использовать для этого. Цитирование официальной документации:Таким образом, вы можете вызвать
git restore --staged <path>
и удалить файл, но также сохранить сделанные вами изменения. Помните, что если файл не был подготовлен, вы потеряете все внесенные в него изменения.источник
Для более новых версий Git есть
git restore --staged <file>
.Когда я делаю
git status
с версией Git,2.26.2.windows.1
это также рекомендуется для unstaging:( Этот пост показывает, что в более ранних версиях
git reset HEAD
был рекомендован на данный момент)Я очень рекомендую этот пост , объясняющий различия между
git revert
,git restore
иgit reset
а также дополнительные параметрыgit restore
.источник
Если вы вносите изменения во многие отслеживаемые файлы, но хотите создать только несколько из них, выполните
git add .
не всегда выгодно (или рекомендуется) - поскольку он отслеживает все отслеживаемые файлы (в некоторых случаях вы хотите сохранить изменения только для себя и не хотите вносить их в удаленный репозиторий).
и это не идеально делать кучу
git add path/to/file1 path/to/file2
если у вас много вложенных каталогов (что имеет место в большинстве проектов) - раздражает
Вот когда Git GUI полезен (вероятно, только когда я его использую). Просто откройте Git GUI, он показывает разделенные и неподготовленные разделы файла. Выберите из промежуточного раздела файлы, которые вы хотите удалить, и нажмите
расшатать их.
источник
Мой образец:
Как вы можете заметить
источник
Вы должны быть в каталоге файла, а затем ввести следующее в терминал
Предполагается, что вам нужно сбросить только один файл.
источник
Чтобы удалить все сразу, запустите эту команду
источник
git checkout -- <file>
Он отлично работает для удаления файлов из промежуточной области
источник
В моем случае я делаю
источник