В чем разница между HEAD, рабочим деревом и индексом в Git? - PullRequest
433 голосов
/ 11 сентября 2010

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

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


Редактировать

Я нашел это

Один репозиторий git может отслеживать произвольное количество веток, но ваше рабочее дерево связано только с одной из них (ветвью «текущая» или «извлеченная»), и HEAD указывает на эту ветку.

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

Ответы [ 4 ]

524 голосов
/ 11 сентября 2010

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

alt text

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

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

Примечания:

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

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

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

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

alt text

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

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

alt text

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

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

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

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

alt text

119 голосов
/ 11 сентября 2010

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

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

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

На приведенном выше изображении «рабочий каталог» совпадает с «рабочим деревом», «область подготовки» является альтернативным именем для git «index», а HEAD указывает на текущую извлеченную ветвь, какой совет указывает на последний коммит в "каталоге git (хранилище)"

Обратите внимание, что git commit -a будет вносить изменения и фиксироваться за один шаг.

57 голосов
/ 11 сентября 2010

Ваше рабочее дерево - это то, что фактически находится в файлах, над которыми вы сейчас работаете.

HEAD - это указатель на ветвь или коммит, который вы последний раз извлекли, и который будет родителем нового коммита, если вы его сделаете.Например, если вы находитесь на ветке master, HEAD будет указывать на master, а когда вы фиксируете, этот новый коммит будет потомком ревизии, на которую указывал master, и master будет обновлен, чтобы указывать на новый коммит.

Индекс является промежуточной областью, где готовится новый коммит.По сути, содержимое индекса - это то, что войдет в новый коммит (хотя, если вы сделаете git commit -a, это автоматически добавит все изменения в файлы, о которых Git знает, до индекса, поэтому он будет фиксировать текущее содержимоеваше рабочее дерево).git add добавит или обновит файлы из рабочего дерева в ваш индекс.

35 голосов
/ 14 апреля 2015

Рабочее дерево

Ваше рабочее дерево - это файлы, над которыми вы сейчас работаете.

Индекс Git

  • "Индекс" git - это место, куда вы помещаете файлы, которые хотите зафиксировать в репозитории git.

  • Индекс также известен как кэш , кэш каталога , текущий кэш каталога , область подготовки , подготовка файлов .

  • Прежде чем "фиксировать" (проверять) файлы в репозитории git, вам необходимо сначала поместить файлы в "git" index ".

  • Индекс не рабочий каталог: вы можете ввести команду, например git status, и git скажет вам, какие файлы в вашем рабочем каталоге были добавлены в индекс git (например,с помощью команды git add filename).

  • Индекс не является репозиторием git: файлы в индексе git - это файлы, которые git передал бы в репозиторий git, если вы использовали коммит gitкоманда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...