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

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

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

9 ответов

Решение

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

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

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

объяснение

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

git.git репозиторий имеет шесть корневых коммитов в своем графе истории (по одному на каждый начальный коммит Линуса, 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 rev-list --max-parents=0 HEAD 

Чтобы увидеть полную git logс сообщением о фиксации только для первой фиксации:

      git log $(git rev-list --max-parents=0 HEAD)

Использованная литература:

  1. Как я узнал первую команду выше: [основной ответ] Как показать первую фиксацию с помощью 'git log'?(вторая команда выше была моим собственным вкладом)
git log $(git log --pretty=format:%H|tail -1)

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

git log --pretty=oneline | wc -l

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

git log HEAD~<The number minus one>

Вы можете получить тот же результат, что и принятый ответ, с меньшим количеством ввода:

      $ git fsck  --root
root 3fa77c58f85c591f9c6a1b0510228e4aec704697
Checking object directories: 100% (256/256), done.

Это работает, потому что первый коммит большинства репозиториев git является корневым узлом.

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

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

Если вы хотите получить первую фиксацию с датой, именем коммитера и сообщением коммита, вы запустите эту команду.

      git log master --pretty="%t %aD %aN %s"| tail -1

tхэш дерева,adссылаться на имя автора,aNотносится к имени автора иsдля предмета.

Если вы хотите получить первую фиксацию с веткой, созданной из основной ветки (копировать из главной), вы будете ссылаться на основную и другую ветку.

      git log master...docs --pretty="%t %aD %aN %s"| tail -1
Другие вопросы по тегам