¿Cómo ver los cambios en un commit de Git?

Respuestas:

1975

Para ver la diferencia de un COMMIThash particular :

git diff COMMIT~ COMMITle mostrará la diferencia entre COMMITel antepasado de ese y el COMMIT. Consulte las páginas de manual de git diff para obtener detalles sobre el comando y gitrevisions sobre~ notación y sus amigos.

Alternativamente, git show COMMIThará algo muy similar. (Los datos de la confirmación, incluida su diferencia, pero no para las confirmaciones de fusión). Consulte la página de manual de git show .

Nevik Rehnel
fuente
17
Tenga en cuenta que las ^necesidades deben citarse en los shells Thomson y Bourne (sinónimo de |allí) y rcsus derivados (operador de intercalación) y zshcon el notglobo extendido habilitado ( operador global)
Stephane Chazelas
3
Tenga en cuenta que HEAD^implica el primer padre en caso de que un commit tenga varios padres (es decir, commit de fusión).
Mansour
23
git diff COMMIT~ COMMITfunciona para mí, observe la tilde en lugar de descuidar. Estoy ejecutando git versión 2.6.1.windows.1 en Windows 10.
Juuso Ohtonen
14
@tradetree: se supone que la palabra COMPROMISO debe reemplazarse con el nombre de alguna confirmación, por ejemplo, la suma SHA.
Nick Matteo
9191
Siento que git show es más apropiado para esta pregunta y debería ser la sugerencia mencionada primero.
pypmannetjies
497

Como se menciona en " Taquigrafía para diff de git commit con su padre? ", También se puede usar git diffcon:

git diff COMMIT^!

o

git diff-tree -p COMMIT

Con git show, necesitarías (para enfocarte solo en diff) hacer:

git show --color --pretty=format:%b $COMMIT

El COMMITparámetro es commit-ish :

Un objeto de confirmación o un objeto que se puede desreferenciar recursivamente a un objeto de confirmación. Los siguientes son todos commit-ishes: un objeto commit, un objeto tag que apunta a un objeto commit, un objeto tag que apunta a un objeto tag que apunta a un objeto commit, etc.

Consulte gitrevision "ESPECIFICANDO REVISIONES" para hacer referencia a un commit-ish.
Vea también " ¿Qué significa tree-ish en Git? ".

VonC
fuente
371

También puedes probar esta manera fácil:

git show <COMMIT>
Lakhan
fuente
2
Parece que esto hace algo bastante diferente
Variable miserable el
3
Solo muestra el mensaje de confirmación. No es la diferencia de los cambios de código aplicados para esta confirmación.
k0pernikus
1
Si lo hace Por fin en las últimas versiones de git ...
Davy
2
Esta debería ser la respuesta correcta actualizada
Scott Skiles
1
Esta debería ser la respuesta.
Roel
77

git show muestra los cambios realizados en la confirmación más reciente.

Equivalente a git show HEAD.

git show HEAD~1 te lleva de vuelta 1 commit.

Adam Salma
fuente
45

Yo suelo hacer:

git diff HEAD~1

Para mostrar los cambios con respecto a la última confirmación. Si tiene más confirmaciones, aumente el número 1 a la cantidad de confirmaciones que desea ver.

Alex
fuente
34

Primero obtenga la ID de confirmación usando,

git log #to list all

O

git log -p -1 #last one commit id

Copiar commit id.

Ahora usamos dos métodos para enumerar los cambios de una confirmación específica,

Método 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Método 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
fuente
2
¿Qué significa el ^!??
Martín Coll
2
^! es la abreviatura de commit ^ .. commit, lo que significa que excluirá a todos los padres y marcará diff en ese commit
Mohideen bin Mohammed
No soy un experto, pero tengo un caso (con varias ramas involucradas) donde git log c ^! no es exactamente lo mismo que git log c ^ .. c. De hecho, es mucho mejor: git log c ^ .. c enumeró demasiadas entradas mientras que git log c ^! hizo lo correcto, así que esto es lo que estaba buscando durante mucho tiempo
user829755
32
git show <commit_sha>

Esto le mostrará exactamente lo que hay en esa confirmación. Creo que puedes hacer un rango simplemente poniendo un espacio entre dos commits shas.

git show <beginning_sha> <ending_sha>

lo cual es bastante útil si está haciendo un rebase a menudo porque sus registros de características estarán todos en una fila.

Iwnnay
fuente
25

Desde la página de manual para git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Use el tercero en el medio:

git diff [options] <parent-commit> <commit>

También desde la misma página de manual, en la parte inferior, en la sección de Ejemplos :

