¿Cómo muestro los cambios que se han organizado?


2141

Organicé algunos cambios para ser comprometidos; ¿Cómo puedo ver la diferencia de todos los archivos que se organizan para la próxima confirmación? Soy consciente del estado de git , pero me gustaría ver las diferencias reales, no solo los nombres de los archivos que están organizados.

Vi que la página del comando man git-diff (1) dice

git diff [--opciones] [-] […]

Este formulario es para ver los cambios que realizó en relación con el índice (área de preparación para la próxima confirmación). En otras palabras, las diferencias son lo que podría decirle a git para agregar aún más al índice, pero aún no lo ha hecho. Puede organizar estos cambios utilizando git-add (1).

Desafortunadamente, no puedo entender esto. Debe haber una sola línea útil para la que podría crear un alias, ¿verdad?


76
git status -vtambién funciona Vea mi respuesta a continuación
VonC

3
@VonC Siempre uso esto, pero entubado less, como en: git status -v | less- fragmentos manejables :)
Mr Office

Respuestas:


2613

Solo debería ser:

git diff --cached

--cachedsignifica mostrar los cambios en el caché / índice (es decir, cambios por etapas) contra la corriente HEAD. --stagedes sinónimo de--cached .

--stagedy --cachedno señala HEAD, solo la diferencia con respecto a HEAD. Si elige qué comprometer usando git add --patch(o git add -p), --stageddevolverá lo que está en escena.


35
Si solo desea los nombres de archivo, haga lo siguiente git diff --name-only --cachedpor publicación en stackoverflow.com/a/4525025/255187
Michel Hébert

44
Use esto en git difftool --stagedlugar de git diff --stagediniciar la herramienta de diferencia visual predeterminada en cada archivo. difftoolpuede ser sustituido por diffcualquier otro argumento también.
LightCC

Y puede usar git difftool --staged -dpara diferenciar los dos directorios en una herramienta visual en lugar de un archivo a la vez.
Robert Bernstein

dado que esta está marcada como respuesta y muestra primero, debe incluir git diff en la parte superior, luego git [[otros]], solo mis 2 centavos
Vitaliy Terziev

Y para ver los cambios en un solo archivo organizado, lo siguiente funcionará:git diff --cached -- <stagedfile>
ObviousChild

1606

Un gráfico simple aclara esto:

Diferencias simples de Git

git diff

Muestra los cambios entre el directorio de trabajo y el índice. Esto muestra lo que ha cambiado, pero no está preparado para una confirmación.

git diff - caché

Muestra los cambios entre el índice y el HEAD (que es la última confirmación en esta rama). Esto muestra lo que se ha agregado al índice y preparado para una confirmación.

git diff HEAD

Muestra todos los cambios entre el directorio de trabajo y HEAD (que incluye cambios en el índice). Esto muestra todos los cambios desde la última confirmación, ya sea que se hayan preparado o no para la confirmación.

También :

Hay un poco más de detalle en 365Git.


8
Esto es ingenuo, me temo (como suele ser el caso con cualquier explicación git). Si tiene modificaciones locales foo.cy no realiza git add foo.c, entonces nofoo.c está en el índice ; no está preparado para comprometerse. Si git diff foo.cingenuamente se compara con el trabajo foo.ccon el índice, entonces tendría que mostrar una diferencia gigante entre un archivo vacío / inexistente y todo el contenido de foo.c. De hecho, cuando un archivo no existe en el índice, git diffrecurre, para ese archivo, al usar la HEADcopia.
Kaz

99
@Kaz estrictamente hablando, el índice no es una pizarra en blanco. Es una copia virtual de la HEADque se aplican los cambios por etapas. Recuerde que Git funciona guardando cambios, no guardando archivos completos. Cuando presenta un archivo, solo almacena los cambios realizados. Si el índice está en blanco como implica, no sabría cómo guardar los cambios en el índice y tendría que guardar todo el archivo como "recién agregado", lo cual es incorrecto.
ADTC

8
@Kaz Tanto el índice como el HEADtendrán la versión sin cambios del foo.carchivo (no son copias físicas, sino solo copias lógicas para usted y para mí. Para Git son la misma secuencia de datos a la que se refiere cada confirmación que haya involucrado ese archivo) ) Así que cuando lo hace git diffen el totalmente unstaged foo.cen realidad no es caer de nuevo a HEADque en realidad es hacer el diff con el índice (que pasa a contener exactamente la misma versión del archivo como HEADlo hace). Entonces el gráfico es correcto.
ADTC

2
Hola, me gustaría saber qué significa " índice " en este contexto. ¡Gracias!
Gab 是 好人

