¿O solo todas las confirmaciones que ocurrieron entre dos fechas? En SVN, podrías hacer algo como
svn diff -r{date}:{date}
¡para hacerlo! Parece que no puedo encontrar un Git equivalente a esto.
Específicamente, estoy buscando escribir un script para enviar correos electrónicos diarios con todo el código comprometido ese día y por quién.
The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.
Entonces, los documentos alientan a usar engit log
lugar degit whatchanged
; este último comando también usa la opción --no-merge de git log, por lo que generan los mismos resultados.git whatchanged
está en desuso a partir de la última versión actual 2.21.0. Todo logit whatchanged
logrado se puede logrargit log
y solo se conserva por razones históricas. Ver detalles git-scm.com/docs/git-whatchanged/2.21.0Las sugerencias anteriores tienen algunos inconvenientes. Básicamente, estaba buscando algo equivalente a
cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. Mientras recopilaba más y más información, encontré una solución.Cosas que he probado:
git whatchanged --since="1 day ago" -p
desde aquiPero esto da una diferencia para cada confirmación, incluso si hay varias confirmaciones en un archivo. Sé que "fecha" es un concepto un tanto vago en git , pensé que debía haber alguna forma de hacer esto.
git diff 'master@{1 day ago}..master
da alguna advertenciawarning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
y no muestra todas las diferencias.git format-patch --since=yesterday --stdout
no da nada por mi.revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
funciona de alguna manera, pero parece complicado y no se limita a la rama actual.Finalmente:
git diff $(git rev-list -n1 --before="1 day ago" master)
Parece que funciona y es una forma predeterminada de hacer cosas similares , aunque más complicado de lo que pensaba.Curiosamente, git-cvsserver no admite "cvs diff -D" (sin que esté documentado en alguna parte).
fuente
git rev-list
, lo que contribuyó en gran medida a resolver un problema muy similar que estaba viendo.git diff 'master@{1 day ago}..master
sintaxis significa "verifique el reflog y averigüe dóndemaster
solía apuntar la rama en su repositorio local1 day ago
". Específicamente, no utilizará el historial de confirmaciones real de la rama actualmaster
. Esto rara vez es lo que realmente desea."fecha" es un concepto un tanto vago en git. Una confirmación tendrá una fecha de autor que puede ser un poco en el pasado antes de que alguien realmente extraiga / confirme la confirmación en su repositorio, también la confirmación puede volver a basarse y actualizarse para estar encima de una confirmación aparentemente más nueva.
Una confirmación también tiene una fecha de confirmación que se actualiza si una confirmación se vuelve a basar o se modifica de alguna manera. Es más probable que estas confirmaciones estén en algún tipo de orden cronológico, pero aún estás a merced de que el autor de la confirmación tenga la hora correcta configurada en su computadora y, aun así, una confirmación no modificada puede ubicarse en una rama de características en un repositorio remoto indefinidamente antes fusionándose en la rama maestra de un repositorio central.
Lo que probablemente sea más útil para sus propósitos es la fecha de re-registro en el repositorio particular en cuestión. Si tiene habilitados los reflogs por rama (consulte
git config core.logAllRefUpdates
), puede usar laref@{date}
sintaxis para referirse a dónde estaba una rama en un momento determinado.P.ej
También puede usar descripciones 'difusas' como:
Estos comandos mostrarán todas las confirmaciones que han "aparecido" en la rama dada del repositorio, independientemente de la "antigüedad" que tengan según su autor y las fechas de confirmación.
Tenga en cuenta que el reflog por rama es específico de un repositorio, por lo que si está ejecutando el comando de registro en un clon y no extrae durante (digamos) un mes, extraiga todos los cambios del último mes a la vez, luego, todos los cambios del último mes aparecerán en un
@{1 hour ago}..@{now}
rango. Si puede ejecutar el comando de registro en el repositorio 'central' al que la gente empuja, entonces puede hacer lo que quiera.fuente
@{time spec}
sintaxis siempre se refiere a su reflog local . No se refiere al historial de confirmaciones real (DAG). Si no comprende la diferencia, ¡no utilice esta sintaxis!o
fuente
@{time spec}
sintaxis siempre se refiere a su reflog local . No se refiere al historial de confirmaciones real (DAG). Si no comprende la diferencia, ¡no utilice esta sintaxis!Quizás
es lo que quieres (con o sin '--stdout')?
fuente
Creo que la solución general es usar:
Sin --first-parent, es posible que obtenga una confirmación de una rama que luego se fusionó
a ref
pero que no se había fusionado a partir dea date string
.Aquí hay una alternativa usando
--children
y engrep
lugar de-n1
:No estaba familiarizado
git whatchanged
antes de leer estas preguntas y respuestas, pero me da resultados muy diferentes, por lo que no estoy seguro de lo que está haciendo.fuente
Otra forma sencilla de obtener una diferencia de todos los cambios desde una fecha determinada es simplemente encontrar la primera confirmación
X
que se produjo en esa fecha o después, y luego usarEsto tiene la ventaja de que no depende de las entradas de nuevo registro en un clon nuevo, a diferencia de
soluciones en
fuente
Esta es una respuesta más divertida, porque probablemente haya una mejor manera. Esto mostrará todos los hash de confirmación de hoy.
; ·)
fuente
También puede usar git-format-patch para preparar parches (diffs) y enviarlos por correo electrónico.
Utilice las opciones [desde] o [rango de revisión] para especificar el rango de confirmaciones.
fuente
Para ver los cambios de los archivos Git de fecha a fecha en su rama, use la siguiente fórmula:
Fórmula :
Preste atención a que las fechas están en formato AAAA-MM-DD :
Si desea observar cambios en un archivo específico en un rango de tiempo específico (ver la diferencia en el código), simplemente navegue por el archivo actual:
Ejemplo :
fuente
Incluiré la forma en que lo hago:
git log
para una fecha, obtendrá valores hash de confirmación para la rama actual. Luego solo uso algo como logit diff 8fgdfg8..565k4l5
que me da la diferencia adecuada agregada por archivos. Espero que esto ayude, aunque no he probado muchofuente