"Git rm - кешований x" проти "git reset head - x"?


163

GitRef.org - Основні :

git rmвидалить записи з місця постановки. Це дещо відрізняється від git reset HEADфайлів "нестабільності". Під "нестабільністю" я маю на увазі, що він повертає місце постановки до того, що було там, перш ніж ми почали змінювати речі. git rmз іншого боку, просто виштовхує файл повністю зі сцени, щоб він не був включений у наступний знімок фіксації, тим самим ефективно видаляючи його.

За замовчуванням, git rm fileфайл видалить файл з області інсценізації повністю, а також з вашого диска> (робочий каталог). Щоб залишити файл у робочому каталозі, ви можете використовувати git rm --cached.

Але в чому саме різниця між git rm --cached asdі git reset head -- asd?

Відповіді:


219

Є три місця, де може бути файл, скажімо, дерево - індекс та робоча копія. Коли ви просто додаєте файл до папки, ви додаєте його до робочої копії.

Коли ви робите щось на кшталт git add file, додаєте це до індексу. І коли ви це зробите, ви також додаєте його до дерева.

Можливо, це допоможе вам дізнатися ще три поширені прапорці в git reset:

git reset [- <mode>] [ <commit>]

Ця форма скидає поточну голову гілки <commit>та, можливо, оновлює індекс ( скидає його на дерево дерева <commit>) та робоче дерево залежно від <mode>, яке повинно бути одним із наступних:
--soft

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

- змішаний

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

- твердий

Скидає індекс і робоче дерево. Будь-які зміни відслідковуваних файлів у робочому дереві відтоді <commit>відкидаються.

Тепер, коли ви робите щось на кшталт git reset HEADтого, що ви насправді робите, це - git reset HEAD --mixedі він "скине" індекс до стану, який він був до того, як ви почали додавати файли / додавати модифікації до індексу (через git add). У цьому випадку робоча копія та індекс (або інсценізація) синхронізувались, але ви зробили HEAD та індекс синхронізованими після скидання.

git rmз іншого боку, видаляє файл із робочого каталогу та індексу, і коли ви здійснюєте, файл також видаляється з дерева. git rm --cachedоднак видаляє файл лише з індексу та зберігає його у робочій копії. Це якраз протилежне. git add file У цьому випадку ви зробили індекс, який відрізняється від HEAD та робочого, оскільки в ньому HEAD має попередньо скоєну версію файлу, робоча копія мала останню модифікацію, якщо така є або вміст від HEAD of файл, і ви видалили файл з індексу. Комісія зараз синхронізує індекс і дерево, і файл буде видалено.


Я помітив , що після того, як команда не показують відмінності, але показують відмінності, як ніби він все ще в кеш. Однак показує файл як . Начебто непослідовно. git rm --cachedgit diffgit diff --cachedgit statusUntracked
haridsv

7
Неважливо ... я повинен був використовувати git reset --mixed. Мене трохи збентежило твердження, яке git rm --cachedпротилежне git add. Якщо взяти буквально, це неправильно і може спричинити шкоду. У моєму випадку я використовував, git addщоб додати модифікований файл до області постановки і хотів, щоб протилежне до ", що додає", а не початкове додавання файлу. + Відповідь Грега Хьюгілла допомогла мені отримати більш чітку картину.
haridsv

12
Я вважаю використання робочої копії, дерева та робочого дерева трохи заплутаним. Чи є робоче дерево робочою копією чи деревом?
Нілв

3
Як згадував @haridsv, сказати, що git rm --cached"є прямо протилежною git add file", вводить в оману. git reset fileближче до того, щоб бути протилежністю git add file.
Метт Браун

@Nealv запізнілий, але для інших, хто знайде цю тему: робоча копія, дерево та робоче дерево стосуються одного і того ж (у контексті git).
De Novo

83

Можливо, допоможе приклад:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

проти

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

Зверніть увагу , що якщо ви нічого не змінилося ще , то друге зобов'язання не буде на самому ділі нічого робити.


3
Чи можете ви сказати мені, що означає це подвійний дефіс - після ГЛАВА насправді означає?
юва

30
@yuva: --використовується для відокремлення параметрів команд від імен файлів. Якби існували і гілка, і ім’я файлуasd , тоді git reset HEAD asdбуло б неоднозначно. --Каже «все наступне це ім'я файлу».
Грег Хьюгілл

Є git reset HEAD <file>такий самий , як git rm --cached <file>і тоді git add --intent-to-add <file>?
алкоголь злий

1
@alcoholisevil немає, за винятком спеціального випадку. Дивіться цю чудову, стислу відповідь.
De Novo

45

git rm --cached fileбуде видалити файл зі сцени. Тобто, коли ви скористаєтеся, файл буде видалений. git reset HEAD -- fileпросто скине файл в області постановки до стану, в якому він був на комісії HEAD, тобто скасує будь-які зміни, які ви зробили в ньому з моменту останнього внесення змін. Якщо ця зміна стане новим додаванням файлу, вони будуть еквівалентними.


7
У поєднанні з поняттям (як згадувалося в інших відповідях), яке ніби git rm --cached fileпротилежне git add, ця відповідь мала багато сенсу для мене і була досить лаконічною. Майже такий короткий, як цей коментар;)
rbatt

2
@rbatt просто для того, щоб поставити коментар і тут, і уточнити, git rm --cached fileце не протилежнеgit add file . Поведінка трапляється протилежно git add fileв конкретному випадку, коли ви додали новий, раніше не відстежений файл. У будь-якому іншому випадку протилежністю git add fileє git reset HEAD file. git reset HEAD fileтакож обертається git add fileв першому випадку (додаючи не відстежений файл), і в кожному випадку, саме тому саме git пропонує зробити, якщо ви хочете змінити додаток git.
De Novo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.