Encontrar diferencias entre la versión actual y la última


670

Usando Git, ¿cómo puedes encontrar la diferencia entre la versión actual y la última?

git diff last version:HEAD

1
Si usa GitHub para la ubicación en la nube de su repositorio, es muy simple: vaya a su proyecto y haga clic en el encabezado "commits" en la tabla que muestra su proyecto
David Lundquist

1
El significado de "actual y la última versión" realmente debería aclararse en la pregunta.
faintsignal

Respuestas:


1171

Realmente no entiendo el significado de "última versión".

Como se puede acceder al commit anterior con HEAD ^, creo que está buscando algo como:

git diff HEAD^ HEAD

A partir de Git 1.8.5, @es un alias para HEAD, por lo que puede usar:

git diff @~..@

Lo siguiente también funcionará:

git show

Si desea conocer la diferencia entre head y cualquier commit, puede usar:

git diff commit_id HEAD

Y esto lanzará su herramienta visual diff (si está configurada):

git difftool HEAD^ HEAD

Como la comparación con HEAD es predeterminada, puede omitirla (como lo señala Orient ):

git diff @^
git diff HEAD^
git diff commit_id

Advertencias

  • @ScottF y @Panzercrisis explican en los comentarios que en Windows se ~debe usar el carácter en lugar de ^.

Quería algo así como la versión comprometida y la versión anterior ... git diff head head-1
Rajeev

77
A partir de Git 1.8.5, @es un alias para HEAD. Y puesto ~y ^son los mismos cuando sólo se va uno comprometerse atrás, me parece git diff @~..@mucho más fácil de escribir.
Andrew

80
@Andrew git showes aún más fácil, ya que @~..@es lo que se muestra por defecto.
amalloy el

3
git showsimplemente imprime el mensaje de confirmación, no genera una diferencia de los cambios específicos, al menos en Git 2.5.4 (Apple Git-61), por lo que en realidad no sería una respuesta a la pregunta del OP.
user1944491

1
El problema git showes que si se HEADtrata de una confirmación de fusión, no obtendrá lo que espera, ya que la confirmación de fusión en sí misma puede no tener ningún cambio. git diff HEAD^ HEADmostrará los cambios reales entre las versiones
RubenLaguna

158

Suponiendo que "versión actual" es el directorio de trabajo (modificaciones no confirmadas) y "última versión" es HEAD(últimas modificaciones confirmadas para la rama actual), simplemente haga

git diff HEAD

El crédito por lo siguiente va al usuario Cerran .

Y si siempre omite el área de preparación -acuando se compromete, simplemente puede usargit diff .

Resumen

  1. git diff muestra cambios no organizados.
  2. git diff --cached muestra cambios por etapas.
  3. git diff HEAD muestra todos los cambios (tanto en escena como sin escena).

Fuente: git-diff (1) Página del manual - Cerran


16
Y si siempre omite el área de preparación -acuando se compromete, simplemente puede usar git diff. <1> git diffmuestra unstaged cambios. <2> git diff --cachedmuestra los cambios por etapas . <3> git diff HEADmuestra todos los cambios (tanto en etapas como sin etapas). Fuente: Página del manual de git-diff (1)
Cerran

1
Esta debería ser la respuesta aceptada porque responde a la intención de la pregunta.
Tgoneil

¿Cuál es el nombre de "la versión actual no preparada" en git? ¿Hay realmente un nombre?
Mathieu CAROFF

118

Como se señaló en un comentario de amalloy , si por "versiones actual y última" te refieres a la última confirmación y la confirmación anterior, simplemente puedes usar

git show

55
Esto es lo que estaba buscando. Gran respuesta.
CodeManiak

12
Se usa git show HEAD~1para mostrar la confirmación de último pero uno, y git show HEAD~2etc. para las confirmaciones anteriores. Mostrar solo un archivo a través de git show HEAD~2 my_file.
Florian Brucker

60

Diferencia entre el último compromiso y el último compromiso (más el estado actual, si corresponde):

git diff HEAD~

o incluso (más fácil de escribir)

git diff @~

donde @es el sinónimo HEADde la rama actual y ~significa "dame el padre de la revisión mencionada".


Me gusta bastante git diff HEAD^(en lugar de la HEAD~forma equivalente ). Es un poco más fácil de recordar para un "viejo imbécil" como yo ;-)
sxc731

3
La zanahoria es un problema en algunas terminales. Es bueno tener la opción
light24bulbs

1
La respuesta podría mejorarse explicando qué significan ~y @.
Bob Stein el

1
Si solo queremos verificar lo que se confirma en la última confirmación, no lo use (ya que los cambios sucios afectan la diferencia). Una sintaxis más corta que realmente diff HEAD^ HEADdebería ser git diff @^!. Ver git-scm.com/docs/gitrevisions parar1^!
Johnny Wong

@JohnnyWong Gracias por tu aclaración. Mencioné "estado actual" para no confundir a los lectores.
Tomilov Anatoliy

53

También puedes hacerlo de esta manera:

Comparar con el commit anterior

git diff --name-status HEAD~1..HEAD

Compare con las dos confirmaciones actuales y anteriores

git diff --name-status HEAD~2..HEAD

16

Solo use la cachedbandera si agregó, pero aún no se ha comprometido:

git diff --cached --color

1
Esto era exactamente lo que estaba buscando cuando encontré esta pregunta. ¡Gracias!
William Rogers

7

Rápido y simple, asumiendo que estás en el maestro:

    git diff (checkout_id):file.txt file.txt

Ejemplo:

    git diff asdfioei91819280din198:file.txt file.txt

4

En primer lugar, use "git log " para enumerar los registros del repositorio.

Ahora, seleccione las dos ID de confirmación, correspondientes a las dos confirmaciones. Desea ver las diferencias ( ejemplo : la mayor cantidad de confirmaciones y algunas más antiguas (según sus expectativas de la versión actual y alguna versión anterior) ).

A continuación, use:

git diff <commit_id1> <commit_id2>

o

git difftool <commit_id1> <commit_id2>

3

Si HEAD señala la confirmación superior, puede hacer algo como esto:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

Diferencia entre la primera y la segunda confirmación:

git diff HEAD~1 HEAD

Diferencia entre el primer y el tercer compromiso:

git diff HEAD~2 HEAD

Diferencia entre segunda y tercera confirmación:

git diff HEAD~2 HEAD~1

Y así...


2

Yo uso Bitbucket con el Eclipse IDE con el Eclipse EGit complemento instalado.

Comparo un archivo de cualquier versión de su historial (como SVN ).

Menú Explorador de proyectos → Archivo → clic derecho → EquipoMostrar en el historial .

Esto traerá el historial de todos los cambios en ese archivo. Ahora Ctrlhaga clic y seleccione cualquiera de las dos versiones → "Comparar entre sí" .


2

Esto también funcionará para las etiquetas (elimine el 'uniq' a continuación y otras partes si necesita ver todos los cambios):

 git diff v1.58 HEAD 

Lo siguiente es lo mismo, y eso podría ser útil para la integración continua (CI) para microservicios en un repositorio monolítico:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(Crédito: https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo )

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.