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

290

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

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

Nyambaa
источник
2
Я только нашел способ показать последнее git log -1.
Алекс
5
Возможный дубликат git: как ссылаться на начальный коммит?
Крис Джонсен

Ответы:

299

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

git rev-list --max-parents=0 HEAD

(из комментария Тихо . Как замечает Крис Джонсен , он --max-parentsбыл представлен после публикации этого ответа.)

объяснение

Технически, может быть несколько корневых коммитов. Это происходит, когда несколько ранее независимых историй объединяются. Распространено, когда проект интегрируется через слияние поддеревьев .

git.gitХранилище имеет шесть корневых фиксаций в своей истории графе ( по одному для Linus начальных фиксаций, gitk , некоторые первоначально отдельные инструменты, ГИТ-GUI , GitWeb и ГИТ-p4 ). В этом случае мы знаем, что e83c516это тот, который нам, вероятно, интересен. Это и самый ранний коммит, и корневой коммит.

В общем случае все не так просто.

Представьте, что libfoo находится в разработке некоторое время и хранит свою историю в репозитории Git ( libfoo.git). Независимо, проект «bar» также находился в стадии разработки (in bar.git), но не так долго, как libfoo (коммит с самой ранней датой в libfoo.gitимеет дату, которая предшествует коммиту с самой ранней датой в bar.git). В какой-то момент разработчики «bar» решили включить libfoo в свой проект, используя слияние поддеревьев. До этого слияния было бы тривиально определить «первый» коммит bar.git(вероятно, был только один корневой коммит). Однако после слияния существует несколько корневых коммитов, и самая ранняя корневая фиксация фактически происходит из истории libfoo, а не «бар».

Вы можете найти все корневые коммиты истории 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
Крис Джонсен
источник
49
Я верю, что git rev-list --max-parents=0 HEADбудет делать то же самое, и немного проще.
Тихо
3
@tiho: Да, он делает то же самое и проще; хотя этот вариант еще не был «изобретен» во время этого вопроса / ответа.
Крис Джонсен
Мне приходит в голову, что первый коммит - это больше листовой коммит, чем корневой коммит
tiwo
@tiho Я думаю, что ваш ответ должен быть собственным ответом, а не просто комментарием. Таким образом, он будет более заметным, и вы получите заслуженные очки.
Рассел Сильва
@RussellSilva Меня не волнуют вопросы, но я считаю, что можно редактировать ответы других людей, что, вероятно, было бы лучше, чем добавление нового. Мне не очень удобно делать это самому, не стесняйтесь делать это :)
Тихо
416

Я нашел это:

git log --reverse

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

Nyambaa
источник
19
интересно git log --reverse -5заставляет это игнорировать --reverseпочему-то
Dan2552
6
@ Dan2552 Похоже на ошибку, нужно сообщить?
saeedgnu
24
Похоже, что сначала ограничивает результаты до 5 записей, а затем наоборот
полярность
3
@ 太極 者 無極 而 生 правильно, это задокументированное поведение.
Серьезный
44

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

git log --pretty=oneline --reverse | head -1
Мохамед Мансур
источник
7
git log --reverseпереворачивает историю, поэтому вы должны использовать head -1вместо того, tail -1чтобы получить первый коммит.
Руби
4
было бы лучше, если бы git не игнорировал -nфлаг, когда --reverseему дают.
Фредерик Норд
12
git log $(git log --pretty=format:%H|tail -1)
Мэтью Флэшен
источник
1
илиgit log $(git log --reverse --pretty=format:%H|head -1)
неполярность
помогите мне. настоящий "первый коммит"
kangear
6

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

git log --pretty=oneline | wc -l

Это дает вам номер тогда

git log HEAD~<The number minus one>
MHC
источник
1

git log --format="%h" | tail -1дает вам хеш коммита (то есть 0dd89fb), который вы можете передать в другие команды, выполнив что-то вроде

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD просмотреть все коммиты за последний день.

TankorSmash
источник