tipos - git ver commits pendientes
¿Cómo mostrar el primer commit por ''git log''? (5)
Tengo un proyecto que tiene una larga historia. Quiero mostrar el primer commit en git.
¿Cómo hago esto?
Respuesta corta
git rev-list --max-parents=0 HEAD
( del comentario de tiho . Como lo nota Chris Johnsen , --max-parents
se introdujo después de que se publicara esta respuesta).
Explicación
Técnicamente, puede haber más de un root commit. Esto sucede cuando se combinan múltiples historias previamente independientes. Es común cuando un proyecto se integra a través de una fusión de subárbol .
El repositorio git.git
tiene seis confirmaciones de raíz en su gráfico histórico (uno para cada confirmación inicial de Linus, gitk , algunas herramientas inicialmente separadas, git-gui , gitweb y git-p4 ). En este caso, sabemos que e83c516
es el único en el que probablemente estamos interesados. Es el compromiso más antiguo y el compromiso de raíz.
No es tan simple en el caso general.
Imagine que libfoo ha estado en desarrollo durante un tiempo y mantiene su historial en un repositorio Git ( libfoo.git
). Independientemente, el proyecto de "barra" también ha estado en desarrollo (en bar.git
), pero no tanto como libfoo (la confirmación con la fecha más antigua en libfoo.git
tiene una fecha que precede a la confirmación con la fecha más temprana en la bar.git
). En algún momento, los desarrolladores de "bar" deciden incorporar libfoo en su proyecto utilizando una fusión de subárbol. Antes de esta fusión, podría haber sido trivial determinar el "primer" commit en bar.git
(probablemente solo hubo un root commit). Sin embargo, después de la fusión, hay múltiples confirmaciones de raíz y la primera confirmación de raíz proviene de la historia de libfoo , no de "barra".
Puedes encontrar todos los root commit de la historia DAG así:
git rev-list --max-parents=0 HEAD
Para el registro, si --max-parents
no estaban disponibles, esto también funciona:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Si tiene etiquetas útiles en su lugar, entonces git name-rev
podría ofrecerle una visión general rápida del historial:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
Prima
Usa esto a menudo? Difícil de recordar? Agrega 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
Encontre eso:
git log --reverse
muestra confirmaciones desde el inicio.
No es la forma más hermosa de hacerlo, supongo:
git log --pretty=oneline | wc -l
Esto le da un número entonces
git log HEAD~<The number minus one>
Puede revertir su lote y seguirlo para el primer resultado.
git log --pretty=oneline --reverse | head -1
git log $(git log --pretty=format:%H|tail -1)