Несоответствие между рабочим каталогом и рабочим деревом

Некоторое время я читал документацию по git и понял, что во многих командах документация неоднозначна, когда речь идет о разнице между "рабочим каталогом" и "рабочим деревом". Я знаю об изменениях статуса здесь, и более часто используемые команды, такие как add, также согласуются. Но заметка о том, что вчера я сделал документацию, показывает, что многие команды все еще не обновляются соответствующим образом.

Это подводит меня к следующему пункту, так каково точное определение каждой концепции, поскольку они, кажется, используются взаимозаменяемо, используются в документации config и stash? Является ли рабочий каталог просто устаревшей ошибкой, которая ожидает исправления?

Произошло ли изменение статуса выше, чтобы устранить путаницу и обозначить, что статус является уникальным для каждого рабочего дерева с учетом его HEAD?

Если это так, то является ли gc уникальным для каждого рабочего дерева, или это делается в "базе данных", как fsck? Та же идея с stash, заботится ли stash о том, какое рабочее дерево оно называло?

1 ответ

Решение

В системах контроля версий в целом (не только в Git) всегда нужно иметь место для работы. Имя, используемое для этого места, может быть разным: рабочее дерево, рабочее дерево, рабочий каталог и т. Д. В целом, рабочее дерево или рабочее дерево, или какой-либо другой вариант, вероятно, лучше всего подходит, поскольку "рабочий каталог", по-видимому, подразумевает один уровень "каталог-несс" ".

Имена Git всегда были немного противоречивыми, но переход к использованию "рабочего дерева" или "рабочего дерева" был довольно устойчивым. Исторически это стало более важным, когда git worktree Подкоманда вошла в Git официально, в Git версии 2.5.

Итак, конкретно:

Является ли [фраза] рабочим каталогом [в git stash документация ] просто устаревшая ошибка, которая ждет исправления?

Я бы так сказал, да.

Произошло ли изменение статуса выше, чтобы устранить путаницу и обозначить, что статус является уникальным для каждого рабочего дерева с учетом его HEAD?

Да. Обратите внимание, однако, что git status вычисляет статус динамически, основываясь на трех элементах: HEAD (есть один HEAD для каждого рабочего дерева), индекс (существует один индекс для каждого рабочего дерева) и рабочее дерево.

(Заблуждение, что любая команда может установить свой собственный временный индекс и использовать его. Один индекс на каждое рабочее дерево является единственным "реальным" индексом для этого рабочего дерева, кроме любого временного индекса, созданного временно какой-либо командой и установленного в $GIT_INDEX_FILE.)

Если это так, то является ли gc уникальным для каждого рабочего дерева, или это делается в "базе данных", как fsck?

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

Та же идея с stash, заботится ли stash о том, какое рабочее дерево оно называло?

Какие git stash делает, чтобы сделать два, а иногда и три, совершить. Он делает их из индекса и из рабочего дерева, поэтому имеет значение, в каком рабочем дереве вы находитесь. (Третий коммит, если он присутствует, содержит неотслеживаемые файлы: либо не отслеженные, но не проигнорированные, либо не отслеженные, включая игнорируемые. Они тоже взяты из текущего дерева работ.)

Сами коммиты не идут ни на какую ветку. Вместо этого по умолчанию один из коммитов (тот, который находит другие) хранится в refs/stash, используя его reflog, чтобы сохранить любой предыдущий refs/stash значение.

Другие вопросы по тегам