Объекты дерева строятся по git write-tree
. То есть git commit
состоит из нескольких подкоманд (см. Примечания ниже):
git write-tree
git commit-tree <parents> <message> <tree-hash-ID>
git update-ref <full-ref> <commit-hash-ID>
Первая команда, которая не принимает параметров, превращает index (используйте git ls-files --stage
просмотреть его содержимое) в виде серии древовидных объектов. Идентификатор ha sh объекта дерева верхнего уровня выводится на его стандартный вывод.
Для второй команды требуются параметры: -p
для каждого родительского коммита ha sh ID, -m
или -F
для предоставьте сообщение журнала фиксации и дерево с sh ID, напечатанным git write-tree
. В качестве стандартного вывода он генерирует идентификатор ha sh объекта фиксации.
Последней команде также нужны параметры: полное имя текущей ветви (например, refs/heads/master
) или имя HEAD
, если HEAD
в настоящее время отсоединен от любой ветви, и идентификатор ha sh, созданный второй командой. Он обновляет данный ref для хранения данного идентификатора ha sh. Если ссылка является именем ветви, или HEAD
, идентификатор ha sh должен быть идентичным коммиту.
Примечания
Первоначально git commit
был небольшим сценарием оболочки, который просто запустили эти три команды (с соответствующим клеем оболочки). В то время у git commit
было не так много опций, флагов и режимов, как сейчас.
В итоге git commit
превратилось в одну C программу. Теперь он делает все эти части внутри. Он также обрабатывает блокировку, запускает ловушки предварительной фиксации и другие подобные вещи; это не может быть сделано должным образом в сценарии оболочки с использованием трех отдельных команд. Однако три отдельные команды все еще остаются, так что вы можете использовать их для создания своих собственных сценариев, если хотите.