Короткий ответ
git rev-list --max-parents=0 HEAD
(из комментария Тихо . Как Крис Джонсен замечает , --max-parents
был представлен после того, как этот ответ был опубликован.)
Пояснение
Технически, может быть несколько корневых коммитов.Это происходит, когда несколько ранее независимых историй объединяются.Распространено, когда проект интегрируется с помощью слияния поддерева .
Хранилище git.git
имеет шесть корневых коммитов в своем графе истории (по одному на каждый начальный коммит Линуса, gitk, некоторые изначально отдельные инструменты, git-gui , gitweb и git-p4 ).В этом случае мы знаем, что e83c516
- это тот, который нам, вероятно, интересен. Это и самый ранний коммит, и корневой коммит.
В общем случае все не так просто.
Представьте, что libfoo некоторое время находился в разработке и хранит свою историю в репозитории Git (libfoo.git
).Независимо, проект «bar» также находился в стадии разработки (в 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
Бонус
Использовать это часто?Трудно запомнить?Добавьте псевдоним git для быстрого доступа
git config --global alias.first "rev-list --max-parents=0 HEAD"
Теперь вы можете просто сделать
git first