Я думал, что индекс предназначен только для файлов, которые вы поставили для следующего коммита, но оба reset и checkout также обновляют индекс:
Чтобы подготовиться к работе, переключитесь на него, обновив индекс и файлы в рабочем дереве,
Я думал, что индекс предназначен только для файлов, которые вы поставили для следующего коммита, но оба reset и checkout также обновляют индекс:
Чтобы подготовиться к работе, переключитесь на него, обновив индекс и файлы в рабочем дереве,
Идея состоит в том, что git всегда фиксирует моментальные снимки текущего состояния, а не просто diff. Поэтому при выполнении проверки индекс будет обновлен, чтобы содержать моментальный снимок того, что вы только что проверили, и затем вы меняете добавление файлов/изменений.
Мой вопрос заключается в том, что я работал под неправильным предположением, что в индекс будут добавлены изменения.
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 или любые пользовательские).
После чистой проверки или reset содержимое HEAD совпадает с индексом и содержимым рабочего дерева.
Впоследствии вы обычно меняете свое рабочее дерево, затем обновляете индекс с помощью git add
и, наконец, превращаете полученный индекс в фиксацию с помощью git commit
.
Индекс работает очень похоже на ваше рабочее дерево: вы начинаете с содержимого текущей фиксации, изменяете некоторые файлы и, наконец, делаете результат фиксацией.
Если вы измените текущую фиксацию с помощью git checkout
или git reset
, индекс должен измениться, чтобы вы могли изменить его, чтобы создать новую фиксацию.