ver oneline modificados log ignorar ejemplo descartar comandos cambios archivos archivo git diff

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 salida d 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 a git 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