Какая разница между HEAD, рабочим деревом и индексом, в Git?
Может ли кто-нибудь сказать мне разницу между HEAD, рабочим деревом и индексом, в Git?
Из того, что я понимаю, это все имена для разных ветвей. Правильно ли мое предположение?
Изменить
Я нашел это
Единственный репозиторий git может отслеживать произвольное количество ветвей, но ваше рабочее дерево связано только с одним из них (ветвь "current" или "check out" ), а HEAD указывает на эту ветку.
Означает ли это, что HEAD и рабочее дерево всегда одинаковы?
Ответы
Ответ 1
Несколько других хороших ссылок на эти темы:
Я использую индекс как контрольную точку.
Когда я собираюсь внести изменения, которые могут пойти наперекосяк - когда я захочу изучить какое-то направление, в котором я не уверен, могу ли я продолжить, даже если это хорошая идея, такая как концептуально требующий рефакторинг или изменение типа представления - я проверяю свою работу в индексе. Если это первое изменение, которое я сделал с момента последнего коммита, то я могу использовать локальный репозиторий в качестве контрольной точки, но часто у меня есть одно концептуальное изменение, которое я реализую как набор небольших шагов. Я хочу контрольно-пропускной пункт после каждого шага, но сохраняю фиксацию до тех пор, пока не вернусь к работающему, проверенному коду.
Примечания:
-
рабочая область - это дерево каталогов (исходных) файлов, которые вы видите и редактируете.
-
index - это один большой, двоичный файл в <baseOfRepo>/.git/index
, в котором перечислены все файлы в текущей ветке, их контрольные суммы sha1, отметки времени и имя файла - it не является другим каталогом с копией файлов в нем.
-
Локальный репозиторий - это скрытый каталог (.git
), включающий каталог objects
, содержащий все версии каждого файла в репо (локальные ветки и копии удаленных веток), как сжатый файл "blob".
Не думайте о четырех "дисках", представленных на изображении выше, в виде отдельных копий файлов репо.
Они в основном называются ссылками для Git commits. Существует два основных типа ссылок: теги и заголовки.
- Тэги - это фиксированные ссылки, которые отмечают конкретную точку в истории, например, v2.6.29.
- Напротив, головы всегда перемещаются, чтобы отражать текущую позицию разработки проекта.
(обратите внимание: как прокомментировал Timo Huovinen, эти стрелки не являются тем, на что указывают коммиты, это порядок рабочего процесса, в основном показывающий стрелки как 1 -> 2 -> 3 -> 4
, где 1
- первая фиксация, а 4
- последняя)
Теперь мы знаем, что происходит в проекте.
Но чтобы знать, что происходит прямо здесь, прямо сейчас есть специальная ссылка под названием HEAD. Он выполняет две основные цели:
- он сообщает Git, которые обязуются брать файлы при проверке и
- он сообщает Git, где положить новые коммиты при фиксации.
При запуске git checkout ref
он указывает HEAD
на указанный вами номер и извлекает из него файлы. При запуске git commit
он создает новый объект commit, который становится дочерним элементом текущего HEAD
. Обычно HEAD
указывает на одну из головок, поэтому все работает нормально.
Ответ 2
Разница между HEAD (текущая ветка или последнее фиксированное состояние в текущей ветке), индекс (область настройки) и рабочее дерево (состояние файлов в кассе) описывается в разделе "Три государства" в "Основах 1.3 Git ", глава книги Pro Git Скотта Чакона (лицензия Creative Commons).
Вот изображение, иллюстрирующее это из этой главы:
В приведенном выше изображении "рабочий каталог" совпадает с "рабочим деревом", "промежуточная область" является альтернативным именем для "индекса" git, а HEAD указывает на текущую отмеченную ветку, которая указывает на последнюю фиксацию в поле " git directory (репозиторий) "
Обратите внимание, что git commit -a
будет git commit -a
изменения и совершать за один шаг.
Ответ 3
Ваше рабочее дерево - это то, что на самом деле находится в файлах, над которыми вы сейчас работаете.
HEAD
- это указатель на ветвь или коммит, который вы в последний раз извлекли, и который будет родителем нового коммита, если вы его сделаете. Например, если вы находитесь в master
ветке, то HEAD
будет указывать на master
, а когда вы фиксируете, этот новый коммит будет являться потомком ревизии, на которую указал master
, и master
будет обновляться, чтобы указывать на новый коммит.,
Индекс является промежуточной областью, где готовится новый коммит. По сути, содержимое индекса - это то, что войдет в новый коммит (хотя, если вы выполните git commit -a
, это автоматически добавит все изменения файлов, о которых Git знает, до индекса, поэтому он будет фиксировать текущий содержимое вашего рабочего дерева). git add
добавит или обновит файлы из рабочего дерева в ваш индекс.
Ответ 4
Рабочее дерево
Ваше рабочее дерево - это файлы, над которыми вы сейчас работаете.
Git index
-
"Индекс" git - это место, куда вы помещаете файлы, которые хотите зафиксировать, в репозиторий git.
-
Индекс также известен как кэш, кэш каталогов, текущий кеш каталогов, промежуточная область, промежуточные файлы.
-
Прежде чем "фиксировать" (проверять) файлы в репозитории git, вам необходимо сначала поместить файлы в "индекс" git.
-
Индекс не является рабочим каталогом: вы можете ввести команду, такую как git status
, и git сообщит вам, какие файлы в вашем рабочем каталоге были добавлены в индекс git (например, с помощью команды git add filename
).
-
Индекс не является репозиторием git: файлы в индексе git - это файлы, которые git передал бы в репозиторий git, если бы вы использовали команду git commit.