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


290

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

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


2
Я только нашел способ показать последнее git log -1.
Алекс

Ответы:


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

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


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ему дают.
Фредерик Норд


6

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

git log --pretty=oneline | wc -l

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

git log HEAD~<The number minus one>

1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.