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-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 quee83c516es 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.gittiene 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-parentsno estuviera disponible, esto también funciona:Si tiene etiquetas útiles en su lugar, entonces
git name-revpodrí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 HEADhará lo mismo, y es un poco más simple.Encontre eso:
muestra confirmaciones desde el principio.
fuente
git log --reverse -5hace ignorar--reversepor alguna razónPuede simplemente revertir su registro y simplemente encabezarlo para el primer resultado.
fuente
git log --reverseinvierte el historial, por lo que debe usarlo enhead -1lugar detail -1obtener la primera confirmación.-nbandera cuando--reversese 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 -1le 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`..HEADpara ver todos los commits en el último día.fuente