У меня есть проект, который имеет долгую историю. Я хочу показать первую фиксацию на git.
Как это сделать?
У меня есть проект, который имеет долгую историю. Я хочу показать первую фиксацию на git.
Как это сделать?
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
Используйте это часто? Трудно вспомнить? Добавьте псевдоним Git для быстрого доступа
git config --global alias.first "rev-list --max-parents=0 HEAD"
Теперь вы можете просто сделать
git first
Я обнаружил, что:
git log --reverse
показывает фиксацию с начала.
Вы можете просто отменить свою партию и просто загладить ее для первого результата.
git log --pretty=oneline --reverse | head -1
git log $(git log --pretty=format:%H|tail -1)
Не самый красивый способ сделать это, я думаю:
git log --pretty=oneline | wc -l
Это дает вам номер, затем
git log HEAD~<The number minus one>
@MHC на самом деле это:
git log --pretty=oneline | wc -l
git log HEAD~<the number minus TWO>