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

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

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


person PHLAK    schedule 01.10.2009    source источник
comment
Промежуточная область является индексом, так что, возможно, вы могли бы уточнить, что именно вы имеете в виду?   -  person CB Bailey    schedule 01.10.2009
comment
stackoverflow.com/questions/348170/undo-git-add -before-commit   -  person santiagobasulto    schedule 22.06.2012
comment
Возможный дубликат Как отменить команду «git add» перед фиксацией?   -  person TungstenX    schedule 21.09.2018


Ответы (18)


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

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

Дополнительные сведения см. На git reset странице руководства.

person Tim Henigan    schedule 01.10.2009
comment
Спасибо ... Я только что заметил, что это указано прямо над постановочными файлами. Думаю, я так долго смотрел на этот экран, что выборочно выбирал то, что хотел увидеть. - person PHLAK; 02.10.2009
comment
Это отменяет все мои изменения, вопреки всем советам, которые я где-либо получал (страницы руководства, здесь, друзья и т. Д.). Я все думаю, что когда-нибудь он будет делать то, что рекламируется, но нет. - person rektide; 28.06.2013
comment
Есть ли способ удалить файлы из постановки, если не было никаких коммитов в репо? - person Jared Forsyth; 29.06.2013
comment
быстрый совет @JaredForsyth попробуйте rm -rf .git, если ваш репозиторий только что создан, затем используйте git init для воссоздания пустого репозитория, но только в том случае, если ваше репо (локальное репо) полностью пусто без каких-либо коммитов - person David; 06.06.2015
comment
Я действительно думаю, что добавление -- делает ответ более полным, это заставляет git интерпретировать исходящий текст как имя файла - person stolli; 07.08.2015
comment
@Jared Forsyth Чтобы удалить файл, который никогда не фиксировался со сцены, используйте команду git rm --cached FILE, как было предложено в другом ответе. - person chmike; 17.01.2016
comment
Ваааай нелогично, но работает. Я бы подумал, что для отмены добавления это будет что-то вроде git add -r ‹file›. Но это мерзавец! - person SMBiggs; 04.03.2016
comment
синтаксис git reset HEAD -- <file> не работает! Лучше было бы использовать git reset HEAD <filename> [без -] - person sheetal; 18.07.2018
comment
запутанный способ сообщения о неустановленных изменениях после фиксации заставил меня сначала подумать, что это не работает. - person simon coleman; 12.12.2018
comment
Это также работало для меня без двойного тире, например. git reset HEAD <filePath> - person jmm; 20.03.2019
comment
Это мне помогло. Я запутался между rm --cache и reset. Спасибо. :) - person Kumar Rohit; 11.03.2021

git reset <file>

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

person MTS    schedule 13.08.2013

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

git reset HEAD -- <file>
person GuerillaNerd    schedule 21.02.2014
comment
Что делает -- и зачем его добавлять? Я сделал git reset HEAD <file>, и это сработало. - person Paolo; 03.03.2014
comment
-- - это своего рода разделитель. Если имя файла нестандартное, например (_ 2_ или master), git интерпретирует его как аргумент командной строки или имя ветки вместо имени файла. См. здесь - person Andrew; 25.07.2014
comment
Это сработало для меня, когда команда без - не из-за отсутствия предыдущих коммитов для этого файла. Спасибо. - person Matt; 06.12.2014

git reset filename.txt

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

person Vlad Cioaba    schedule 20.03.2018

Для более новых версий 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.

person Ruik    schedule 11.05.2020
comment
Это должен быть принятый ответ. - person Matt F.; 03.03.2021
comment
Начиная с версии 2.23: infoq.com/news/2019/ 08 / git-2-23-switch-restore - person Gringo Suave; 09.04.2021

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

git reset -p

or

git reset -p <file_name>

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

person fede1024    schedule 17.02.2017

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

См. здесь .

person thilinarmtb    schedule 04.01.2014

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

Промежуточная область - это индекс.

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

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



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

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

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>

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

person Wulfric Lee    schedule 22.02.2019

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

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

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

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

person Mike    schedule 30.03.2020

Когда вы делаете git status, Git сообщает вам, как отключить сцену:

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

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

person Community    schedule 08.05.2018

Ты хочешь:

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

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

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

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

и решение

git reset HEAD file_name.ext

or

git reset HEAD path/to/file/file_name.ext
person Do Nhu Vy    schedule 31.10.2017

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

git add .

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

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

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

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

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

Ctrl+U (для windows)

чтобы отключить их.

person rite2hhh    schedule 10.08.2018

Мой образец:

$ 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)
person Khang Azun    schedule 29.10.2019

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

git checkout -- <file>
person Mehdi Kazemi    schedule 06.12.2020
comment
это работает, только если вы пытаетесь отменить изменения в файле, который не был подготовлен. Если вы хотите отменить изменения файла, который является этапами, вам сначала нужно git reset HEAD -- <file> перед запуском вашей команды. - person lucasreta; 03.03.2021

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

git reset HEAD .

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

person nevosial    schedule 26.09.2017

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

git reset HEAD -- .
person Devendra Verma    schedule 06.09.2016
comment
После этого добавлять файлы нельзя. - person basickarl; 12.09.2016

git checkout -- <file>

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

person Juan Ramirez    schedule 18.05.2015
comment
как указано ниже, это отменяет изменения в файле, который идет на шаг дальше, чем того хочет OP. - person stolli; 07.08.2015
comment
git rm flie.txt --cached - person Juan Ramirez; 09.08.2015

person    schedule
comment
правда, но я думаю, что здесь лучше использовать git reset, поскольку вы можете опустить параметр --chached и быстро расстроиться, используя команду git rm :-) С git reset вы в безопасности, если вы забудете добавить какой-то параметр, это собираюсь сохранить сдачу, чтобы она была безопаснее для повседневного использования (я говорю о git reset --hard). - person Konrad 'ktoso' Malawski; 06.03.2011
comment
Этот метод полезен, если у вас нет предыдущих коммитов. - person SomeKittens; 03.04.2013
comment
git rm --cached FILE этапы удаления файлов, не удаляя файл из рабочего дерева. Это отличается от вопроса об отмене git add. - person Sampo Smolander; 18.08.2015
comment
Этот ответ вызывает ошибку, если вы удалили файл из рабочего дерева. - person Samuel Robert; 19.10.2016
comment
git rm --cached приведет к удалению файла из индекса, т.е. файл станет неотслеживаемым файлом. Я не думаю, что OP хочет этого. См. Связанную тему здесь: stackoverflow.com/questions/45047810/ - person smwikipedia; 12.07.2017
comment
это просто сделает файл неотслеживаемым. добавленный файл с помощью git add по-прежнему остается в стадии постановки. - person infoclogged; 11.08.2017