Какая разница между HEAD, рабочим деревом и индексом, в Git?

Может ли кто-нибудь сказать мне разницу между HEAD, рабочим деревом и индексом, в Git?

Из того, что я понимаю, это все имена для разных ветвей. Правильно ли мое предположение?


Изменить

Я нашел это

Единственный репозиторий git может отслеживать произвольное количество ветвей, но ваше рабочее дерево связано только с одним из них (ветвь "current" или "check out" ), а HEAD указывает на эту ветку.

Означает ли это, что HEAD и рабочее дерево всегда одинаковы?

Ответы

Ответ 1

Несколько других хороших ссылок на эти темы:

alt text

Я использую индекс как контрольную точку.

Когда я собираюсь внести изменения, которые могут пойти наперекосяк - когда я захочу изучить какое-то направление, в котором я не уверен, могу ли я продолжить, даже если это хорошая идея, такая как концептуально требующий рефакторинг или изменение типа представления - я проверяю свою работу в индексе. Если это первое изменение, которое я сделал с момента последнего коммита, то я могу использовать локальный репозиторий в качестве контрольной точки, но часто у меня есть одно концептуальное изменение, которое я реализую как набор небольших шагов. Я хочу контрольно-пропускной пункт после каждого шага, но сохраняю фиксацию до тех пор, пока не вернусь к работающему, проверенному коду.

Примечания:

  • рабочая область - это дерево каталогов (исходных) файлов, которые вы видите и редактируете.

  • index - это один большой, двоичный файл в <baseOfRepo>/.git/index, в котором перечислены все файлы в текущей ветке, их контрольные суммы sha1, отметки времени и имя файла - it не является другим каталогом с копией файлов в нем.

  • Локальный репозиторий - это скрытый каталог (.git), включающий каталог objects, содержащий все версии каждого файла в репо (локальные ветки и копии удаленных веток), как сжатый файл "blob".

Не думайте о четырех "дисках", представленных на изображении выше, в виде отдельных копий файлов репо.

alt text

Они в основном называются ссылками для Git commits. Существует два основных типа ссылок: теги и заголовки.

  • Тэги - это фиксированные ссылки, которые отмечают конкретную точку в истории, например, v2.6.29.
  • Напротив, головы всегда перемещаются, чтобы отражать текущую позицию разработки проекта.

alt text

(обратите внимание: как прокомментировал Timo Huovinen, эти стрелки не являются тем, на что указывают коммиты, это порядок рабочего процесса, в основном показывающий стрелки как 1 -> 2 -> 3 -> 4, где 1 - первая фиксация, а 4 - последняя)

Теперь мы знаем, что происходит в проекте.
Но чтобы знать, что происходит прямо здесь, прямо сейчас есть специальная ссылка под названием HEAD. Он выполняет две основные цели:

  • он сообщает Git, которые обязуются брать файлы при проверке и
  • он сообщает Git, где положить новые коммиты при фиксации.

При запуске git checkout ref он указывает HEAD на указанный вами номер и извлекает из него файлы. При запуске git commit он создает новый объект commit, который становится дочерним элементом текущего HEAD. Обычно HEAD указывает на одну из головок, поэтому все работает нормально.

alt text

Ответ 2

Разница между HEAD (текущая ветка или последнее фиксированное состояние в текущей ветке), индекс (область настройки) и рабочее дерево (состояние файлов в кассе) описывается в разделе "Три государства" в "Основах 1.3 Git ", глава книги Pro Git Скотта Чакона (лицензия Creative Commons).

Вот изображение, иллюстрирующее это из этой главы:

Local Operations - working directory vs. staging area (index) vs git repository (HEAD)

В приведенном выше изображении "рабочий каталог" совпадает с "рабочим деревом", "промежуточная область" является альтернативным именем для "индекса" 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.