Как показать первый фиксатор на 'git log'?

У меня есть проект, который имеет долгую историю. Я хочу показать первую фиксацию на git.

Как это сделать?

Ответ 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

Ответ 2

Я обнаружил, что:

git log --reverse

показывает фиксацию с начала.

Ответ 3

Вы можете просто отменить свою партию и просто загладить ее для первого результата.

git log --pretty=oneline --reverse | head -1

Ответ 4

git log $(git log --pretty=format:%H|tail -1)

Ответ 5

Не самый красивый способ сделать это, я думаю:

git log --pretty=oneline | wc -l

Это дает вам номер, затем

git log HEAD~<The number minus one>

Ответ 6

@MHC на самом деле это:

git log --pretty=oneline | wc -l
git log HEAD~<the number minus TWO>