Технически, может быть несколько корневых коммитов. Это происходит, когда несколько ранее независимых историй объединяются. Распространено, когда проект интегрируется через слияние поддеревьев .
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 --max-parents=0 HEADбудет делать то же самое, и немного проще.
Тихо
3
@tiho: Да, он делает то же самое и проще; хотя этот вариант еще не был «изобретен» во время этого вопроса / ответа.
Крис Джонсен
Мне приходит в голову, что первый коммит - это больше листовой коммит, чем корневой коммит
tiwo
@tiho Я думаю, что ваш ответ должен быть собственным ответом, а не просто комментарием. Таким образом, он будет более заметным, и вы получите заслуженные очки.
Рассел Сильва
@RussellSilva Меня не волнуют вопросы, но я считаю, что можно редактировать ответы других людей, что, вероятно, было бы лучше, чем добавление нового. Мне не очень удобно делать это самому, не стесняйтесь делать это :)
git log -1
.Ответы:
Короткий ответ
(из комментария Тихо . Как замечает Крис Джонсен , он
--max-parents
был представлен после публикации этого ответа.)объяснение
Технически, может быть несколько корневых коммитов. Это происходит, когда несколько ранее независимых историй объединяются. Распространено, когда проект интегрируется через слияние поддеревьев .
git.git
Хранилище имеет шесть корневых фиксаций в своей истории графе ( по одному для Linus начальных фиксаций, gitk , некоторые первоначально отдельные инструменты, ГИТ-GUI , GitWeb и ГИТ-p4 ). В этом случае мы знаем, чтоe83c516
это тот, который нам, вероятно, интересен. Это и самый ранний коммит, и корневой коммит.В общем случае все не так просто.
Представьте, что libfoo находится в разработке некоторое время и хранит свою историю в репозитории Git (
libfoo.git
). Независимо, проект «bar» также находился в стадии разработки (inbar.git
), но не так долго, как libfoo (коммит с самой ранней датой вlibfoo.git
имеет дату, которая предшествует коммиту с самой ранней датой вbar.git
). В какой-то момент разработчики «bar» решили включить libfoo в свой проект, используя слияние поддеревьев. До этого слияния было бы тривиально определить «первый» коммитbar.git
(вероятно, был только один корневой коммит). Однако после слияния существует несколько корневых коммитов, и самая ранняя корневая фиксация фактически происходит из истории libfoo, а не «бар».Вы можете найти все корневые коммиты истории DAG следующим образом:
Для записи, если
--max-parents
не было доступно, это также работает:Если у вас есть полезные теги,
git name-rev
вы можете получить краткий обзор истории:бонус
Использовать это часто? Трудно запомнить? Добавьте псевдоним git для быстрого доступа
Теперь вы можете просто сделать
источник
git rev-list --max-parents=0 HEAD
будет делать то же самое, и немного проще.Я нашел это:
показывает коммиты с самого начала.
источник
git log --reverse -5
заставляет это игнорировать--reverse
почему-тоВы можете просто перевернуть свой журнал и просто направить его на первый результат.
источник
git log --reverse
переворачивает историю, поэтому вы должны использоватьhead -1
вместо того,tail -1
чтобы получить первый коммит.-n
флаг, когда--reverse
ему дают.источник
git log $(git log --reverse --pretty=format:%H|head -1)
Не самый красивый способ сделать это, я думаю:
Это дает вам номер тогда
источник
git log --format="%h" | tail -1
дает вам хеш коммита (то есть0dd89fb
), который вы можете передать в другие команды, выполнив что-то вродеgit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
просмотреть все коммиты за последний день.источник