Как показать первый коммит по 'git log'? - PullRequest
245 голосов
/ 04 марта 2011

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

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

Ответы [ 5 ]

363 голосов
/ 04 марта 2011

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

git log --reverse

показывает коммиты с начала.

241 голосов
/ 04 марта 2011

Короткий ответ

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
30 голосов
/ 04 марта 2011

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

git log --pretty=oneline --reverse | head -1
10 голосов
/ 04 марта 2011
git log $(git log --pretty=format:%H|tail -1)
4 голосов
/ 04 марта 2011

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

git log --pretty=oneline | wc -l

Это даст вам число, тогда

git log HEAD~<The number minus one>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...