7 minuto(s) de lectura

Git - diff

  • Los cambios en el (Working Directory) no están aún preparados {UnStaged} para la próxima confirmación git commit

    • Resumen

      • Muestra que has cambiado dentro del (Working Directory) pero no lo que has preparado {Staging Area/Index}
git diff
  • Este comando sin argumentos ni opciones compara el contenido que almacena el (Working Directory/WorkSpace) con el contenido que está en el {Staging Area/Index} , el resultado te muestra por pantalla todos los cambios que has hecho pero que todavía {No Has Preparado/Not-Staged} el archivo mediante el comando git add <archive>
git diff
  • Mostrar sólo los cambios de modificación en el archivo LICENCE

git diff LICENCE

  • LICENCE fue añadido mediante git add y paso del (Working Directory) al {Staging Area/Index} , se volvió a modificar el contenido del archivo y paso del {UnModified} del {Staging Area/Index} al {Modified}

Ejemplo : Muestra las diferencias no añadidas al {Index} mediante git add <archivo>

  • Para mostrar los cambios que existen en el (Working Directory/WorkSpace) relativos al commit seleccionado dentro del [Repositorio Local]

git diff <commit>

  • Muestra los cambios que existen en el (Working Directory/WorkSpace) relativos la branch seleccionado dentro del [Repositorio Local]

git diff <branch>

Opciones importantes

  • Comparación no considera blancos, ni lineas vacías git diff -b archivo1 archivo2

  • Muestra solo nombres de ficheros y su estado (sin diferencias) git diff --name-status

  • Muestra solo nombres de ficheros (sin diferencias) git diff --name-only

  • Muestra estadísticas de cambios (sin diferencias) git diff --stat o git diff --numstat

  • Muestra 200 líneas de contexto (probablemente todo el fichero) git diff --unified=2000

Uso diff –cached / –staged

  • Se usa para ver que tienes en el estado {Staging Area/Index/Staged} y que será incluido en el próximo commit

  • Muestra y compara todos los cambios {Staging Area/Index/Staged} con la última snapshot/confirmación/commit del [Repositorio] que descargaste

Al ejecutar el comando git diff con la opción –cached , el comando compará los cambios preparados {Staging Area/Index} con los del [Repositorio Local]

  • Cambios entre el {Index} y su último commit ; lo que sería confirmado si ejecuta git commit sin la opción -a
git diff --cached
  • Muestra todos los cambios de los ficheros {Staged} del [Repositorio Local]
git diff --cached
  • Muestra solo los cambios en LICENSE si están en {Staged} con respeto al [Repositorio Local]
 git diff --cached LICENCE
  • Si quieres ver lo que has preparado en el estado {Staged} para en tu próximo commit , esta opción compara sus cambios {Staged-Preparados} con su último commit dentro del [Repositorio Local]
git diff --staged
  • Comandos equivalentes : Realizan la misma acción
git diff --cached <archivo>
git diff --staged <archivo>
  • Cuando ejecutamos algunos de estos comandos nos aparecerán unas marcas y colores indicando las diferencias de código entre el antes y el después.

    • Líneas eliminadas o reemplazadas : Rojas y comienzan con el símbolo -

    • Líneas nuevas o añadidas : Verdes y comienzan con el símbolo +

Comparar archivos de 2 ramas

  • Buscar las diferencias entre un archivo concreto entre las ramas utilizamos el comando la ruta del archivo como tercer argumento con git diff
git diff <branch1> <branch2> 

Ejemplo

git diff rama-alternativa master
#           rama-alternativa   rama master
diff --git a/calculator.html b/calculator.html
index 29c6586..5010ee9 100644
--- a/calculator.html # Rama : Alternativa
+++ b/calculator.html # Rama : master

Comparar Ramas distintas o iguales

  • Este ejemplo introduce el punto . como operador
    • Sin Puntos
  • Muestra las últimas diferencias de contenidos entre las 2 ramas distintas dentro del mismo [Repositorio Local]
git diff branch1 branch2
  • 2 Puntos

El mismo resultado que el anterior ejemplo

 git diff branch1..branch2

Los dos puntos de este ejemplo indican que la entrada de diferencia son los extremos de ambas ramas. Si se omiten estos puntos y se utiliza un espacio entre las ramas, el efecto que se produce es el mismo. Además, está el operador de tres puntos

  • 3 Puntos

Compara la versión anterior del archivo antes del último commit y el último commit del archivo

git diff branch1...branch2

Operador de 3 puntos ... inicia la comparación cambiando el 1º parámetro de entrada branch1 ya que convierte el branch1 en una referencia de la confirmación antecesora común compartida entre las 2 entradas de diferencia.

El antecesor compartido de branch1 y branch2

El último parámetro de entrada permanece inmutable como extremo de branch2

Comparar mediante HEAD

  • Manual :

    • Cambiar en el (Working Tree) desde su último commit ; lo que sería confirmado si ejecuta git commit sin la opción -a
git diff HEAD
  • Puede usarse [HEAD] para comparar contra el último commit
    • Muestra la diferencia entre el [HEAD] que es el puntero que señala a la rama y al último commit con la que estamos trabajando en el [Repositorio Local] con los archivos que estén alojados (Sin Seguimiento/UnTracked) del (Working Directory) de la misma rama u otra.
git diff HEAD

Comparar Commit

  • En lugar de usar el final de la rama actual , compara con el final de la rama test
