"git rm --cached x" против "git reset head - x"? - PullRequest
139 голосов
/ 27 апреля 2011

GitRef.org - Basic :

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

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

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

Ответы [ 3 ]

195 голосов
/ 27 апреля 2011

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

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

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

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

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

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

- смешанный

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

- жесткий

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

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

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

70 голосов
/ 27 апреля 2011

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

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"

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

37 голосов
/ 27 апреля 2011

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

...