oneline - ¿Puedo usar git diff en archivos sin seguimiento?
ignorar cambios git (10)
¿Es posible pedirle a git diff que incluya archivos sin seguimiento en su salida de 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 aparece en la salida de "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 se puede git stash
mientras se tiene un archivo pendiente de --intent-to-add
como este. Aunque si necesita esconder, simplemente agregue los nuevos archivos y luego los esconda. O puede utilizar la solución de emulación:
git update-index --add --cacheinfo /
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(configurar un alias es tu amigo aquí).
Creo que puede diferenciar los archivos en su índice y los archivos sin seguimiento simplemente proporcionando la ruta a ambos archivos.
git diff --no-index tracked_file untracked_file
Los cambios funcionan cuando se ponen en escena y no en etapas con este comando. Los nuevos archivos funcionan cuando se ponen en escena:
$ git diff HEAD
Si no están organizados, solo verá las diferencias de archivos.
No al 100%, pero como no hay una respuesta realmente satisfactoria, aquí hay otra de ese tipo;) Si los archivos no están rastreados, obviamente el diff es el archivo completo, por lo que puede verlos con menos:
less $(git ls-files --others --exclude-standard)
Navega entre ellos con: n y: p para el siguiente y el anterior.
Para mi información interactiva del día a día (en la que difiero el árbol de trabajo con el HEAD todo el tiempo, y me gustaría tener archivos sin seguimiento incluidos en el diff), add -N/--intent-to-add
se puede utilizar, porque breaks git stash
.
Así que aquí está mi reemplazo git diff
. No es una solución particularmente limpia, pero como realmente solo la uso interactivamente, estoy bien con un hack:
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 sin seguimiento en el diff (que es lo que me importa en mi flujo de trabajo), y d args...
se comportará como git diff
normal.
Notas:
- Estamos utilizando el hecho de que
git diff
es realmente solo diferencias individuales concatenadas, por lo que no es posible distinguir la salidad
desde una "diferencia real", excepto por el hecho de que todos los archivos sin seguimiento se ordenan en último lugar. - El único problema con esta función es que la salida está coloreada incluso si se redirige; Pero no puedo molestarme en agregar lógica para eso.
- No pude encontrar ninguna manera de incluir archivos sin seguimiento simplemente armando una lista de argumentos para
git diff
. Si alguien se da cuenta de cómo hacer esto, o si tal vez se agrega una característica agit
en algún momento en el futuro, ¡deje una nota aquí!
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 en un solo comando:
{ git --no-pager diff; gdnew }
Suponiendo que usted no tiene compromisos locales,
git diff origin/master
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ás creando un parche:
git diff --cached my_file.txt > my_file-patch.patch
por lo general, cuando trabajo con equipos de ubicación remota, es importante para mí tener conocimiento previo del cambio realizado por otros equipos en el mismo archivo, antes de seguir git stage Untrack -> staged -> commit para que escribí un script de bash que ayudarme a evitar la resolución innecesaria de resolver el conflicto de combinación con el equipo remoto o crear una nueva sucursal local y comparar y combinar 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 el script anterior, obtengo la rama principal remota (no es necesaria su rama maestra) para FETCH_HEAD, para hacer una lista de mi archivo modificado solamente y comparar los archivos modificados con git difftool
Aquí hay muchos difftool soportados por git, configuro ''Meld Diff Viewer'' para una buena comparación de GUI.
git add -A
git diff HEAD
Genere un parche si es necesario, y luego:
git reset HEAD