¿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
?
¿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
?
Respuestas:
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.
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
para obtener git 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 vez printf '\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 rompe git 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:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
Escribir solo d
incluirá archivos no rastreados en el diff (que es lo que me importa en mi flujo de trabajo), y d args...
se comportará como siempre git diff
.
Notas:
git diff
trata de diferencias individuales concatenadas, por lo que no es posible distinguir el d
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ón git
en algún momento en el futuro, ¡deje una nota aquí!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
solución sugerí para GITS de edad avanzada hace el trabajo con git stash
, suponiendo que ya tienes e69de29bb en su base de datos, por ejemplo, al tratar de utilizar add -N
previamente. Entonces, aparentemente no es exactamente equivalente de git 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, pero test "$#" -eq 0
es más precisamente lo que se pretende.
less
para que no tenga que presionar q
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
o less -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. Y xargs
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 de while
y read
, 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:
less $(git ls-files --others --exclude-standard)
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
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
También puede redirigir la salida a un archivo o usar otro comando diff en este caso.
git diff /dev/null <untracked_tile>
y obtener el parche en formato de parche en lugar de "solo" un archivo
git add -A
git diff HEAD
Genere un parche si es necesario y luego:
git reset HEAD
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 efectos
esto funciona para mi:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
El último paso es opcional, dejará el archivo en el estado anterior (sin seguimiento)
útil si también está creando un parche:
git diff --cached my_file.txt > my_file-patch.patch
Los cambios funcionan cuando se realiza y no se realiza con este comando. Los archivos nuevos funcionan cuando se organizan:
$ git diff HEAD
Si no están organizados, solo verá diferencias de archivos.
git add
de cada archivo no rastreado
git add
, es la más simple si su caso de uso es verificar lo que acaba de agregar / desea agregar
Para un archivo:
git diff --no-index /dev/null new_file
Para todos los archivos nuevos:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Como alias:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Para todos los archivos modificados y nuevos combinados como un comando:
{ git --no-pager diff; gdnew }
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
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
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.
Asumiendo que no tiene confirmaciones locales,
git diff origin/master
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
, y git 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. :)