¿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 -Nel 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 stashmientras tenga un --intent-to-addarchivo 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_2para obtenergit diffcolores de sintaxis, etc. en diffs ... hermoso./dev/nullen 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-addes inutilizable, porque se rompegit stash.Así que aquí está mi
git diffreemplazo. No es una solución particularmente limpia, pero como realmente solo la uso de forma interactiva, estoy de acuerdo con un truco:Escribir solo
dincluirá 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 difftrata de diferencias individuales concatenadas, por lo que no es posible distinguir eldresultado 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óngiten algún momento en el futuro, ¡deje una nota aquí!fuente
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txtsolució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 -Npreviamente. Entonces, aparentemente no es exactamente equivalente degit add -Nalguna manera: tbh, no estoy seguro de cómo.testcierto, 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 0es más precisamente lo que se pretende.lesspara que no tenga que presionarqpara 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 -roless -R). En total, es:do git -P diff --color=always -- /dev/null "$i"; done | less -rtest -t 1(por ejemplo,if [ -t 1 ]; then color_arg=--color; fio 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. Yxargspodría dar una manera de deshacerse del ciclo while. No obstante, deberá-n 1en 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 dewhileyread, 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
:ny:ppara 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 -pmucha 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
HEADes el valor predeterminado , por lo que es el mismogit diffque no resuelve el problema.git addde 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 diffcomando 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 masterme mostró los cambios en los archivos sin seguimiento.git diffno 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. :)