Como mostrar o primeiro commit pelo 'git log'?

288

Eu tenho um projeto que tem uma longa história. Eu quero mostrar o primeiro commit no git.

Como eu faço isso?

Nyambaa
fonte
2
Eu só encontrei uma maneira de mostrar o último git log -1.
alex
5
possível duplicata do git: como referenciar o commit inicial?
precisa

Respostas:

298

Resposta curta

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

(a partir do comentário de tiho . Como Chris Johnsen observa , --max-parentsfoi introduzido depois que esta resposta foi publicada.)

Explicação

Tecnicamente, pode haver mais de uma confirmação raiz. Isso acontece quando várias histórias independentes anteriormente são mescladas. É comum quando um projeto é integrado por meio de uma mesclagem de subárvore .

O git.gitrepositório possui seis commits raiz no gráfico de histórico (um para o commit inicial do Linus, gitk , algumas ferramentas inicialmente separadas, git-gui , gitweb e git-p4 ). Nesse caso, sabemos que e83c516é provavelmente o que mais interessa. É o commit mais antigo e o commit raiz.

Não é tão simples no caso geral.

Imagine que o libfoo está em desenvolvimento há algum tempo e mantém sua história em um repositório Git ( libfoo.git). Independentemente, o projeto “bar” também está em desenvolvimento (in bar.git), mas não por muito tempo, libfoo (o commit com a data mais antiga em libfoo.gittem uma data que precede o commit com a data mais antiga em bar.git). Em algum momento, os desenvolvedores do "bar" decidem incorporar o libfoo em seu projeto usando uma mesclagem de subárvore. Antes dessa mesclagem, poderia ter sido trivial determinar o "primeiro" commit bar.git(provavelmente havia apenas um commit raiz). Após a mesclagem, no entanto, existem vários commit root e o commit root mais antigo vem da história do libfoo, não "bar".

Você pode encontrar todos os commits raiz do histórico do DAG desta maneira:

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

Para o registro, se --max-parentsnão estivesse disponível, isso também funcionaria:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Se você tiver tags úteis, git name-revpoderá fornecer uma visão geral rápida do histórico:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

Bônus

Use isso com frequência? Difícil de lembrar? Adicione um alias do git para acesso rápido

git config --global alias.first "rev-list --max-parents=0 HEAD"

Agora você pode simplesmente fazer

git first
Chris Johnsen
fonte
49
Acredito git rev-list --max-parents=0 HEADque fará o mesmo e é um pouco mais simples.
tiho
3
@tiho: Sim, faz o mesmo e é mais simples; embora essa opção não tivesse sido "inventada" no momento desta pergunta / resposta.
precisa saber é o seguinte
Ocorre-me que a primeira cometer é mais de uma folha de cometer do que uma raiz comprometer
Tiwo
Acho que sua resposta deve ser a sua própria resposta e não apenas um comentário. Dessa forma, será mais proeminente e você receberá pontos muito merecidos.
Russell Silva
@RussellSilva Não me importo com pontos, mas acredito que é possível editar as respostas de outras pessoas, o que provavelmente seria melhor do que adicionar uma nova. Eu realmente não estou confortável fazendo isso me embora, não hesite em fazê-lo :)
tiho
414

Eu achei aquilo:

git log --reverse

mostra confirmações desde o início.

Nyambaa
fonte
19
Curiosamente git log --reverse -5torna ignorar o --reversepor algum motivo
Dan2552
6
@ Dan2552 Parece um bug, deve ser relatado?
Saeedgnu
23
parece que primeiro limita os resultados de 5 entradas, e depois inverter
nonopolarity
3
@ 太極 者 無極 而 生 está certo, esse é o comportamento documentado.
seriousdev
43

Você pode simplesmente reverter o seu log e encabeçá-lo para o primeiro resultado.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
fonte
7
git log --reverseinverte o histórico, então você deve usar em head -1vez de tail -1obter o primeiro commit.
rubiii 8/09/11
4
seria melhor se o git não ignorasse a -nbandeira quando --reversefor dada.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
fonte
1
ougit log $(git log --reverse --pretty=format:%H|head -1)
polaridade
ajuda para mim. verdadeiro "primeiro commit"
kangear 25/10
6

Não é a maneira mais bonita de fazer isso, eu acho:

git log --pretty=oneline | wc -l

Isso fornece um número para você

git log HEAD~<The number minus one>
MHC
fonte
1

git log --format="%h" | tail -1fornece o hash de confirmação (ou seja 0dd89fb), que você pode alimentar em outros comandos, fazendo algo como

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD para ver todos os commits no último dia.

TankorSmash
fonte