"git rm --cached x" vs "git reset head - x"?

GitRef.org - Основные:

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

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

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

Ответ 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 файла, и вы удалили файл из индекса. Теперь фиксация будет синхронизировать индекс и дерево, и файл будет удален.

Ответ 2

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

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

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