¿Es posible obtener git para producir una diferencia entre un archivo específico como existe ahora y como existía antes de la última confirmación que lo cambió?
Es decir, si sabemos:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Luego git diff 456def myfile
muestra el último cambio en myfile. Es posible hacer lo mismo sin el conocimiento producido por el git log
; ¿Qué cambió en 123abc?
git diff HEAD^ <file_path>
HEAD^
es123abc
,HEAD^^
es456def
; y si hubo otras confirmaciones que no afectaron este archivo, seHEAD^
refiere a ellas)Respuestas:
Esto existe, pero en realidad es una característica de
git log
:Tenga en cuenta que
-p
también se puede usar para mostrar la diferencia en línea de una sola confirmación:Opciones utilizadas:
-p
(también-u
o--patch
) está oculto deeeeeeeep en lagit-log
página de manual, y en realidad es una opción de visualización paragit-diff
. Cuando se usa conlog
, muestra el parche que se generaría para cada confirmación , junto con la información de confirmación, y oculta las confirmaciones que no tocan la especificada<path>
. (Este comportamiento se describe en el párrafo siguiente--full-diff
, lo que hace que se muestre la diferencia completa de cada confirmación).-1
muestra solo el cambio más reciente al archivo especificado (-n 1
se puede usar en lugar de-1
); de lo contrario, se muestran todas las diferencias distintas de cero de ese archivo.--follow
es necesario para ver los cambios que ocurrieron antes de un cambio de nombre.Por lo que puedo decir, esta es la única forma de ver de inmediato el último conjunto de cambios realizados en un archivo sin usar
git log
(o similar) para contar el número de revisiones intermedias o determinar el hash de la confirmación.Para ver los cambios de revisiones anteriores, simplemente desplácese por el registro o especifique una confirmación o etiqueta desde la cual iniciar el registro. (Por supuesto, especificar una confirmación o etiqueta lo devuelve al problema original de descubrir cuál es la confirmación o etiqueta correcta).
Crédito a quien crédito merece:
log -p
gracias a esta respuesta .--follow
opción.-n 1
opción y atatko por mencionar la-1
variante.-p
significa "semánticamente".fuente
git log -p filename
-n 1
parámetro.git log -p -n 1 filename
-n 1
también se puede reemplazar por-1
, no cambia el resultado, solo prefiero la sintaxis:git log -p -1 filename
git log -p -1 --skip=1 <path>
para mostrar la segunda confirmación.Una de las formas de usar git diff es:
Y una forma común de referir un commit del último commit es como una ruta relativa al HEAD real. Puede hacer referencia a confirmaciones anteriores como HEAD ^ (en su ejemplo, será 123abc) o HEAD ^^ (456def en su ejemplo), etc.
Entonces la respuesta a su pregunta es:
fuente
HEAD^
, pero por supuesto eso no produjo nada. No pensé en intentarloHEAD^^
.HEAD~2
HEAD^^ myfile
realidad se referirá al penúltimo commit que cambiómyfile
; se referirá al penúltimo compromiso general. ¿Hay alguna forma de especificar "Quiero ver el último cambio realizado en este archivo" sin especificar (parte de) el hash de confirmación o sin contar el número de confirmaciones entre el último cambio realizado en ese archivo y la revisión actual?git log -p
está bastante cerca.Si está bien usando una herramienta gráfica, esto funciona muy bien:
gitk ahora muestra todas las confirmaciones donde se actualizó el archivo. Marcar una confirmación le mostrará la diferencia con la confirmación anterior en la lista. Esto también funciona para directorios, pero también puede seleccionar el archivo para diferir para la confirmación seleccionada. Super útil!
fuente
git difftool HEAD^ file
ogit difftool -d HEAD^ path