¿Es posible obtener una vista previa del contenido de alijo en git?


554

A menudo guardo el trabajo para más tarde, luego aparecen otras cosas y, unas semanas más tarde, quiero inspeccionar el alijo y descubrir qué cambios haría si lo aplicara al árbol de trabajo en su estado actual.

Sé que puedo hacer un git diff en el alijo, pero esto me muestra todas las diferencias entre el árbol de trabajo y el alijo, mientras que solo estoy interesado en saber qué va a cambiar la aplicación del alijo.

¿Cómo puedo hacer esto?


1
salida diff coloreada: git stash show -p stash@{1} >~/.diff && vim ~/.diff(no tiene que ser vimningún editor de texto siempre que su editor de texto tenga soporte para resaltar la sintaxis para la diffsalida).
Trevor Boyd Smith

Respuestas:


729

git stash showle mostrará los archivos que cambiaron en su escondite más reciente. Puede agregar la -popción para mostrar la diferencia.

git stash show -p

Si el alijo que le interesa no es el más reciente, agregue el nombre del alijo al final del comando:

git stash show -p stash@{2}

Eso se ve bien, y lo veo en el manual, pero cuando lo intento me da, ¿ fatal: unable to create temp-file: Invalid argumentalguna idea de por qué?
Benjol

29
Use git stash show -p stash@{0}para ver un alijo específico. 0 muestra el último tono, 1 el segundo último .. etc. git stash listmostrará todos los disponibles.
brita_

66
Si está utilizando PowerShell, deberá poner el nombre del alijo entre comillas. (es decir: git stash show -p 'stash@{0}')
scott-pascoe


1
Si desea guardar diff en el uso de archivosgit stash show -p stash@{0}> stash.txt
S_K

87

Para ver una lista actual de alijo:

git stash list

Verás una lista como esta:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Para ver diff en cualquiera de esos escondites:

git stash show -p stash@{n}

34

Soy fanático de gitkla interfaz gráfica de usuario para visualizar repositorios git. Puede ver el último elemento escondido con:

gitk stash

También puede usar ver cualquiera de sus cambios escondidos (según lo enumerado por git stash list). Por ejemplo:

gitk stash@{2}

En la captura de pantalla a continuación, puede ver el alijo como una confirmación en la esquina superior izquierda, cuándo y de dónde vino en el historial de confirmación, la lista de archivos modificados en la parte inferior derecha y la diferencia línea por línea en la parte inferior -izquierda. Todo mientras el alijo todavía está escondido.

Gitk viendo un alijo


55
Puede proporcionar varios stash@{X}valores en la línea de comandos para ver más resultados a la vez, pero no he encontrado una manera simple de decir 'mostrar todas las entradas de escondite' en gitk.
nobar

55
gitk stashparece ser taquigrafía paragitk stash@{0}
Leif Gruenwoldt

3
para mostrar todos los escondites en gitk que puedes usar gitk `git stash list --pretty=format:%gd`y luego busca "WIP on" para saltar al siguiente escondite.
Ikar Pohorský

2
gitk --reflogte permite ver todos los escondites y más.
nobar

1
Gitk fue la única herramienta que me mostró directamente que el alijo tenía archivos sin seguimiento guardados en él. Todos los demás me mostraron "sin diferencias".
Martin Bonner apoya a Monica el

22

Para ver todos los cambios en un alijo no reventado:

git stash show -p stash@{0}

Para ver los cambios de un archivo en particular en un alijo no reventado:

git diff HEAD stash@{0} -- path/to/filename.php

en caso de que uno no recuerde los nombres de archivo, también funciona para todos los archivos modificados git diff HEAD stash @ {0}
Simeon

Solo por claridad: -pes la abreviatura de --patch. La opción viene de git-diff. Si prefiere la forma larga, puede escribir git stash show --patch.
Peterino

5

Más allá de la recomendación de gitk en ¿Es posible obtener una vista previa del contenido oculto en git? puedes instalar tig y llamar tig stash. Este programa de consola gratuito / abierto también le permite elegir qué alijo comparar


1
¡Parece una herramienta perfecta para administrar múltiples escondites! También puede hacer estallar y soltar escondites con Py !teclas respectivamente.
Ikar Pohorský

Las alternativas TUI siempre son buenas, pero para la gente que ya está acostumbrada o que de alguna manera lo prefiere gitk , es relativamente fácil hackearlo para mostrar todos los escondites .
1737973

4

Lo uso para ver todos mis escondites con resaltado de diferencias de color (en Fedora 21):

git stash list | 
  awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n"; 
  system("git -c color.ui=always stash show -p " $1); }' | 
  less -R

(Adaptado de Git: vea qué hay en un alijo sin aplicar alijo )


4

Cuando se hizo esta pregunta por primera vez, esta puede no haber sido una opción, pero si usa PyCharm, puede usar la UnStash Changesherramienta (VCS-> Git-> UnStash Changes ...). Esto le permite ver la lista de cambios escondidos, así como pop, drop, clear o apply (en una nueva rama si lo desea):

Ventana de cambios de Unstah

y ver los archivos modificados por alijo:

Ventana de caminos afectados

así como diffs por archivo. En las diferencias, puede seleccionar los cambios individuales para aplicarlos desde los cambios escondidos a la rama de trabajo (usando el galón que apunta a la izquierda):

