Ответ 1
Есть три места, где файл, скажем, может быть - дерево, индекс и рабочая копия. Когда вы просто добавляете файл в папку, вы добавляете его в рабочую копию.
Когда вы делаете что-то вроде git add file
, вы добавляете его в индекс. И когда вы его совершаете, вы также добавляете его в дерево.
Вероятно, вам поможет узнать еще три общих флага в git reset:
git reset [-
<mode>
] [<commit>
]Эта форма сбрасывает текущую ветвь ветки на
<commit>
и, возможно, обновляет индекс (возвращая его в дерево<commit>
) и рабочее дерево в зависимости от<mode>
, которое должно быть одним из следующее:
- мягкийНе касается файла индекса или рабочего дерева вообще (но сбрасывает голова до
<commit>
, как и все режимы). Это оставляет все ваши измененные файлы "Изменения должны быть зафиксированы", как сказал бы статус git.- смешанный
Сбрасывает индекс, но не рабочее дерево (т.е. измененные файлы сохраняются, но не помечены для фиксации) и сообщает, что не было обновлено. Это действие по умолчанию.
- жесткий
Сбрасывает индекс и рабочее дерево. Любые изменения в отслеживаемых файлах в рабочее дерево с
<commit>
отбрасывается.
Теперь, когда вы делаете что-то вроде git reset HEAD
- то, что вы на самом деле делаете, это git reset HEAD --mixed
, и индекс будет git add) В этом случае рабочая копия и индекс (или этап) были синхронизированы, но вы сделали HEAD и индекс для синхронизации после reset.
git rm
, с другой стороны, удаляет файл из рабочего каталога и индекса, а когда вы его фиксируете, файл также удаляется из дерева. git rm --cached
однако удаляет файл только из индекса и сохраняет его в вашей рабочей копии. Это полная противоположность git add file
. В этом случае вы указали, что индекс отличается от HEAD и работы, в том, что HEAD имеет ранее зафиксированную версию файла, рабочая копия имеет модификацию las, если любой или содержимое из HEAD файла, и вы удалили файл из индекса. Теперь фиксация будет синхронизировать индекс и дерево, и файл будет удален.