¿Es posible pedirle a git diff que incluya archivos sin seguimiento en su salida diff? ¿O es mi mejor apuesta para agregar los nuevos archivos que he creado y los archivos existentes que he editado y usar
git diff --cached
?
Con las versiones recientes de git puede git add -N
el archivo (o --intent-to-add
), que agrega un blob de longitud cero al índice en esa ubicación. El resultado es que su archivo "sin seguimiento" ahora se convierte en una modificación para agregar todo el contenido a este archivo de longitud cero, y eso se muestra en la salida "git diff".
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
Lamentablemente, como se señaló, no puede git stash
mientras tenga un --intent-to-add
archivo pendiente como este. Aunque si necesita guardar, simplemente agregue los nuevos archivos y luego los guarde. O puede usar la solución de emulación:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(configurar un alias es tu amigo aquí).
git add -N .
Creo que puede diferenciar los archivos en su índice y los archivos no rastreados simplemente proporcionando la ruta a ambos archivos.
fuente
git diff --no-index untracked_file_1 untracked_file_2
para obtenergit diff
colores de sintaxis, etc. en diffs ... hermoso./dev/null
en su lugar:git diff --no-index -- /dev/null <untracked_file>
.cat untracked_file_1
, o tal vezprintf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
si realmente necesita una salida verde. :) (Aunque en una nota más seria, tenga en cuenta que la sustitución de comandos eliminará las nuevas líneas finales de su archivo.)Para mi git interactivo del día a día (donde difiero el árbol de trabajo contra el HEAD todo el tiempo, y me gustaría tener archivos sin seguimiento incluidos en el diff),
add -N/--intent-to-add
es inutilizable, porque se rompegit stash
.Así que aquí está mi
git diff
reemplazo. No es una solución particularmente limpia, pero como realmente solo la uso de forma interactiva, estoy de acuerdo con un truco:Escribir solo
d
incluirá archivos no rastreados en el diff (que es lo que me importa en mi flujo de trabajo), yd args...
se comportará como siempregit diff
.Notas:
git diff
trata de diferencias individuales concatenadas, por lo que no es posible distinguir eld
resultado de un "diferencial real", excepto por el hecho de que todos los archivos no rastreados se ordenan al final.git diff
. Si alguien descubre cómo hacer esto, o si tal vez se agrega una funcióngit
en algún momento en el futuro, ¡deje una nota aquí!fuente
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
solución sugerí para GITS de edad avanzada hace el trabajo congit stash
, suponiendo que ya tienes e69de29bb en su base de datos, por ejemplo, al tratar de utilizaradd -N
previamente. Entonces, aparentemente no es exactamente equivalente degit add -N
alguna manera: tbh, no estoy seguro de cómo.test
cierto, está realizando una comparación de cadenas en lugar de una verificación de igualdad numérica con su comando. No debería afectar nada, perotest "$#" -eq 0
es más precisamente lo que se pretende.less
para que no tenga que presionarq
para cada archivo y se siente exactamente asígit diff
, al eliminar la paginación por archivo (-P
), y luego volver a agregarlo (| less
), preservando el color (--color=always
) e interpretándolo como color (less -r
oless -R
). En total, es:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(por ejemplo,if [ -t 1 ]; then color_arg=--color; fi
o algo así) es una forma para que el shell compruebe si su salida es un terminal, que es una forma útil de decidir el color. Yxargs
podría dar una manera de deshacerse del ciclo while. No obstante, deberá-n 1
en el que, por lo que va siendo lanzamiento GIT un montón de veces, y todavía tienen que ser parejas de esa manera, pero ... se deshace dewhile
yread
, lo que tal vez es mejor?!? Eso se lo dejo al lector.No es 100% al punto, pero si por alguna razón no desea agregar sus archivos al índice como lo sugiere la respuesta aceptada, aquí hay otra opción:
Si los archivos no se rastrean, obviamente, el diff es el archivo completo, por lo que puede verlos con menos:
Navegue entre ellos con
:n
y:p
para el siguiente y el anterior.Actualización de los comentarios: si necesita un formato de parche, también puede combinarlo con
git diff
:También puede redirigir la salida a un archivo o usar otro comando diff en este caso.
fuente
git diff /dev/null <untracked_tile>
y obtener el parche en formato de parche en lugar de "solo" un archivoGenere un parche si es necesario y luego:
fuente
git add -p
mucha frecuencia (lo que generalmente recomiendo, por cierto) ... Esto da una forma de hacer lo básico, solo ... debe tenerse en cuenta que tiene el potencial de un lado no deseado efectosesto funciona para mi:
El último paso es opcional, dejará el archivo en el estado anterior (sin seguimiento)
útil si también está creando un parche:
fuente
Los cambios funcionan cuando se realiza y no se realiza con este comando. Los archivos nuevos funcionan cuando se organizan:
Si no están organizados, solo verá diferencias de archivos.
fuente
HEAD
es el valor predeterminado , por lo que es el mismogit diff
que no resuelve el problema.git add
de cada archivo no rastreadogit add
, es la más simple si su caso de uso es verificar lo que acaba de agregar / desea agregarPara un archivo:
Para todos los archivos nuevos:
Como alias:
Para todos los archivos modificados y nuevos combinados como un comando:
fuente
Por lo general, cuando trabajo con equipos de ubicación remota, es importante para mí que tenga conocimiento previo de los cambios realizados por otros equipos en el mismo archivo, antes de seguir las etapas de git desanudar -> por etapas -> comprometerme para eso escribí un script bash que ayúdame a evitar una resolución innecesaria fusionar conflictos con el equipo remoto o hacer una nueva sucursal local y comparar y fusionar en la sucursal principal
en la secuencia de comandos anterior, busco la rama principal remota (no es necesariamente su rama maestra) para FETCH_HEAD hacer una lista de mi archivo modificado solo y comparar archivos modificados con git difftool
Aquí hay muchas herramientas compatibles con git, configuro 'Meld Diff Viewer' para una buena comparación de GUI.
fuente
Asumiendo que no tiene confirmaciones locales,
fuente
git diff
comando que incluya archivos sin seguimiento. Este comando no los incluye. Además, si existen compromisos locales o no tiene absolutamente nada que ver con la pregunta.git merge --squash mybranch
, ygit diff master
me mostró los cambios en los archivos sin seguimiento.git diff
no muestra diferencias en los archivos no rastreados: debido a que no están rastreados, nunca hay diferencias para mostrar, por definición. Así es como funciona Git. :)