& quot; git rm --cached x & quot; vs & git reset head - x & quot ;?

GitRef. org - Basic :

git rm удалит записи из плацдарм. Это немного по-другому от git reset HEAD который "unstages" файлы. Под "неустановленным" я подразумеваю, что это возвращается площадка для того, что там было прежде чем мы начали изменять вещи. git rm с другой стороны просто пинает файл со сцены целиком, так что это не входит в следующий сделать снимок, тем самым эффективно удаляя его.

По умолчанию git rm file полностью удалит файл из области подготовки, а также с вашего диска & gt; (рабочий каталог). Чтобы оставить файл в рабочем каталоге, вы можете использовать git rm --cached.

Но в чем именно разница между git rm --cached asd и git reset head -- asd?

вопрос задан 27.04.2011
Pacerier
42087 репутация

3 ответов


  • 169 рейтинг

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

    Когда вы делаете что-то вроде git add file, вы добавляете его в индекс. И когда вы делаете это, вы также добавляете это в дерево.

    Это, вероятно, поможет вам узнать еще три распространенных флага в git reset:

    git reset [- ] []

    Эта форма сбрасывает текущую головку ветви на и, возможно, обновляет индекс (сбрасывая его на дерево ) и рабочее дерево в зависимости от , который должен быть одним из следующее:
    --soft

    Не затрагивает ни индексный файл, ни рабочее дерево (но сбрасывает голова до , как и во всех режимах). Это оставляет все ваши измененные файлы "Изменения должны быть зафиксированы", как будет указано в git status.

    - смешанный

    Сбрасывает индекс, но не рабочее дерево (т.е. е. , измененные файлы сохраняются, но не помечаются для фиксации) и сообщает, что не было обновлено. Это действие по умолчанию.

    - жесткий

    Сбрасывает индекс и рабочее дерево. Любые изменения в отслеживаемых файлах в рабочее дерево с отбрасывается.

    Теперь, когда вы делаете что-то вроде git reset HEAD - то, что вы на самом деле делаете, это git reset HEAD --mixed, и он «сбрасывает» индекс в состояние, в котором он находился до того, как вы начали добавлять файлы / добавлять модификации в индекс (через git add) В этом случае рабочая копия и индекс (или подготовка) были синхронизированы, но вы произвели синхронизацию HEAD и индекса после сброса.

    git rm, с другой стороны, удаляет файл из рабочего каталога и индекса, а когда вы фиксируете файл, он также удаляется из дерева. Однако git rm --cached удаляет файл только из индекса и сохраняет его в вашей рабочей копии. Это полная противоположность git add file . В этом случае вы сделали индекс отличным от HEAD и рабочего, так как HEAD имеет ранее зафиксированную версию файла, рабочая копия имеет модификацию las, если таковая имеется, или содержимое из HEAD файла, и вы удалили файл из индекса. Коммит сейчас синхронизирует индекс и дерево, и файл будет удален.

    ответ дан manojlds, с репутацией 205779, 27.04.2011
  • 63 рейтинг

    Возможно, пример поможет:

    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"
    

    Обратите внимание, что если вы ничего не изменили , иначе , второй коммит на самом деле ничего не сделает.

    ответ дан Greg Hewgill, с репутацией 645957, 27.04.2011
  • 28 рейтинг

    git rm --cached file будет удалить файл со сцены. То есть при фиксации файл будет удален. git reset HEAD -- file просто сбросит файл в промежуточной области в состояние, в котором он находился в коммите HEAD, т.е. е. отменяет любые изменения, которые вы внесли в него с момента последней фиксации. Если это изменение происходит при добавлении файла, то они будут эквивалентны.

    ответ дан yuriks, с репутацией 794, 27.04.2011