Як видалити один файл із області постановки (скасувати додавання git)?


1229

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

Питання: Як я можу видалити один із цих файлів із області постановки, але не видалити його з індексу або скасувати зміни до самого файлу?


40
Область постановки - це індекс, тож, можливо, ви могли б точно уточнити, що ви маєте на увазі?
CB Bailey


Відповіді:


1901

Якщо я правильно розумію питання, ви просто хочете "скасувати" те, git addщо було зроблено для цього файлу.

Якщо вам потрібно видалити один файл із області постановки, використовуйте

git reset HEAD -- <file>

Якщо вам потрібно видалити цілий каталог (папку) з області постановки, використовуйте

git reset HEAD -- <directoryName>

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

Детальну інформацію див. На git resetсторінці чоловіка .


41
Дякую ... Я щойно помітив, що це зазначено трохи вище поступових файлів. Здається, я так довго дивився на цей екран, що вибірково вибирав те, що хотів бачити.
ФЛАК

2
Це сприймає всі мої зміни, всупереч усім порадам, які я отримував де завгодно (сторінки чоловіків, тут, друзі та інші). Я продовжую думати, що одного разу він буде робити те, що рекламується, але ні.
rektide

6
Чи все-таки потрібно видалити файли з постановки, коли репо не було жодних зобов'язань?
Джаред Форсайт

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

3
@Jred Forsyth Для видалення файлу, який ніколи не зафіксований зі сцени, використовуйте команду git rm --cached FILE, запропоновану іншою відповіддю.
chmike

150
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
правда, але краще git resetтут використовувати, я думаю, оскільки ви можете випустити варіант --chached і швидко сумувати, використовуючи git rmкоманду :-) Якщо git resetви на безпечній стороні, якщо ви забудете додати "якусь опцію", це буде зберігайте зміни, щоб вони були "безпечнішими" для щоденного використання (я говорю про це git reset --hard).
Konrad 'ktoso' Малавський

20
Цей метод корисний, якщо у вас немає попередніх зобов'язань.
SomeKittens

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

1
Ця відповідь видає помилку, якщо ви видалили файл із робочого дерева.
Самуель Роберт

3
git rm --cachedпризведе до видалення файлу з індексу, тобто файл стане файлом без відстеження . Я не думаю, що цього хоче ОП. Будь ласка , дивіться пов'язану нитка тут: stackoverflow.com/questions/45047810 / ...
smwikipedia

88

git reset <file>

Працює, чи немає у вас попередніх зобов’язань.


53

Отож, незначна зміна відповіді Тіма Хенігана: потрібно використовувати - перед назвою файлу. Це виглядатиме так:

git reset HEAD -- <file>

6
Що робить --і навіщо її додавати? Я так git reset HEAD <file>і працював.
Паоло

15
--є своєрідним дільником. У випадку, якщо ім'я файлу нетрадиційне, наприклад, ( -fабо master) git інтерпретує його як аргумент командного рядка або ім'я гілки замість імені файлу. Дивіться тут
Андрій

3
Це працювало для мене там, де команда без - не сталася через відсутність попередніх комісій для цього файлу. Дякую.
Метт

17
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 підкаже, як нестабільно:

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

Так git reset HEAD <file>працювали для мене, і зміни не торкалися.


2

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

Область постановки - індекс.

Ви можете просто розглядати каталог та покажчик постановок як одне і те ж.
Отже, як і у відповіді @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.23, Git представив git restoreкоманду, яку ви можете використовувати для цього. Цитування офіційної документації:

Відновити вказані шляхи в робочому дереві з деяким вмістом від джерела відновлення. Якщо шлях відстежується, але його не існує у джерелі відновлення, його буде видалено відповідно до джерела.

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

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


1

Якщо ви вносите зміни до багатьох відслідковуваних файлів, але хочете лише встановити декілька з них, виконайте наступні дії

git add .

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

і це не ідеально робити купу

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

якщо у вас є багато вкладених каталогів (що трапляється у більшості проектів) - вас дратує

Ось тоді Git GUI є корисним (мабуть, лише коли я його використовую). Просто відкрийте Git GUI, він показує поетапні та нестандартні розділи файлів. Виберіть файли з поетапного розділу, який потрібно зняти, і натисніть

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

щоб їх знесилити.


1

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


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 хоче.
stolli

git rm flie.txt --cached
Хуан Рамірес

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.