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:
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 :)
git log -1
.Respuestas:
Respuesta corta
( del comentario de tiho . Como Chris Johnsen se da cuenta ,
--max-parents
fue 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.git
repositorio 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 (inbar.git
), pero no durante tanto tiempo libfoo (el commit con la fecha más temprana enlibfoo.git
tiene una fecha que precede al commit con la fecha más tempranabar.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ónbar.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:
Para el registro, si
--max-parents
no estuviera disponible, esto también funciona:Si tiene etiquetas útiles en su lugar, entonces
git name-rev
podría darle una visión general rápida del historial:Prima
¿Usar esto a menudo? Difícil de recordar? Agregue un alias git para un acceso rápido
Ahora puedes simplemente hacer
fuente
git rev-list --max-parents=0 HEAD
hará lo mismo, y es un poco más simple.Encontre eso:
muestra confirmaciones desde el principio.
fuente
git log --reverse -5
hace ignorar--reverse
por alguna razónPuede simplemente revertir su registro y simplemente encabezarlo para el primer resultado.
fuente
git log --reverse
invierte el historial, por lo que debe usarlo enhead -1
lugar detail -1
obtener la primera confirmación.-n
bandera cuando--reverse
se da.fuente
git log $(git log --reverse --pretty=format:%H|head -1)
No es la forma más hermosa de hacerlo, supongo:
Esto te da un número entonces
fuente
git log --format="%h" | tail -1
le da el hash de confirmación (es decir0dd89fb
), que puede alimentar a otros comandos, haciendo algo comogit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
para ver todos los commits en el último día.fuente