2015-04-14 7 views
5

Я читаю о git-объектах: blob, tree, commit, tag. Чтобы лучше понять, как работает git, я пробовал команду низкого уровня, например write-tree и commit-tree.В чем разница между git commit и git commit-tree

  1. mkdir test; cd test ->git init
  2. создать файл и git add file. Я могу видеть блоб и дерева объектов генерируются в .git/objects
  3. git write-tree для печати текущего treeID
  4. git commit-tree treeID -m "commit a tree" совершить это дерево. После этой операции создается объект фиксации, и я вижу, что он содержит автора, дату и т. Д. Однако я не могу проверить свои фиксации с помощью git log, ошибка: fatal: bad default revision 'HEAD'.

После выполнения операций, когда я запустил git status, я вижу, что файл все еще находится в индексе, ожидающем фиксации. Каково использование commit-tree и в чем разница между commit-tree и `commit '?

+2

Вы прочитали [этот раздел] (http://git-scm.com/book/en/v1/Git-Internals-Git-Objects) книги Pro Git? Он должен вас заинтересовать, потому что он подробно описывает, как создавать коммиты, используя команды «Сантехника» (т. Е. Низкоуровневые Git). – Jubobs

+0

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

ответ

3

git-commit - Запись изменений в репозиторий Сохраняет текущее содержимое индекса в новой фиксации вместе с сообщением журнала от пользователя, описывающего изменения.

мерзавец совершить «записывает изменения в хранилище»

Схематическое представление git-commit показано here на SO

git-commit-tree - Создать новый объект коммита Создает новый объект коммита, основанный на предоставленный древовидный объект и испускает новый идентификатор объекта фиксации на stdout.

Это обычно не то, что конечный пользователь хочет запустить напрямую. Создает новый объект фиксации на основе предоставленного древовидного объекта и испускает новый идентификатор объекта назначения на stdout. Сообщение журнала считывается со стандартного входа , если не указаны параметры -m или -F.

+0

«git commit» и «git commit-tree» создают объект commit и могут принимать сообщение пользователя, однако «git commit» с моментальными снимками имеет индекс HEAD, но «git commit-tree» не гарантирует, что объект commit принадлежит HEAD index, это может быть из любого (под) дерева всей структуры дерева, правильно? поэтому после 'git commit-tree', если у меня есть api, чтобы поместить определенную фиксацию в HEAD, тогда результат будет похож на' git commit'? – hakunami

+0

Этот ответ технически точен, но я думаю, что это не подчеркивает невероятно важный момент. 'git-commit-tree' - это команда низкого уровня, которая фиксирует один объект дерева, но не выполняет никакой последующей справки и главной работы, которую выполняет' git-commit'.Если вы вручную выполняете команды 'git commit-tree' без последующей справки, вы можете легко создать недостижимое дерево, которое будет удалено очистителем мусора Git. См. [Git снизу вверх] (https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/4-how-trees-are-made.html) страницы 8-10 для больше информации. – DanK

Смежные вопросы