Почему проверка и reset изменяют индекс?

Я думал, что индекс предназначен только для файлов, которые вы поставили для следующего коммита, но оба reset и checkout также обновляют индекс:

git checkout

Чтобы подготовиться к работе, переключитесь на него, обновив индекс и файлы в рабочем дереве,

Ответ 1

Идея состоит в том, что git всегда фиксирует моментальные снимки текущего состояния, а не просто diff. Поэтому при выполнении проверки индекс будет обновлен, чтобы содержать моментальный снимок того, что вы только что проверили, и затем вы меняете добавление файлов/изменений.

Мой вопрос заключается в том, что я работал под неправильным предположением, что в индекс будут добавлены изменения.

Ответ 2

  • git reset может изменить только HEAD (git reset --soft) или HEAD и индекс (по умолчанию), или HEAD индекс и рабочее дерево (git reset --hard).
  • git checkout может изменить индекс только при переключении ветки, чтобы вы начали ставить свою работать против содержимого этой ветки.

Это обсуждение указывает, почему checkout изменяет индекс:

мое понимание индекса состоит в том, что он является средним человеком для:

  • перемещение объектов из вашего рабочего дерева в хранилище объектов
  • И для перемещения объектов из хранилища объектов в рабочее дерево.

Поэтому, когда вы проверяете blob, он сначала копируется из хранилища объектов в ваш индекс, а затем из индекса в ваше дерево.


torek упоминает в комментариях что-то, что отражает другую часть того же потока:

Обратите внимание, что вы можете обойти запись через индекс, используя git show, чтобы извлечь файл:

git show HEAD~3:file > file 

перезапишет версию рабочего каталога file, так же, как git checkout HEAD~3 -- file, но не обновит индекс.

Я представляю git show более подробно на странице Как получить один файл из определенной версии в Git?".

Обратите внимание, что git-show не применяет фильтры к файлу (smudge/clean или любые пользовательские).

Ответ 3

После чистой проверки или reset содержимое HEAD совпадает с индексом и содержимым рабочего дерева.

Впоследствии вы обычно меняете свое рабочее дерево, затем обновляете индекс с помощью git add и, наконец, превращаете полученный индекс в фиксацию с помощью git commit.

Индекс работает очень похоже на ваше рабочее дерево: вы начинаете с содержимого текущей фиксации, изменяете некоторые файлы и, наконец, делаете результат фиксацией.

Если вы измените текущую фиксацию с помощью git checkout или git reset, индекс должен измениться, чтобы вы могли изменить его, чтобы создать новую фиксацию.