Profundización en Git Diff

GitGitBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

¡Bienvenido, explorador de Git! Hoy, vamos a profundizar en una de las características más poderosas y frecuentemente utilizadas de Git: el comando git diff. Si alguna vez has preguntado cuáles son exactamente los cambios que has realizado en tus archivos, o has necesitado comparar diferentes versiones de tu código, git diff es la herramienta que estabas buscando.

El comando git diff es como un microscopio para los cambios en tu código. Te permite ver las diferencias precisas entre varios estados de tu repositorio, ya sean cambios en tu directorio de trabajo, en tu área de preparación (staging area), entre confirmaciones (commits) o incluso entre ramas (branches).

En este laboratorio (lab), exploraremos cómo:

  1. Comparar tu directorio de trabajo con el área de preparación
  2. Comparar tu área de preparación con la última confirmación
  3. Comparar diferentes ramas
  4. Comparar archivos específicos
  5. Utilizar herramientas de comparación externas para una comparación más visual

Al final de este laboratorio, serás un experto en git diff, capaz de examinar tus cambios con precisión y confianza. Esta habilidad es crucial para revisar tu trabajo, preparar confirmaciones y colaborar de manera efectiva con otros.

¡Adentrémonos y comencemos a explorar el poder de git diff!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/SetupandConfigGroup -.-> git/config("Set Configurations") git/SetupandConfigGroup -.-> git/init("Initialize Repo") git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/branch("Handle Branches") subgraph Lab Skills git/config -.-> lab-387489{{"Profundización en Git Diff"}} git/init -.-> lab-387489{{"Profundización en Git Diff"}} git/add -.-> lab-387489{{"Profundización en Git Diff"}} git/commit -.-> lab-387489{{"Profundización en Git Diff"}} git/diff -.-> lab-387489{{"Profundización en Git Diff"}} git/branch -.-> lab-387489{{"Profundización en Git Diff"}} end

Configuración de tu espacio de trabajo

Antes de comenzar a hacer comparaciones (diffing), configuraremos un espacio de trabajo con algunos archivos y confirmaciones (commits) para comparar. Crearemos un nuevo directorio, inicializaremos un repositorio de Git y agregaremos algunos archivos con múltiples confirmaciones.

Abre tu terminal y escribe estos comandos:

cd ~/project
mkdir git-diff-lab
cd git-diff-lab
git init

Ahora, creemos algunos archivos y hagamos una serie de confirmaciones, copiando y pegando los siguientes comandos:

echo "## Git Diff Lab" > README.md
git add README.md
git commit -m "Initial commit"

echo "function greet(name) {" > greet.js
echo "  return 'Hello, ' + name + '!';" >> greet.js
echo "}" >> greet.js
git add greet.js
git commit -m "Add greet function"

echo "const numbers = [1, 2, 3, 4, 5];" > numbers.js
echo "console.log(numbers);" >> numbers.js
git add numbers.js
git commit -m "Add numbers array"

Desglosemos lo que acabamos de hacer:

  1. Creamos un archivo README y hicimos nuestra confirmación inicial.
  2. Creamos un archivo JavaScript con una función de saludo y lo confirmamos.
  3. Creamos otro archivo JavaScript con un arreglo de números y lo confirmamos.

¡Ahora tenemos un repositorio con algo de historia para explorar!

Comparando el directorio de trabajo y el área de preparación (staging area)

El uso más básico de git diff es ver los cambios en tu directorio de trabajo que aún no se han preparado (staged). Exploremos esto.

Primero, hagamos algunos cambios en nuestro archivo greet.js:

echo "function farewell(name) {" >> greet.js
echo "  return 'Goodbye, ' + name + '!';" >> greet.js
echo "}" >> greet.js

Ahora, usemos git diff para ver estos cambios:

git diff

Deberías ver una salida similar a esta:

diff --git a/greet.js b/greet.js
index 95f5574..a3641f6 100644
--- a/greet.js
+++ b/greet.js
@@ -1,3 +1,7 @@
 function greet(name) {
   return 'Hello, ' + name + '!';
 }
+function farewell(name) {
+  return 'Goodbye, ' + name + '!';
+}

Desglosemos esta salida:

  • La primera línea muestra qué archivos se están comparando.
  • Las líneas +++ y --- muestran qué versiones de archivo se están comparando (a/ es la versión original, b/ es la nueva versión).
  • La línea @@ proporciona contexto sobre dónde en el archivo se producen los cambios.
  • Las líneas que comienzan con + son adiciones, mientras que - indicaría eliminaciones.

Esta comparación (diff) nos muestra que hemos agregado tres nuevas líneas al archivo greet.js.

Presiona q para salir de la vista de comparación.

Ahora, preparemos (stage) estos cambios:

git add greet.js

Si ejecutas git diff nuevamente, no verás salida. Esto se debe a que git diff por defecto solo muestra los cambios no preparados (unstaged). Para ver los cambios preparados, debes usar git diff --staged, que cubriremos en el siguiente paso.

Recuerda, git diff sin ningún argumento compara tu directorio de trabajo con tu área de preparación. Es una excelente manera de revisar tus cambios antes de prepararlos.

Comparando el área de preparación (staging area) y la última confirmación (commit)

Ahora que hemos preparado (staged) nuestros cambios, aprendamos cómo comparar el área de preparación con la última confirmación. Esto es útil para revisar qué cambios se incluirán en tu próxima confirmación.

Para ver la diferencia entre el área de preparación y la última confirmación, utiliza:

git diff --staged

Deberías ver una salida similar a la que vimos en el paso anterior, mostrando la adición de la función farewell.

Este comando es especialmente útil cuando has ido preparando cambios con el tiempo y quieres revisar todo lo que estará en tu próxima confirmación.

