¿Cómo mostrar primero commit por 'git log'?

Respuestas:

298

Respuesta corta

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

( del comentario de tiho . Como Chris Johnsen se da cuenta , --max-parentsfue presentado después de que esta respuesta fue publicada).

Explicación

Técnicamente, puede haber más de una confirmación de raíz. Esto sucede cuando se fusionan varias historias previamente independientes. Es común cuando un proyecto se integra a través de una fusión de subárbol .

El git.gitrepositorio tiene seis commits raíz en su gráfico de historia (uno para el commit inicial de Linus, gitk , algunas herramientas inicialmente separadas, git-gui , gitweb y git-p4 ). En este caso, sabemos quee83c516 es en lo que probablemente estamos interesados. Es tanto el commit inicial como el commit raíz.

No es tan simple en el caso general.

Imagine que libfoo ha estado en desarrollo durante un tiempo y mantiene su historia en un repositorio Git ( libfoo.git). Independientemente, el proyecto "bar" también ha estado en desarrollo (in bar.git), pero no durante tanto tiempo libfoo (el commit con la fecha más temprana en libfoo.gittiene una fecha que precede al commit con la fecha más temprana bar.git). En algún momento, los desarrolladores de "bar" deciden incorporar libfoo en su proyecto utilizando una combinación de subárbol. Antes de esta fusión, podría haber sido trivial determinar la "primera" confirmación bar.git(probablemente solo hubo una confirmación raíz). Sin embargo, después de la fusión, hay varias confirmaciones de raíz y la confirmación de raíz más antigua en realidad proviene de la historia de libfoo, no "bar".

Puede encontrar todas las confirmaciones de raíz del historial DAG de esta manera:

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

Para el registro, si --max-parentsno estuviera disponible, esto también funciona:

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

Si tiene etiquetas útiles en su lugar, entonces git name-revpodría darle una visión general rápida del historial:

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

Prima

¿Usar esto a menudo? Difícil de recordar? Agregue un alias git para un acceso rápido

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

Ahora puedes simplemente hacer

git first
Chris Johnsen
fuente
49
Creo que git rev-list --max-parents=0 HEADhará lo mismo, y es un poco más simple.
tiho
3
@tiho: Sí, hace lo mismo y es más simple; aunque esa opción no había sido "inventada" en el momento de esta pregunta / respuesta.
Chris Johnsen
Se me ocurre que la primera confirmación es más una confirmación de hoja que una confirmación de raíz
dos de
@tiho Creo que su respuesta debería ser su propia respuesta y no solo un comentario. De esta forma, será más prominente y obtendrás puntos muy merecidos.
Russell Silva
@RussellSilva No me importan los puntos, pero creo que es posible editar las respuestas de otras personas, lo que probablemente sería mejor que agregar una nueva. Sin embargo, no me siento cómodo haciéndolo, siéntete libre de hacerlo :)
tiho 17/11
414

Encontre eso:

git log --reverse

muestra confirmaciones desde el principio.

Nyambaa
fuente
19
curiosamente lo git log --reverse -5hace ignorar --reversepor alguna razón
Dan2552
66
@ Dan2552 Parece un error, ¿se debe informar?
saeedgnu
23
parece que primero limita los resultados a 5 entradas, y luego invierte
polaridad
3
@ 太極 者 無極 而 生 tiene razón, ese es el comportamiento documentado.
seriousdev
43

Puede simplemente revertir su registro y simplemente encabezarlo para el primer resultado.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
fuente
77
git log --reverseinvierte el historial, por lo que debe usarlo en head -1lugar de tail -1obtener la primera confirmación.
rubiii
44
Sería mejor si git no ignorara la -nbandera cuando --reversese da.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
fuente
1
ogit log $(git log --reverse --pretty=format:%H|head -1)
nonopolaridad
ayuda para mi "primer compromiso"
real
6

No es la forma más hermosa de hacerlo, supongo:

git log --pretty=oneline | wc -l

Esto te da un número entonces

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

git log --format="%h" | tail -1 le da el hash de confirmación (es decir 0dd89fb ), que puede alimentar a otros comandos, haciendo algo como

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD para ver todos los commits en el último día.

TankorSmash
fuente