ingrese la descripción de la imagen aquí


3

Puede ver la lista de todas las reservas mediante el siguiente comando:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

El alijo más nuevo es el primero.

Simplemente puede seleccionar el índice nde alijo provisto en la lista anterior y usar el siguiente comando para ver los detalles escondidos

git stash show -p stash@{3}

Similar,

git stash show -p stash@{n}

También puede verificar diff usando el comando:

git diff HEAD stash@{n} -- /path/to/file

3

sí, la mejor manera de ver qué se modifica es guardar en un archivo así:

git stash show -p stash@{0} > stash.txt

2

Primero, podemos hacer uso de git stash list para obtener todos los elementos de alijo:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Entonces podemos usar git stash show stash@{N}para verificar los archivos bajo un alijo específico N. Si lo disparamos, entonces podemos obtener:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

La razón de esto puede ser que la cáscara está comiendo llaves y git ve stash@2y no stash@{2}. Y para solucionar esto, necesitamos usar comillas simples para llaves como:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Ver la lista de cambios escondidos

git stash list

Para ver la lista de archivos modificados en un alijo particular

git stash show -p stash@{0} --name-only

Para ver un archivo en particular en el escondite

git show stash@{0} path/to/file

1

Mostrar todos los escondites

Solo nombres de archivos:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Contenido completo del archivo en todos los escondites:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Obtendrá una salida de color diferenciada con la que puede paginar space ( hacia adelante ) y b( hacia atrás ), y qcerrar el localizador para el alijo actual. Si prefieres tenerlo en un archivo, añádelo > stashes.diffal comando.


1

Además de las respuestas existentes que sugiere usar (para mostrar la diferencia de la tercera a la última reserva)

git stash show -p stash@{2}

Tenga en cuenta que en la git-stashdocumentación , está escrito que

También se puede hacer referencia a los escondites especificando solo el índice de escondite (por ejemplo, el entero nes equivalente a stash@{n}).

Por lo tanto, también es posible usar (esto es equivalente al comando anterior)

git stash show -p 2

Lo que también debería evitar algunos problemas de Powershell .


1

Me gusta cómo gitkpuedo mostrarle exactamente lo que no se ha rastreado o se encuentra en el índice, pero de forma predeterminada mostrará esas "confirmaciones" ocultas en el medio de todas sus otras confirmaciones en la rama actual.

El truco es ejecutar gitk de la siguiente manera:

gitk "stash@{0}^!"

(La cita está ahí para que funcione en Powershell, pero de esta manera también debería funcionar en otros shells).

Si busca esta sintaxis en la página de ayuda de gitrevisions , encontrará lo siguiente:

La r1^!notación incluye commit r1 pero excluye a todos sus padres. Por sí misma, esta notación denota la confirmación única r1 .

Aparentemente, esto pondrá a gitk de tal modo que solo se mostrarán los padres inmediatos del commit seleccionado, que es exactamente lo que me gusta.


Si desea llevar esto más lejos y enumerar todas las reservas, puede ejecutar esto:

gitk `git stash list '--pretty=format:%gd^!'`

(Esas comillas simples dentro de los backticks son necesarias para apaciguar a Bash, de lo contrario se queja del signo de exclamación)

Si está en Windows y usa cmd o Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

El siguiente comando se puede usar para extraer el diferencial de cambio oculto nuevamente más que cualquier otro alijo o confirmación o ramificación o CABEZA.

git stash show
git show
git diff
git difftool

Veamos cómo podemos usar cada uno de los comandos mencionados anteriormente.

  1. git stash show

El comando simple git stash show ofrece un resumen muy breve de los cambios del archivo, pero no mostrará la diferencia de los cambios con el HEAD actual.

  1. git show

El comando git-show se usa para ver varios tipos de objetos.

El comando git-show no solo se usa para visualizar cambios de escondite, sino que también se usa para ver uno o más objetos como blobs, árboles, etiquetas y commits.

  1. git diff

El comando git-diff también es uno de los comandos comunes que se utiliza para mostrar los cambios entre commits, commit y work tree, etc.

Por defecto, git diff mostrará el diff del escondite seleccionado contra (archivos modificados) el estado actual del repositorio a menos que se especifique otra referencia de escondite o confirmación.

Para obtener la diferencia entre el escondite más escondido @ {0} y la rama maestra:

$ git diff stash @ {0} maestro

Solo muestra los nombres de los archivos, no las diferencias de los cambios:

$ git diff - escondite solo de nombre @ {0} maestro

Vea la diferencia entre las reservas seleccionadas para un archivo seleccionado:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. git difftool

El comando git-difftool también se puede utilizar para buscar diferencias entre el alijo seleccionado y el compromiso seleccionado o rama o alijo

Vea la diferencia entre los dos últimos escondites:

$ git difftool alijo @ {0} alijo @ {0} ^ 1

git difftool --dir-diff alijo @ {0} alijo @ {0} ^ 1

Resumen:

Comandos que son útiles para extraer la diferencia de stash seleccionado git stash show, git show, git diff, git difftool.

Vea la diferencia usando el comando git stash show,

git stash show -p stash @ {0}

Vea los cambios en el escondite usando el comando git show,

git show stash @ {1}

Vea la diferencia entre el último escondite y el commit seleccionado usando el comando git diff,

git diff stash @ {0}

Referencias

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

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.