$ git diff HEAD^ HEAD      <3>

Compare la versión antes de la última confirmación y la última confirmación.

Es cierto que está redactado un poco confuso, sería menos confuso como

Compare la confirmación más reciente con la confirmación anterior.


fuente
3
Su nueva redacción se aplicaría a git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD no muestra ningún cambio.
user3690202
@ user3690202, lo que implica que no hay cambios para mostrar. ¿Es ese realmente el caso?
¿Cómo puede no haber cambios para mostrar? Si desea ver el último commit, seguramente a menos que sea un repositorio completamente nuevo, ¿habrá algunos cambios para mostrar?
user3690202
@ user3690202 es posible hacer un "commit vacío" con Git que en realidad no contiene ningún cambio del padre, aunque hay una protección incorporada que verifica y evita esto, aunque se puede anular con una opción de línea de comando. Dudo que haya creado intencionalmente una confirmación vacía, por lo que otra posibilidad es que de alguna manera tenga una conversión de finalización de línea previa al compromiso (u otras cosas divertidas de espacios en blanco) que está engañando a Git para que piense que no se han realizado cambios. ¿En qué plataforma estás ejecutando Git?
22

Lo siguiente parece hacer el trabajo; Lo uso para mostrar lo que ha sido traído por una fusión.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
fuente
¿Eso también funcionaría git log? (debido a stackoverflow.com/a/18585297/6309 )
VonC
16

Otra posibilidad:

git log -p COMMIT -1
John_West
fuente
1
@GrantMcLean Sí, y ya está en la respuesta más votada, así que no lo menciono.
John_West
11

Podrías usar git diff HEAD HEAD^1 para ver la diferencia con la confirmación principal.

Si solo desea ver la lista de archivos, agregue la --statopción.

Irshu
fuente
Esto es lo que quieres decir, git diff HEAD ^ 1 HEAD
Shibir Basak
Tenga en cuenta que esto mostrará lo que agregó como eliminado, ya que hará una comparación inversa. La forma en que debería leer el diffcomando es: ¿qué necesitaría cambiar en el archivo para pasar de commit HEADa commit HEAD^1?
brainplot
9
git difftool COMMIT^ <commit hash>

También es posible si ha configurado su difftool.

Vea aquí cómo configurar difftool o la página de manual aquí

Además, puede usar git diff-tree --no-commit-id --name-only -r <commit hash>para ver qué archivos se han cambiado / confirmado en un hash de confirmación de entrega

Chand Priyankara
fuente
9

Me gusta el siguiente comando para comparar una confirmación específica y su última confirmación:

git diff <commit-hash>^-

Ejemplo:

git diff cd1b3f485^-
Starcwl
fuente
6

Para ver el autor y el tiempo por uso de compromiso git show COMMIT. Lo que resultará en algo como esto:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Si desea ver qué archivos se han cambiado, ejecute lo siguiente con los valores de la línea de combinación anterior git diff --stat a2a2894 3a1ba8f .

Si desea ver la diferencia real, ejecute git --stat a2a2894 3a1ba8f

Nikita G.
fuente
"Si quieres ver la diferencia real, ejecuta git --stat a2a2894 3a1ba8f". Creo que te refieres git diff a2a2894 3a1ba8fo si no unknown option: --stat.
Fruta
5

Para verificar los cambios completos:

  git diff <commit_Id_1> <commit_Id_2>

Para verificar solo los archivos modificados / agregados / eliminados:

  git diff <commit_Id_1> <commit_Id_2> --name-only

NOTA : Para verificar diff sin commit en el medio, no necesita poner los identificadores de commit.

bit_cracker007
fuente
4

Estoy ejecutando Git versión 2.6.1.windows.1 en Windows 10, por lo que necesitaba una ligera modificación a la respuesta de Nevik (tilde en lugar de caret):

git diff COMMIT~ COMMIT

Otra opción es citar el cursor:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
fuente
3

Este comando te dará el commit-hash principal de Git:

git log -n 2 <commit-hash>

Después de esto git diff-tool <commit-hash> <parent-commit-hash>

Ejemplo:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Después de este

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
souparno majumder
fuente
2

Si solo desea ver los cambios en la última confirmación, simplemente git showse lo dará.

MyrionSC2
fuente
1

En caso de comprobar el cambio de origen en una vista gráfica,

$gitk (Mention your commit id here)

por ejemplo:

$gitk HEAD~1 
usuario272390
fuente
No entiendo por qué esta respuesta fue rechazada. Estoy de acuerdo en que la línea de comando y el material basado en texto es el camino a seguir, pero gitk proporciona mucha información útil.
ShellFish