git diff test
  • En lugar de comparar con el final de la rama test , compará con el final de la actual rama , pero limita la comparación del archivo test
git diff HEAD -- ./test

[HEAD] → En cierto aspecto indica que estamos apuntando al último commit de la rama en la que nos encontremos situado actualmente trabajando.

  • Compara la versión del antepenúltimo commit con el último commit
git diff HEAD^ HEAD
  • Compara el último commit con 2 commit por debajo del último
git diff HEAD HEAD~2
  • Comparar 2 tree : el actual y el anterior tree de commits
git diff HEAD^{tree} HEAD^^{tree}

Ejemplo de ejecución del diff

A continuación se mostrará las diferencias entre los “Patrones de Flujo” de los ficheros que están en el estado {Modified} respeto al estado {UnModified} del {Index/Staging Area}

1.- Creamos un archivo básico con un texto sencillo.

Crear archivo

2.- Ejecutamos el comando git status para que nos muestre el estado del archivos

Ver estado archivo

El archivo ahora mismo está (UnTracked←→Sin Seguimiento) dentro de (Working Directory)

3.- Lanzamos el comando git add <archivo> para añadir el archivo al estado {Staging Area/Index} y así confirmar su envió al [Repositorio Local]

Añadir archivo

3.A - Vemos el estado actual del archivo hello.txt mediante el comando git status después de ejecutar el comando git add hello.txt

Ver estado actual

  • En la imagen indica que el archivo que anteriormente estaba (UnTracked←→Sin Seguimiento) ha pasado al estado

Changes to be committed que significa que necesita realizarle un git commit -m "Mensaje" para confirmar el registro del archivo y así pasar a una nueva etapa del proceso de guardado del contenido el cual sería {Staging Area/Index} - UnModified antes de pasar al Repositorio Remoto mediante el comando git push

  • Podemos ver en un parte de los mensajes de la terminal que podemos ejecutar el comando git restore --staged <file> ... → Esto significa que podemos volver el archivo al estado (UnTracked←→Sin Seguimiento) dentro de la sección (Working Directory)

Hacer git restore

  • Volvemos a ver el estado del archivo después de ejecutar el comando git restore --staged <archive>

Volver a ver el estado del archivo

  • Esta acción se realiza en el caso de que queramos dejar el archivo en el (UnTracked) porque realmente no queramos añadirlo al {Staging Area/Index}

  • Se puede leer en la terminal como dice

    • use git restore --staged <file>... TO UNSTAGE

Estas 2 acciones se pueden repetir las veces que queramos

4.- git commit -m "Mensaje" → Confirmamos el archivo creado llamado archivo.txt para ser enviado al {Staging Area/Index} → UnModified para ser subido al Repositorio Remoto mediante el comando git push

Volver a ver el estado del archivo

  • Confirmación del archivo

Volver a ver el estado del archivo

  • Ahora el archivo está en el [Repositorio Local] preparado para ser enviado al Repositorio Remoto mediante el comando: git push

Volver a ver el estado del archivo

  • Nuevo texto añadido

Volver a ver el estado del archivo

  • Ejecutamos el comando git status para ver el estado actual del archivo

Volver a ver el estado del archivo

  • El comando nos informa :

1-. El archivo está en adelante-ahead de origin/main para ser confirmado commit → Significa que está pendiente de ser enviado al Repositorio Remoto mediante git push

Volver a ver el estado del archivo

2-. Changes not staged for commit: → que significa que hay cambios sin confirmar debido a los últimos cambios realizados dentro del archivo y que no hemos añadido al {Staging Area/Index}

Nos dan 2 opciones :

  1. git add <file> → Volver a añadir el archivo con los nuevos cambios al {Staging Area/Index} para prepararlo para el próximo commit

  2. git restore <file> → Descartar los cambios que tiene el archivo en el (Working Directory)

Volver a ver el estado del archivo

  • Al final nos avisa de que los cambios no han sido añadidos add o confirmados commit y que lo hagamos mediante.

  • git add <archive>

  • git commit -m "Mensaje"

Volver a ver el estado del archivo

Ejecutamos el comando git diff archivo.txt y nos mostrará los datos que han cambiado desde el [Repositorio Local] al estado {Staging Area/Index} → Modified que también coincide con (UnTracked) porque el archivo con el nuevo cambio está actualmente SIN SEGUIMIENTO-(UnTracked) en nuestro proyecto

Volver a ver el estado del archivo

Si ejecutamos el comando git diff HEAD tendremos el mismo efecto porque ambos muestran las diferencias entre el [Repositorio Local] y la etapa (UnTracked) que coincide con la otra etapa {Staging Area/Index} ya que el archivo fue añadido con git add <archivo> y confirmado git commit -m "Mensaje" al [Repositorio Local]

Volver a ver el estado del archivo

Resumen Simplificado

git diff(Workspace) hasta {Index/Staging Area} → Archivos

git diff <commit or branch>(Workspace) hasta [Repo.Local] → Commits / Ramas

git diff --cached [<commit>]{Index/Staging Area} hasta [Repo.Local] → Archivos / Commits

git diff --staged [<commit>]{Index/Staging Area} hasta [Repo.Local] → Archivos / Commits

git diff <commit-1> <commit-2> → Compara ramas del [Repo.Local] → Sólo Commits

git diff HEAD → Muestra los cambios en el (Working Directory) con el último commit del [Repo.Local]

Resumen escrito a papel

Deja un comentario