git diff con respecto al tree de trabajo, incluidos los files sin seguimiento

Tengo un antiguo commit A. Ahora estoy en commit B = HEAD! = A, y quiero comparar el estado de mi directory de trabajo, INCLUYENDO files sin seguimiento, con A.

La razón es que los files actualmente sin seguimiento formaban parte de la confirmación A , por lo que no se mostrarían y, por lo tanto, no saturarían la diferencia que deseo.

Como solución alternativa, podría git add <all the untracked files> manualmente git add <all the untracked files> antes de que se git reset <all the untracked files> diff y git reset <all the untracked files> . Sin embargo, hay muchos files sin seguimiento, y me gustaría hacerlo de una manera máxima atómica y sólida, ya que estoy haciendo todo esto en un script.

EDITAR: Esta pregunta también se refiere a diff contra files no rastreados. Sin embargo, las respuestas requieren la adición manual y la eliminación posterior de los files sin seguimiento, y prefiero una solución que lo haga de forma más automática y atómica, a testing de errores contra interrupciones en un context con guiones. La respuesta aceptada hace exactamente esto, y de hecho es diferente de las respuestas a la pregunta vinculada.

Como otros han sugerido, puede usar git add -N para agregar inputs ficticias al índice. Corriendo:

 git diff <hash> 

comparará el tree de trabajo actual con el índice existente (que ahora tiene inputs para los files sin seguimiento) para decidir qué versiones del tree de trabajo para comparar con el <hash> dado ( <hash> puede ser un ID de confirmación , o una identificación de tree, o un nombre de twig, o cualquier cosa que Git pueda resolver en un tree). Pero esto no funciona bien con el índice, y como dijiste, tú:

me gustaría hacer esto de una manera máxima atómica y robusta

El truco es usar, en cambio, un índice temporal .

El compromiso inicial aquí tiene files bar y foo ; el segundo commit ha eliminado el file foo . El tree de trabajo actual ha resucitado y un nuevo file, como se muestra en el git status --short .

 $ git log --all --decorate --oneline --graph * 11b241c (HEAD -> master) remove foo * 8527327 initial $ git status --short A diffscript A foo 

Tenga en count que la confirmación inicial es 8527327 , que es lo que pasamos a diffscript como argumento:

 $ ./diffscript 8527327 diff --git a/diffscript b/diffscript new file mode 100755 index 0000000..8d5c978 --- /dev/null +++ b/diffscript @@ -0,0 +1,6 @@ +#! /bin/sh +export GIT_INDEX_FILE=$(mktemp) || exit +rm -f $GIT_INDEX_FILE +trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15 +git add -A +git diff ${1:-HEAD} index 3ec370c..d319048 100644 --- a/foo +++ b/foo @@ -1 +1 @@ -I am a foo +I was foo, am now resurrected 

Este diffscript diferencia por HEAD . Por lo tanto, si lo ejecutamos sin arguments, compararíamos el commmit 11b241c con el índice / tree de trabajo (porque añadimos git add -A en su mayoría no importa si lo comparamos con el índice o el tree de trabajo, en este punto: son esencialmente las mismas directivas modulo .gitignore ).

La línea trap ... se asegura de que eliminemos el índice temporal, ya sea que el script termine con ^ C (señal 2, SIGINT), o una desconnection de networking (señal 1, SIGHUP) o un QUIT (señal 3, SIGQUIT) o TERMINATE (señal 15, SIGTERM), o simplemente sale normalmente (0, no una señal, solo terminación normal).

Curiosamente, Git insiste en que el file no existe o tiene una firma de índice de file (no se permite un file vacío), por lo que eliminamos el file temporal mktemp makes, de modo que el paso de git add pueda crearlo con la firma correcta.

Puedes echar un vistazo a:

git add --intent-to-add (igual que git add -N )

Esto solo agregará una input vacía al índice, pero no los files en sí. La diferencia se verá al usar el command diff.

Documentación de GIT:

–intent-to-add

Esto es útil para, entre otras cosas, mostrar el contenido sin escena de dichos files con git diff y confirmarlos con git commit -a.> Registrar solo el hecho de que la ruta se agregará más tarde. Una input para la ruta se coloca en el índice sin contenido.