Может кто-нибудь сказать мне разницу между HEAD, рабочим деревом и индексом в Git?
Из того, что я понимаю, это все названия для разных веток. Правильно ли мое предположение?
редактировать
я нашел это
Один репозиторий git может отслеживать произвольное количество веток, но ваше рабочее дерево связано только с одной из них (ветвью «текущая» или «извлеченная»), и HEAD указывает на эту ветку.
Значит ли это, что HEAD и рабочее дерево всегда одинаковы?
git
version-control
Джойс Бабу
источник
источник
HEAD
это коммит на кончике текущей ветки. Если вы только что извлекли ветку, то есть не имеют измененных файлов, то ее содержимое соответствует рабочему дереву. Как только вы что-то измените, оно больше не будет совпадать.Staging Area
к этому списку. ЧтоHEAD
,Working Tree
,Index
иStaging Area
Ответы:
Несколько других хороших ссылок на эти темы:
(примечание: в комментировал по Тимо Huovinen , эти стрелки не то , что коммиты указывают на это, это порядок документооборота , в основном , демонстрирующая стрелки , как ,
1 -> 2 -> 3 -> 4
где1
это первое обязательство и4
последний)источник
Разница между HEAD (текущая ветвь или последнее зафиксированное состояние в текущей ветке), индексом (или промежуточной областью) и рабочим деревом (состояние файлов в извлечении) описана в разделе «Три состояния» «Основы 1.3 Git » глава книги Pro Git Скотта Чакона (лицензия Creative Commons).
Вот изображение, иллюстрирующее это из этой главы:
На приведенном выше изображении «рабочий каталог» аналогичен «рабочему дереву», «область подготовки» - это альтернативное имя для git «index», а HEAD указывает на текущую извлеченную ветвь, которая указывает на последний коммит в « git directory (репозиторий) "
Обратите внимание, что
git commit -a
внесет изменения и зафиксировать в один шаг.источник
working tree
кажется, предпочтительнее вworking directory
настоящее время. См. Github.com/git/git/commit/…Ваше рабочее дерево - это то, что на самом деле находится в файлах, над которыми вы сейчас работаете.
HEAD
является указателем на ветвь или коммит, который вы в последний раз извлекли, и который будет родителем нового коммита, если вы его сделаете. Например, если вы находитесь наmaster
ветке, тоHEAD
будет указыватьmaster
, и когда вы фиксируете, этот новый коммит будет потомком ревизии, на которую онmaster
указывал, иmaster
будет обновляться, чтобы указывать на новый коммит.Индекс является промежуточной областью , где новый фиксации готов. По сути, содержимое индекса - это то, что войдет в новый коммит (хотя, если вы это сделаете
git commit -a
, это автоматически добавит все изменения в файлы, которые Git знает о индексе перед фиксацией, поэтому он будет фиксировать текущее содержимое вашего рабочего дерева. ).git add
добавит или обновит файлы из рабочего дерева в ваш индекс.источник
git commit -a
(вы должны добавить ихgit add
), поэтому в вашем рабочем дереве могут быть дополнительные файлы, которые ваш индекс, локальное хранилище или вашего удаленного репо нету.HEAD
относится к самому последнему коммиту, поэтому, когда вы делаете коммит, вы обновляете егоHEAD
до нового коммита, который соответствует индексу. Pushing не имеет к этому никакого отношения - он создает ветки в ветвях удаленного соответствия в вашем локальном репо.Рабочее дерево
Ваше рабочее дерево - это файлы, над которыми вы сейчас работаете.
Git index
«Индекс» git - это место, куда вы помещаете файлы, которые хотите зафиксировать, в репозиторий git.
Индекс также известен как кеш , кеш каталога , текущий кеш каталога , область подготовки , промежуточные файлы. .
Прежде чем «фиксировать» (проверять) файлы в репозитории git, вам необходимо сначала поместить файлы в «индекс» git.
Индекс не является рабочим каталогом: вы можете ввести команду, например
git status
, и git скажет вам, какие файлы в вашем рабочем каталоге были добавлены в индекс git (например, с помощьюgit add filename
команды).Индекс не является репозиторием git: файлы в индексе git - это файлы, которые git передал бы в репозиторий git, если бы вы использовали команду git commit.
источник
reset --hard HEAD
чтобы убедиться, что ваш индекс == ваше рабочее дерево. затем:mkdir history && git checkout-index --prefix history/ -a
результатом будет дублирование всего вашего рабочего дерева в вашемhistory/
каталоге. Ergo git index> = рабочий каталог gitecho untracked-data > untracked-file
, до или послеgit reset --HARD
иgit checkout-index
шаги. Вы обнаружите, что неотслеживаемого файла нет вhistory
каталоге. Вы также можете изменить индекс и рабочее дерево независимо, хотя изменение индекса без предварительного прикосновения к рабочему дереву затруднительно (требует использованияgit update-index --index-info
).