2
@TomRussell git status -ves equivalente a git diff --cached(más, git statuspor supuesto)
wisbucky

54

Si le interesa una vista visual de lado a lado, la herramienta difusa visual difusa puede hacerlo. Incluso mostrará tres paneles si se realizan algunos pero no todos los cambios. En el caso de conflictos, incluso habrá cuatro paneles.

Captura de pantalla de difusa con ediciones por etapas y por etapas

Invocarlo con

diffuse -m

en tu copia de trabajo de Git.

Si me preguntas, la mejor diferencia visual que he visto en una década. Además, no es específico de Git: interopera con una gran cantidad de otros VCS, incluidos SVN, Mercurial, Bazaar, ...

Ver también: ¿ Mostrar el árbol en etapas y en funcionamiento en git diff?


1
Gracias, esto parece una buena herramienta. He descubierto que Meld es la mejor herramienta de diferencia visual para Linux hasta ahora, pero extrañé la posibilidad de diferenciar el texto del portapapeles: Meld requiere archivos para la entrada. Difuso permite esto, así como la realineación manual. Lo probaré por un tiempo.
Drew Noakes el

Enlace roto a diffuse.sourceforge.net, use sourceforge.net/projects/diffuse por ahora.
user1133275

1
brew install diffusefunciona en OS X. No muestra 3 paneles si hay cambios no organizados y por etapas: ¿quiso decir que los cambios aún no están en el índice?
Brent Faust

¿Qué versión de difusa tienes? Sí, si agrega un archivo y luego lo modifica localmente, debería mostrar tres paneles.
krlmlr

Usted podría también configurar difusa como predeterminado difftool y el uso que mecanismo incorporado de la herramienta / / alias para lanzarlo. Vea mi respuesta aquí: < stackoverflow.com/a/45684512/6501141 >
LightCC

50

Tenga en cuenta que git status -v también muestra los cambios por etapas! (lo que significa que necesita tener puesta en escena - git addalgunos cambios. Sin cambios por etapas, sin diferencias git status -v.
Lo hace desde Git 1.2.0, febrero de 2006 )

En su forma larga (predeterminada), git statustiene una opción "detallada" no documentada que realmente muestra la diferencia entre HEAD e index.

Y está a punto de ser aún más completo: consulte "¿ Mostrar tanto el árbol en etapas como el árbol de trabajo en git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v

La última línea debería sergit diff HEAD
artur

2
@artur ¿por qué? El punto de la respuesta es mencionar que git status -vvtambién incluye lo que git diff HEADhace.
VonC

No funciona en git version 1.8.3.1. Sé que es viejo, pero si es posible, tenga en cuenta cuándo se introdujo esta bandera.
onebree

2
@onebree 1.8.3.1 es junio de 2013, de hecho, viejo. Pero git status -ves más antiguo ( github.com/git/git/commit/… , git 1.2.0, febrero de 2006). Tenga en cuenta que muestra la diferencia entre el índice y HEAD: si ha agregado algo al índice (no git add), git status -vno mostrará ninguna diferencia. git status -v -ves más reciente (Git 2.3.4, marzo de 2015)
VonC

@VonC ese fue mi error ... lo hice git diff -v.
onebree

25

Puedes usar este comando.

git diff --cached --name-only

La --cachedopción de git diffsignifica obtener archivos organizados, y la --name-onlyopción significa obtener solo nombres de los archivos.


2
Edite con más información. Se desaconsejan las respuestas de solo código y "pruebe esto", ya que no contienen contenido que se pueda buscar y no explican por qué alguien debería "probar esto".
abarisone

2
No estoy seguro de por qué querría esto, con la --name-onlyopción que también podría usar el regulargit status
Simon Forsberg

16

Desde la versión 1.7 y posteriores debería ser:

git diff --staged

15

UTILIZANDO UNA HERRAMIENTA VISUAL DIFF

La respuesta predeterminada (en la línea de comando)

Las respuestas principales aquí muestran correctamente cómo ver los cambios almacenados en caché / por etapas en Index:

$ git diff --cached

o $ git diff --stagedque es un alias.


Lanzamiento de la herramienta Visual Diff en su lugar

La respuesta predeterminada escupirá los cambios de diferencias en el git bash (es decir, en la línea de comando o en la consola). Para aquellos que prefieren una representación visual de las diferencias de archivos por etapas, hay un script disponible dentro de git que lanza una herramienta de diferencia visual para cada archivo visto en lugar de mostrarlos en la línea de comandos, llamada difftool:

$ git difftool --staged

