¿Cómo mostrar los files (del área de preparación) en stash?

Estoy usando git 1.7.1 . Mi escenario es algo como se describe a continuación:

He agregado 5 nuevos files a mi proyecto y he modificado 1 file existente. Ahora decido los cambios actuales para ocultar y mover a una twig diferente. Entonces, agrego todos los 5 nuevos files al área de preparación y luego los oculto. Deje que [email protected]{0} sea ​​mi escondite. Entonces, en el escondite [email protected]{0} , hay 5 files nuevos en el área de preparación y 1 file modificado en el directory de trabajo.

Ahora hago una git stash list . Me da la siguiente list de depósitos:

 [email protected]{0} [email protected]{1} [email protected]{2} [email protected]{3} [email protected]{4} [email protected]{5} 

Después de un día o dos, volví y quise verificar la list disponible de depósitos y luego quería verificar qué escondite contiene qué. Por lo tanto, probé, git stash show -p [email protected]{0} . Esto me da los cambios de solo 1 file que he modificado en el directory de trabajo. No da ninguna información de que hay 5 files nuevos en el área de ensayo. Una forma de hacerlo es aplicar el alijo a una twig y hacer un git status . Eso daría la salida deseada.

Pero lo que estoy buscando aquí es get esta información antes de aplicar un alijo a cualquier sucursal. ¡Cualquier ayuda es muy apreciada!

Un escondite consiste en dos (o a veces tres) confirmaciones. Estos commits no están en una twig, sino que se encuentran a través de la reference especial de stash ( refs/stash ) y su reflog ( [email protected]{ n } , para cualquier integer n , es un nombre de reflog). Estos dos (o tres) commits mantienen el estado del índice / área de ensayo, el estado del tree de trabajo y, si está presente el tercer compromiso, los files sin seguimiento o los files extra "todos" (de git stash save -u o git stash save -a ). Me gusta referirme a estos como i , w y u commits de un "alijo" , ya que si dibujas estos dos (o tres) commits como parte de un dibujo de commit-graph, se ven como una pequeña bolsa colgando un compromiso.

El command git stash show ejecuta git diff para comparar el w commit con su padre. Lo que necesita es comparar el i commit (a i 's o w 's parent, marcado * en el siguiente diagtwig). No hay bandera para git stash show para hacer esto, pero puedes hacer uso de la estructura de la bolsa de basura:

  • Los puntos de reference de stash o [email protected]{n} apuntan directamente a w commit.
  • El primer padre de la confirmación w es la confirmación que fue HEAD cuando se guardó el alijo.
  • The i commit es el segundo padre de la w commit. (Esto significa que el w commit es un commit de fusión, pero ¡no intente usarlo como una fusión!) El i commit tiene un padre soltero, que es el mismo padre que el primer padre de w .
  • Si existe el commit u , es el tercer padre de w , y es en sí mismo un commit raíz (no tiene padre).

Encuentro que los caracteres de la flecha Unicode no se muestran correctamente en todos los visores, por lo que este diagtwig tiene las flechas un poco más grandes:

 ...<-- o <-- o <-- * <-- o <-- o <-- branch ^ |\ | \ i<-w <-- [email protected]{3} 

En este diagtwig, commit * es la confirmación que fue la confirmación de HEAD cuando se guardó este alijo (pero desde entonces, se han agregado dos confirmaciones más a la branch ).

Git tiene una syntax especial para pasar de un compromiso específico a sus padres, como se describe en la documentation de gitrevisions , por lo que puede get una comparación diff commit w para commit * :

 git diff [email protected]{3} [email protected]{3}^ 

Esto es lo que hace el git stash show : los nombres [email protected]{3} commit w y [email protected]{3}^ su padre, que es commit * . Pero lo que quiere es comparar commit i para commit * :

 git diff [email protected]{3}^2 [email protected]{3}^ 

Tenga en count que también puede comparar i y w , si lo desea, al nombrar [email protected]{3}^2 (el segundo padre de w = i ) y el [email protected]{3} ( w mismo), en ese order.

(Como atajo, puede usar git show en i commit, ya que git show diffs a commit contra sus padres. Tenga en count que usar git show en w es less útil: w tiene dos padres, por lo que git show produce una combinación diff , que es razonable para las comprobaciones de fusión regulares, pero rara vez es muy útil para estas w confirmaciones, ya que no son confusiones de fusión normales.)