Является ли область размещения Git просто индексом?
В книге Pro Git говорится, что промежуточная область была просто списком или индексом, в котором говорится, какие файлы будут зафиксированы, когда git commit
сделано, и теперь имя index
более известен как "область подготовки".
Но если мы изменим файл foo.txt
это уже является частью репо, и использовать git add foo.txt
чтобы подготовить его и снова изменить файл, теперь файл является "подготовленным" и "измененным" (как видно из git status
), и если мы сделаем коммит, "постановочная" версия войдет в коммит. Второе редактирование не пойдет.
Так как же "промежуточная область" отслеживать, каким было первое редактирование, если это просто индекс - список файлов?
6 ответов
Индекс - это представление вашего рабочего каталога, которое готово к фиксации. Его можно рассматривать как состояние предварительной фиксации и не так просто, как "список файлов". Когда вы делаете git add
файл (с изменением) добавляется в индекс, и более новые изменения не будут видны, пока вы не добавите их тоже.
index
это как корзина выполненной работы. В любой момент вы можете add
(частично) заполненный файл в этой корзине, и он заменит предыдущую копию вашей текущей копией, так что, когда вы наконец решите commit
он будет использовать содержимое этой корзины (текущий index
) создать коммит.
Кроме того, ваш ранее add
в репо будет создан объект BLOB-объекта, который может быть найден при необходимости в различных журналах. Через некоторое время (30 дней +) он исчезнет с gc
,
Так как же "промежуточная область" отслеживать то, что было первым редактированием, если это просто индекс - список?
Индекс - это список имен и указателей на контент. В книгах это номера страниц. В индексе Git это идентификатор объекта в базе данных объектов репозитория.
Вот что такое индекс Git, список указателей содержимого, индексированный по пути.
git add
для некоторого пути в основном
sha=`git hash-object -w path/to/it`
git update-index --cacheinfo 100644,$sha,path/to/it
Кроме git add
проверяет наличие исполняемых файлов и использует 100755
для них, и рекурсивно добавляет и проверяет ваши .gitignore
и все остальное, что кажется наиболее удобным. Это удобная команда для добавления содержимого в объект db и обновления индекса.
Это индекс, но список деревьев изменений, а не файлов напрямую. Смотрите другой тип объектов git handle.
индекс на самом деле не является списком файлов, которые мы видим в проекте. это список s, которые будут присутствовать в снимке, который мы собираемся зафиксировать следующим.
считайте, что это файл, содержащий сжатое содержимое определенного файла, напримерfoo.txt
в конкретный момент. (подробнее об этом здесь )
когда вы добавляете файл в промежуточную область, например,git add foo.txt
для этого файла генерируется новый файл, содержащий содержимое файла на момент его добавления в промежуточную область. мы можем увидеть это, используяgit ls-file -s
. мы увидим что-то вроде этого:
100644 9cdf71db89dabc03936d7e685d812272e8976274 0 foo.txt
поэтому, если мы внесем какие-либо изменения, предыдущий контент все равно будет храниться в иindex
файл все еще имеет ссылку на него (т.е. его хэш SHA19cdf71db89...
).
(Настоящийblob
хранится в.git/9c/df71db89...
и чтобы увидеть его содержимое, мы можем использовать git cat-file -p 9cdf71db89da
)
Промежуточная область - это не просто список и не индекс, в котором говорится, какие файлы будут зафиксированы при выполнении фиксации git.
Если бы это было так, т.е. простой список, git add
никогда не мог работать так, как рекламируется.
Скорее, git add
должен сохранять содержимое файла во время подачи команды добавления. Таким образом, он делает снимки файлов, а затем помещает эти снимки в промежуточную область (также называемую "индекс", что, по моему мнению, на самом деле является довольно плохим выбором для имени).
Так что да, на самом деле утверждение книги вводит в заблуждение и сбивает с толку. Но в этом нет ничего удивительного. Большая часть документации git сбивает с толку и плохо продумана.
Давай, отметь меня. Я уверен, что прав в этом.