Як видалити файл з індексу в git?


355

Як видалити файл з індексу (= інсценізація області = кеш), не видаляючи його з файлової системи?


5
Ви маєте на увазі "скинути те, що було раніше" або "видалити, тому що я більше не хочу цього файлу"?
Ендрю Ейлетт

У моєму випадку це те саме, що файл раніше не існував ...
hcs42

Відповіді:


504

Ти хочеш:

git rm --cached [file]

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


8
Це також чудово підходить, якщо, наприклад, ви випадково зареєструвались у деяких проміжних проміжках або локальних файлах конфігурації, які не перетворили його на ваш .gitignore; використовуйте, git rm --cachedщоб видалити їх з репо, додайте відповідні файли чи каталоги в .gitignore, стадію та виконувати як звичайне. Вони не пітимуть із репо, але залишаться недоторканими у вашому місцевому дереві, і ви випадково не завітаєте до них знову.
Іонокласт Брігхем

22
Це також видаляє файл з репо (віддаленого) після здійснення та натискання.
порошок366

6
Це не видаляє його з індексу, але позначає його як видалене в індексі.
JotaBe

4
Ця відповідь, швидше за все, помилкова, оскільки вона видаляє файл з репо (як уже було зазначено @ Pow366), що не є наміченим результатом.
otomo

1
Це рішення не спрацювало для мене. Він позначив вказаний файл видаленим, а потім видаляє його з локального репо.
paiego

134

Це повинно змінити <file> для вас (не видаляючи або іншим чином змінюючи файл):

git reset <file>

6
Це видаляє останню зміну для конкретного файлу, але зберігає його в репо (віддаленому) після фіксації та натискання.
порошок366

1
Це відповідь, яку я шукав. Зауважте, що не потрібно вказувати HEAD.
Майкл Дорст

Хороший момент @MichaelDorst. Я оновив відповідь, щоб пропустити HEAD!
Девід Андерхілл

3
git reset HEAD <file> 

для видалення певного файлу з індексу.

і

git reset HEAD

для видалення всіх індексованих файлів.


1

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

Просто використовуйте один із інструментів на основі GUI, що підтримують управління індексами, наприклад:

  • git gui <- використовує рамку вікон Tk - подібний до стилю gitk
  • git cola <- більш сучасний інтерфейс GUI

Вони дозволяють переміщувати файли в індекс та поза ним, клацаючи вказівкою миші. Вони навіть мають підтримку вибору та переміщення частин файлу (окремі зміни) до та з індексу.


Як щодо іншої точки зору: Якщо ви заплутаєтесь під час використання однієї із запропонованих, досить загадкових команд:

  • git rm --cached [file]
  • git reset HEAD <file>

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


Робота без індексу

На основі коментарів і голосів я зрозумів, що дуже багато людей весь цей індекс використовують. Я не. Ось як:

  • Введіть всю мою робочу копію (типовий випадок): git commit -a
  • Введіть лише кілька файлів: git commit (list of files)
  • Введіть усі файли, окрім кількох модифікованих, git commit -aа потім внесіть зміни черезgit gui
  • Графічно перегляньте всі зміни робочої копії: git difftool --dir-diff --tool=meld

@Martin: Я думаю, це залежить від вашого робочого процесу. У своєму підході я ніколи не використовую індекс безпосередньо. Коли я хочу зберегти свою роботу, я просто виконую повні зобов’язання git commit -a. Коли я відповідав на це запитання, це було через те, що я зробив (екзотичний) " зворотний вишневий вибір ", який ставить файли в індекс для вас, але я хотів відредагувати файл, перш ніж зробити це. Я вийняв файл із індексу, поки редагував його, щоб розмінники працювали так, як я звик.
nobar

мій випадок використання був дуже вузьким і марним: створити гілку; додайте папку, заповнену файлами лише для відділення; перейти до ведучого; злиття; ops, додано неправильну папку для освоєння, додайте її до gitignore; Файли не будуть видалені з комісії, кращим рішенням буде просто використання rmвідразу, але я спершу подумав, що перемикання гілок не вб'є ігноровану папку. але ... я використовую інструмент github "gui", який досить добре для мене, і я підтримую деяке управління індексами, за винятком того, що це не підтримує. так що, я повинен використовувати 2 gui для вузького використання? досі не можу погодитися з відповіддю.
Крего

3
Це рішуче непопулярна відповідь. Однак я впевнений, що підхід, який я пропоную, є правильним для деяких людей (включаючи і мене). Я використовую один із цих інструментів для маніпулювання індексом кілька разів на рік.
nobar

1
Нині редактори програмування та IDE, ймовірно, підтримують графічну маніпуляцію індексами. Принаймні, є Atom GitHub .
nobar

1
Я віддаю перевагу інтерфейс cli через gui будь-який день, хоча його більш небезпечно. Це дозволить мені використовувати git навіть без gui, що мені подобається (замість того, щоб втратити, коли я не можу встановити такі інструменти на віддалений сервер, наприклад). Все, що говорило, що ця відповідь цілком справедливий і не заслуговує на "елітарні" кліти, а також +1 за надання хорошої гі-альтернативи!
SidOfc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.