Есть три места, где, скажем, может находиться файл - (зафиксированное) дерево, индекс и рабочая копия. Когда вы просто добавляете файл в папку, вы добавляете его в рабочую копию.
Когда вы делаете что-то вроде git add file
, вы добавляете его в индекс. И когда вы его фиксируете, вы также добавляете его в дерево.
Вероятно, это поможет вам узнать еще три общих флага в git reset
:
git reset [--<mode>
] [<commit>
]
Эта форма сбрасывает текущий заголовок ветки на <commit>
и, возможно, обновляет индекс (сбрасывая его на дерево <commit>
) и рабочее дерево в зависимости от <mode>
, которое должно быть одним из следующих:
--soft< /сильный>
Не трогает ни индексный файл, ни рабочее дерево (но сбрасывает голову на <commit>
, как и все моды). Это оставляет все ваши измененные файлы. Изменения должны быть зафиксированы, как сказал бы статус git.
--смешанный
Сбрасывает индекс, но не рабочее дерево (т. е. измененные файлы сохраняются, но не помечаются для фиксации) и сообщает, что не было обновлено. Это действие по умолчанию.
--сложно
Сбрасывает индекс и рабочее дерево. Любые изменения отслеживаемых файлов в рабочем дереве с <commit>
отбрасываются.
Теперь, когда вы делаете что-то вроде git reset HEAD
, на самом деле вы делаете git reset HEAD --mixed
, и он сбрасывает индекс до состояния, которое было до того, как вы начали добавлять файлы/добавлять изменения в индекс (через git add
). В этом случае, в каком бы состоянии ни была рабочая копия, вы не изменили ее ни на один бит, но изменили индекс таким образом, что теперь он синхронизирован с ГОЛОВКОЙ дерева. Независимо от того, использовался ли git add
для подготовки ранее зафиксированного, но измененного файла или для добавления нового (ранее неотслеживаемого) файла, git reset HEAD
является полной противоположностью git add
.
git rm
, с другой стороны, удаляет файл из рабочего каталога и индекса, а при фиксации файл также удаляется из дерева. git rm --cached
, однако, удаляет файл только из индекса и сохраняет его в вашей рабочей копии. В этом случае, если файл был ранее зафиксирован, вы сделали индекс отличным от HEAD дерева и рабочей копии, так что HEAD теперь имеет ранее зафиксированная версия файла, в индексе вообще нет файла, а рабочая копия имеет последнюю его модификацию. Коммит теперь синхронизирует индекс и дерево, и файл будет удален из дерева (оставив его без отслеживания в рабочей копии). Если для добавления нового (ранее неотслеживаемого) файла использовалось git add
, то git rm --cached
является полной противоположностью git add
(и практически идентично git reset HEAD
).
Git 2.25 представил новую команду для этих случаев, git restore
, но начиная с Git 2.28 она описывается как «экспериментальная» на странице руководства в том смысле, что поведение может измениться.
person
manojlds
schedule
27.04.2011