Hagamos y preparemos otro cambio para ver cómo funciona esto:

echo "console.log(greet('World'));" >> greet.js
git add greet.js

Ahora, cuando ejecutes git diff --staged, verás tanto la función farewell como la nueva línea console.log.

Recuerda, git diff --staged (o git diff --cached, que es sinónimo) te muestra qué cambios están actualmente en tu área de preparación en comparación con la última confirmación. Es una excelente manera de revisar tus cambios preparados antes de confirmarlos.

Comparando ramas (branches)

Git diff también es útil para comparar diferentes ramas. Esto es especialmente útil cuando estás trabajando en una rama de característica (feature branch) y quieres ver cómo se diferencia de la rama principal (main branch).

Creemos una nueva rama y hagamos algunos cambios:

git checkout -b feature-branch
echo "const PI = 3.14159;" >> numbers.js
git add numbers.js
git commit -m "Add PI constant"

Ahora, comparemos esta rama con la rama principal:

git diff master feature-branch

Deberías ver una salida que muestre la adición de la constante PI al archivo numbers.js.

Este comando muestra las diferencias entre las puntas (tips) de las ramas master y feature-branch. Está diciendo "muéstrame qué cambios hay en feature-branch que no estén en master".

También puedes comparar tu rama actual con otra rama omitiendo el nombre de la primera rama:

git diff master

Esto compara tu rama actual (feature-branch) con master.

Recuerda, cuando compares ramas:

  • Los cambios en la primera rama (o en la rama actual si se omite) pero no en la segunda se muestran como eliminaciones (con un -).
  • Los cambios en la segunda rama pero no en la primera se muestran como adiciones (con un +).

Esta función es increíblemente útil cuando estás preparando para fusionar ramas o cuando quieres ver qué cambios introduce una rama de característica.

Comparando archivos específicos

A veces, solo quieres ver los cambios de un archivo específico o de un conjunto de archivos. Git diff te permite hacer esto fácilmente.

Hagamos cambios en múltiples archivos:

echo "function multiply(a, b) { return a * b; }" >> greet.js
echo "const doubledNumbers = numbers.map(n => n * 2);" >> numbers.js

Ahora, si queremos ver solo los cambios en greet.js, podemos usar:

git diff greet.js

Esto mostrará solo los cambios realizados en greet.js.

También puedes comparar un archivo específico entre ramas:

git diff master feature-branch -- numbers.js

Esto muestra las diferencias en numbers.js entre las ramas master y feature-branch.

El -- en el comando anterior se utiliza para separar la ruta del archivo de los nombres de las ramas. No siempre es necesario, pero es una buena práctica usarlo para evitar ambigüedades, especialmente si los nombres de tus archivos podrían ser confundidos con nombres de ramas.

Recuerda, puedes usar rutas de archivos con cualquiera de los comandos de comparación (diff) que hemos aprendido. Esto es especialmente útil en proyectos más grandes donde puedas tener cambios en muchos archivos pero solo quieras centrarte en unos pocos.

Usando herramientas de comparación externas

Si bien la herramienta de comparación (diff) integrada en Git es poderosa, a veces es posible que desees una representación más visual de tus cambios. Muchos desarrolladores utilizan herramientas de comparación externas para este propósito.

Una herramienta popular es vimdiff. Configuremos Git para que utilice vimdiff:

git config --global diff.tool vimdiff
git config --global difftool.prompt false

Ahora, en lugar de git diff, puedes usar git difftool:

git difftool

Esto abrirá cada archivo modificado en vimdiff. Puedes navegar entre archivos utilizando :n para el siguiente y :prev para el anterior. Para salir de vimdiff, utiliza :qa!.

Hay muchas otras herramientas de comparación disponibles, como Beyond Compare, KDiff3 o P4Merge. La elección de la herramienta a menudo depende de las preferencias personales y del sistema operativo que estés utilizando.

Recuerda, aunque las herramientas de comparación visuales pueden ser muy útiles, especialmente para cambios más grandes, no siempre son necesarias. Muchos desarrolladores se vuelven proficientes con la salida estándar de git diff y prefieren su velocidad y simplicidad para el uso diario.

Resumen

¡Felicidades, detective de diferencias (diff)! Acabas de adentrarte en profundidad en el mundo de git diff. Repasemos los conceptos clave que hemos cubierto:

  1. Comparando el directorio de trabajo (Working Directory) y el área de preparación (Staging Area): Aprendiste cómo ver los cambios no preparados (unstaged) en tu directorio de trabajo.
  2. Comparando el área de preparación y la última confirmación (commit): Descubriste cómo revisar los cambios preparados antes de confirmarlos.
  3. Comparando ramas (branches): Viste cómo comparar diferentes ramas para ver cómo se han divergido.
  4. Comparando archivos específicos: Aprendiste cómo centrar tu comparación en archivos particulares de interés.
  5. Usando herramientas de comparación externas: Exploraste cómo usar herramientas de comparación visuales para obtener una perspectiva diferente de tus cambios.

El comando git diff es una herramienta poderosa en tu conjunto de herramientas de Git. Te permite inspeccionar los cambios con precisión, ya sea que estés preparando una confirmación, revisando el trabajo de un compañero o tratando de entender la historia de tu proyecto.

Recuerda, dominar git diff requiere práctica. No te desanimes si la salida parece enigmática al principio; con el tiempo, serás capaz de leer las diferencias rápidamente y eficientemente.

A medida que continúes tu viaje con Git, sigue explorando las diversas opciones y casos de uso de git diff. Es un comando versátil que se puede combinar con muchas otras características de Git para obtener una comprensión profunda de los cambios en tu proyecto.

¡Que disfrutes comparando diferencias, y que tus cambios de código siempre sean claros e intencionados!