git diff último commit más todos los cambios no confirmados?

Estoy trabajando en un repository en Brach, y tengo algunos cambios no confirmados.

$ git status <my local changes> 

También tengo un compromiso previo de "trabajo en progreso" con muchas diferencias, hecho por un colega.

 $ git log commit 6b388883f3e3cf2a864aeb335ce36e10f0e7a60d Date: Thu Jan 15 12:39:26 2015 +0000 Work in progress commit 91c868cda56e309b9a417f21c929a1beb1cc74d4 Date: Thu Jan 14 12:39:26 2015 +0000 <Last "real" commit to master> 

Ahora planeo crear una nueva twig basada en master (también 91c868cda56e309b9a417f21c929a1beb1cc74d4 como 91c868cda56e309b9a417f21c929a1beb1cc74d4 ), y crear un nuevo set de commites estructurados, para hacer un PR limpio.

Para hacer eso, sería muy útil generar un solo diff, con todos los cambios realizados (comprometidos y no confirmados) desde la última confirmación "real", 91c868cda56e309b9a417f21c929a1beb1cc74d4 .

Esta es una twig de usar y tirar, así que no importa lo que haga en esta twig.

¿Cuál es la mejor manera de hacer esto?

Una idea que tuve es que podía confirmar todos mis cambios locales, y luego 91c868cda56e309b9a417f21c929a1beb1cc74d4 entre esa confirmación y 91c868cda56e309b9a417f21c929a1beb1cc74d4 : ¿es posible ver una única diferencia de todos los cambios entre esas dos confirmaciones?

Con git diff tienes que seleccionar dos sets de files para comparar. Puede hacer esto especificando dos revisiones explícitamente, por ejemplo, git diff HEAD~3 HEAD^ , que difiere esas dos confirmaciones. O bien, puede diferir algunos commit con su tree de trabajo, o con su índice / área de ensayo; o compare su índice / área de ensayo con su tree de trabajo.

Para diferir un commit contra su tree de trabajo actual, nombre uno commit: git diff HEAD , git diff HEAD^ , git diff HEAD~2 , y así sucesivamente. Sin embargo, si no nombra un compromiso en particular, git diff compara su índice / área de ensayo con su tree de trabajo, en lugar de utilizar el compromiso HEAD .

Para diferir uno contra su índice / área de ensayo, nombre uno commit y también use --cached : git diff --cached HEAD~2 , y así sucesivamente. Nombre no commits y git está por defecto usando HEAD aquí.

Si nombra dos commits, git diff compara esos dos commits. Puede escribir ambos como commits separados, git diff HEAD~2 HEAD por ejemplo, o puede usar el .. formatting: git diff HEAD~2..HEAD . Aquí – --cached no tiene sentido, ya que significa "use index en lugar de work-directory" y el diff no usa el work-dir.

En su caso particular aquí, comparando HEAD^ , qué nombres comprometen 91c868cda56e309b9a417f21c929a1beb1cc74d4 , a su tree de trabajo es lo que quiere ahora. Sin embargo, si realizas una nueva confirmación ahora, al comparar HEAD^^ (o la confirmación explícita 91c868cda56e309b9a417f21c929a1beb1cc74d4 ) a tu nueva confirmación será lo que desees. Tu nuevo commit será el nuevo HEAD para que puedas diferenciar HEAD^^ vs HEAD en ese punto.

Vea la documentation de gitrevisions para muchas maneras de deletrear revisiones particulares.


Tenga en count que los arguments adicionales que no son indicadores de diferencias (los indicadores de diferencias son cosas como -w para ignorar el espacio en blanco) se toman como especificadores de ruta, para limitar el set de files diferidos. Por ejemplo, si tiene curiosidad por saber qué pasó con path/to/file.txt entre dos revisiones:

 git diff rev1 rev2 path/to/file.txt 

Si el nombre de un file "se parece" a un indicador de diferencia (¿qué --cached si quiere ver qué pasó con el file llamado – --cached por ejemplo?) Puede usar -- para separar "arguments destinados a controlar el propio diff" de "ruta" nombres destinados a limitar qué paths se difieren ".