Как Git восстанавливает индекс и каталог wokring внутри (после сброса / извлечения)? - PullRequest
1 голос
/ 09 апреля 2020

Я понимаю, что когда я checkout или reset --hard указываю c commit / branch, тогда я получаю соответствующее содержимое в моем рабочем каталоге и файле индекса.

Но как это сделать Git внутренне перестроить индекс и содержимое рабочего каталога на checkout или reset --hard.

Восстановление индекса выполняется путем чтения дерева, на которое указывает выданный нами коммит / сброс на ?

Рабочий каталог также восстанавливается так же способ?

Значит ли это, что после reset --hard или checkout <some_branch> индекс и рабочий каталог будут всегда соответствовать дереву этого коммита, потому что они были перестроены из него?


Редактирование: Что я в основном спрашиваю: выполняется ли восстановление содержимого индекса / WD с использованием дерева, указанного в коммите, к которому мы пришли? Потому что, на мой взгляд, у git нет другого способа извлечь этот контент, кроме как из истории коммитов

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Не совсем так. По крайней мере, не для рабочего каталога.

Честно говоря, мне понадобилось несколько минут, чтобы понять, что может означать ваш вопрос. Вы спрашиваете, будет ли рабочий каталог совпадать с извлеченным коммитом после запуска команды, которая, как вы знаете, устанавливает рабочий каталог в соответствие с извлеченным коммитом, поэтому вопрос ... немного мутный.

Но есть ARE ситуаций, в которых рабочий каталог окажется не таким, как в извлеченном коммите. Например, игнорируемые (или не отслеживаемые) файлы, как правило, не будут повреждены. В некоторых случаях это невозможно; возможно у меня есть неотслеживаемый файл с именем foo, но целевое дерево имеет файл с именем foo по тому же пути. Различные команды обрабатывают это по-разному. (И здесь важно отметить, что checkout commit - это ОЧЕНЬ команда, отличная от checkout commit -- path.) Некоторые команды будут загромождать ваши локальные непроверенные данные (которые затем будут невосстановимыми, по крайней мере, насколько это возможно *) 1019 * механизм), в то время как другие будут прерывать и предупреждать вас, что локальные изменения будут перезаписаны.

Таким образом, не совсем правильно говорить, что рабочее дерево "перестроено" из целевого дерева - в этом каталог не полностью rm 'd, а затем воссоздается из данных дерева. Скорее, файлы добавляются, удаляются или заменяются по мере необходимости (что в любом случае является более эффективной процедурой).

Для индекса: труднее показать любой «признак» индекса, который не был полностью перестроен, поскольку нет аналогичной концепции для неотслеживаемых файлов в индексе. Я ожидал бы, что git использует все хеши, которые он хранит для всего, так что он снова просто изменит то, что нужно изменить, вместо полной перестройки; но я не уверен на 100% в этом случае, и это деталь реализации, которая на самом деле не имеет значения. Если вы скажете git, что индекс будет соответствовать фиксации, индекс будет соответствовать фиксации.

0 голосов
/ 09 апреля 2020

Означает ли это, что после сброса --hard или извлечения индекс и рабочий каталог всегда будут соответствовать дереву этого коммита, поскольку они были перестроены из него?

Краткий ответ: ДА

Длинный ответ:

git checkout:

Обновляет файлы в рабочем дереве в соответствии с версией в индексе или указанном дереве.

https://git-scm.com/docs/git-checkout

git-reset --hard:

Сбрасывает индекс и рабочее дерево. Любые изменения отслеживаемых файлов в рабочем дереве, так как они отбрасываются.

https://git-scm.com/docs/git-reset

Обе эти команды перемещаются HEAD, который затем проверяет все commit его был перемещен в и соответственно изменяет индекс и / или WD. Если он не изменяет один или оба, он все еще действует как хранитель состояния ваших файлов во время этого коммита и позволяет вам запускать команды для сравнения вашего WD и индекса с состоянием ваши файлы в тот момент времени.

Надеюсь, это полезно, я не был уверен, что именно вы ищете с вашим вопросом.

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