Esto hará lo mismo que git diff --staged, excepto que cada vez que se ejecuta la herramienta diff (es decir, cada vez que diff procesa un archivo), se iniciará la herramienta visual diff predeterminada (en mi entorno, esto es kdiff3 ).

Después de que se inicie la herramienta, el script git diff se detendrá hasta que se cierre la herramienta visual diff. Por lo tanto, deberá cerrar cada archivo para ver el siguiente.


Siempre se puede usar difftoolen lugar de los diffcomandos in git

Para todas sus necesidades de diferencias visuales, git difftoolfuncionará en lugar de cualquier git diffcomando, incluidas todas las opciones.

Por ejemplo, para que se inicie la herramienta visual diff sin preguntar si se debe hacer para cada archivo, agregue la -yopción (¡creo que generalmente querrá esto!):

$ git difftool -y --staged

En este caso, extraerá cada archivo de la herramienta visual diff, uno a la vez, y mostrará el siguiente una vez que la herramienta se cierre.

O para ver la diferencia de un archivo en particular que se organiza en Index:

$ git difftool -y --staged <<relative path/filename>>

Para ver todas las opciones, consulte la página del manual:

$ git difftool --help


Configurar la herramienta Visual Git

Para usar una herramienta visual git que no sea la predeterminada, use la -t <tool>opción:

$ git difftool -t <tool> <<other args>>

O consulte la página de manual de difftool para saber cómo configurar git para usar una herramienta de diferencia visual predeterminada diferente.


Ejemplo .gitconfigEntradas de para vscode como herramienta diff / merge

Parte de la configuración de un difftool implica cambiar el .gitconfig archivo, ya sea a través de comandos git que lo cambian detrás de escena, o editarlo directamente.

Puede encontrar su .gitconfigen su directorio de inicio, como ~en Unix o normalmentec:\users\<username> en Windows).

O puede abrir el usuario .gitconfigen su editor Git predeterminado congit config -e --global .

Aquí hay entradas de ejemplo en mi usuario global .gitconfigpara VS Code como herramienta de diferencias y herramienta de fusión:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

Para la comparación del área de ensayo frente al repositorio (último compromiso), utilice

 $git diff --staged

El comando compara los $ git add fileNamecambios efectuados ( ) con su última confirmación. Si quieres ver lo que has puesto en escena en tu próximo commit, puedes usar git diff --staged. Este comando compara sus cambios por etapas con su última confirmación.

Para el uso de comparación de comparación de trabajo versus estadificación

$ git diff 

El comando compara lo que está en su directorio de trabajo con lo que está en su área de preparación. Es importante tener en cuenta que git diff por sí solo no muestra todos los cambios realizados desde su última confirmación, solo los cambios que aún no se han organizado. Si ha realizado todos sus cambios ($ git add fileName ), git diff no le dará salida.

Además, si organiza un archivo ( $ git add fileName) y luego lo edita, puede usar git diff para ver los cambios en el archivo que están en escena y los cambios que no están en escena.


"Para uso de comparación de trabajo vs repositorio $ git diff" . Estoy bastante seguro de que se git diffcompara entre Trabajar vs Estadificación. Ver stackoverflow.com/a/1587952
wisbucky

8

Si sus intenciones son apuntar hacia una rama de repositorio remota y su primer pase en un registro de cambios de confirmación fue incompleto, puede corregir la declaración de confirmación antes de presionar de esta manera.

En la zona

... hacer algunos cambios ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... recordar más cambios no mencionados en commit ...

git diff origin / master # mira cambios en etapas pero no empujados

... enmendar la declaración de confirmación por etapas ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

Si tiene más de un archivo con cambios por etapas, puede ser más práctico usarlo git add -i, luego seleccione 6: diffy finalmente elija los archivos que le interesan.


6

Por defecto, git diff se usa para mostrar los cambios que no se agregan a la lista de archivos actualizados de git. Pero si desea mostrar los cambios que se agrega o stagged entonces usted necesita para proporcionar opciones adicionales que le permitirá saber git que usted está interesado en los archivos stagged o añadido diff .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Ejemplo

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Una vez que haya agregado los archivos, no puede usar el valor predeterminado de 'git diff'. Debe hacer lo siguiente:

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git guiy git-colason utilidades gráficas que le permiten ver y manipular el índice. Ambos incluyen diferencias visuales simples para archivos en etapas, y git-colatambién pueden lanzar una herramienta de diferencia visual lado a lado más sofisticada.

Vea mi respuesta estrechamente relacionada en ¿Cómo eliminar un archivo del índice en git? , y también este catálogo oficial de clientes Git - GUI .


0

Piense también en la gitkherramienta, provista de git y muy útil para ver los cambios.

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.