Ответ 1
Короткий ответ
git rev-list --max-parents=0 HEAD
(from комментарий tiho. Chris Заметки Johnsen, --max-parents
были введены после публикации этого ответа.)
Описание
Технически, может быть более одного коммита root. Это происходит, когда несколько ранее независимых историй объединяются. Обычно, когда проект интегрируется с помощью слияния поддерева.
Репозиторий git.git
имеет шесть корневых коммитов в своем графике истории (по одному для инициализации Linuss, gitk, некоторых изначально отдельных инструментов, git -gui, gitweb и git -p4). В этом случае мы знаем, что e83c516
является тем, которого мы, вероятно, интересуем. Это как ранний фиксатор, так и корень.
Это не так просто в общем случае.
Представьте, что libfoo некоторое время находится в разработке и сохраняет свою историю в репозитории Git (libfoo.git
). Независимо, проект "бар" также разрабатывался (в bar.git
), но не так долго libfoo (фиксация с самой ранней датой в libfoo.git
имеет дату, предшествующую фиксации с самой ранней датой в bar.git
). В какой-то момент разработчики "bar" решили включить libfoo в свой проект, используя слияние поддерева. До этого слияния, возможно, было тривиально определить "первое" совершение в bar.git
(возможно, было только одно коммандное коммит). Однако после слияния есть несколько коммитных коммитов, и самая ранняя фиксация корня на самом деле происходит из истории libfoo, а не "bar".
Вы можете найти все корневые фиксации DAG истории следующим образом:
git rev-list --max-parents=0 HEAD
Для записи, если --max-parents
недоступны, это также работает:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Если у вас есть полезные теги, то git name-rev
может дать вам краткий обзор истории:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
Bonus
Используйте это часто? Трудно вспомнить? Добавьте псевдоним Git для быстрого доступа
git config --global alias.first "rev-list --max-parents=0 HEAD"
Теперь вы можете просто сделать
git first