Подтвердить что ты не робот

Какая разница между индексом, кэшированием и постановкой в ​​git?

Это то же самое? Если да, то почему существует так много терминов?!

Кроме того, я знаю, что есть эта вещь под названием git stash, где вы можете временно сохранить изменения в своей рабочей копии, не передавая их на репо. Я считаю, что этот инструмент действительно полезен, но опять же, имя очень похоже на кучу других понятий в git → , это очень запутывает!!

4b9b3361

Ответ 1

Индекс/стадия/кеш - это одно и то же: поскольку для многих терминов я считаю, что индекс был "исходным" термином, но люди считали его запутанным, поэтому были введены другие условия. И я согласен, что иногда это немного путает.

Объект stash git - это способ хранения "незавершенной" работы, которую вы не хотите фиксировать прямо сейчас в объекте фиксации, который хранится в конкретном каталоге/базе данных). Основная команда stash будет хранить незафиксированные изменения, внесенные в рабочий каталог (как кэшированные/поставленные, так и неэкранированные/неустановленные изменения), а затем вернет рабочий каталог HEAD.

Это не связано с индексом /stage/cache, за исключением того, что он сохранит незафиксированные изменения, которые находятся в кеше.

Это позволяет быстро сохранить состояние грязной рабочей директории и индекса, чтобы вы могли выполнять другую работу в чистой среде. Позже вы можете вернуть информацию в объект stash и применить ее к своему рабочему каталогу (даже если сам рабочий каталог находится в другом состоянии).

Официальная git stash manpage имеет довольно хорошую деталь, оставаясь понятной. Он также имеет хорошие примеры сценариев использования stash.

Ответ 2

Это очень запутанно. Эти три слова используются взаимозаменяемо. Здесь я понимаю, почему он назвал каждую из этих вещей. Индекс git:

  • двоичный файл .git/index, который является индексом всех отслеживаемых файлов
  • используется как промежуточная область для фиксации
  • содержит кешированные хэши SHA1 для файлов (ускоряет работу)

Важно отметить, что индекс /cache/stage содержит список ВСЕХ файлов под контролем источника, даже без изменений. К сожалению, фразы, такие как "добавить файл в индекс" или "файл, поставленный в индекс", могут ввести в заблуждение, что индекс содержит только измененные файлы.

Здесь показано, что индекс git содержит список ВСЕХ файлов, а не только измененные файлы:

# setup
git init

echo 'x' > committed.txt
git add committed.txt
git commit -m 'initial'

echo 'y' > staged.txt
git add staged.txt

echo 'z' > working.txt

# list HEAD
git ls-tree --name-only -r HEAD
# committed.txt

# list index
git ls-files
# committed.txt
# staged.txt

# raw content of .git/index
strings .git/index
# DIRC
# committed.txt
# staged.txt
# TREE

# list working dir
ls -1
# committed.txt
# staged.txt
# working.txt

Дополнительное чтение:

https://www.kernel.org/pub/software/scm/git/docs/technical/racy-git.txt

Что содержит индекс git ТОЧНО?