SkillGridAprende informática practicando

Git: deshacer, historial y ramas

El control de versiones es un punto de guardado que nunca olvida por qué existe. Te deja deshacer un cambio semanas después y responde a la pregunta con la que empieza toda caza de errores: ¿qué cambio rompió esto?

13 min · 42 XP

Cambiaste una línea. Una línea. Y ahora todo el sitio está roto: los precios están mal, los botones no hacen nada y no recuerdas cómo era esa línea antes. Este es el momento más común de la programación, y tiene una respuesta correcta. No es una memoria mejor y no es Ctrl+Z. Es el control de versiones.

La versión sencilla de deshacer es Ctrl+Z. Aguanta más o menos un minuto y luego se agota: cierras el editor, o guardas encima del archivo, o simplemente sigues adelante y el historial de deshacer desaparece. Además, en algún momento seguro que hiciste copias. Seamos honestos sobre cómo son: web-final.zip, web-final-2.zip, web-final-de-verdad.zip. Las copias no explican nada. Un sistema de control de versiones registra cada cambio junto con quién lo hizo, cuándo y qué intentaba conseguir. Semanas después todavía puedes preguntar exactamente qué decía esa línea y por qué se cambió.

Un commit es una foto de todo el proyecto, guardada junto con un mensaje corto. No es una diferencia ni la copia de un archivo: es el estado de todo en ese momento. Cada commit apunta al commit anterior, así que los commits forman una cadena: eso es lo que la gente llama el historial de un proyecto.

9f1c2ab
   |
a17d3e0
   |
64b8f21
   |
  (start)

$ git diff 64b8f21 a17d3e0
--- a/cart.js
+++ b/cart.js
-  return net;
+  return net * (1 + VAT);
mainexperimentgit switch -c experimenttry the new idea, committhe site goes on working heregit switch maintwo lines of history, one project folder

Una rama es una línea de historial aparte que arranca desde la que tienes delante. La clave es que es barata: crearla lleva un momento y no cuesta casi nada, así que puedes probar una idea sin apostar el sitio que funciona. Si la idea sale bien, fusionas la rama de vuelta a la línea principal. Si no, tiras la rama y nada de lo que funcionaba ha cambiado. En un equipo, así es como varias personas trabajan a la vez sin pisarse: cada una tiene su línea y la línea principal se queda en un estado que se puede publicar.

Un conflicto de fusión ocurre cuando dos ramas han cambiado las mismas líneas. Git se niega a adivinar y pone las dos versiones en el archivo, separadas por marcas:

<<<<<<< HEAD
price = 19.00
=======
price = 21.00
>>>>>>> experiment

Práctica

  1. Ordena el camino honesto desde «esto está roto» hasta «esto está arreglado».

    Pistas
    • No puedes deshacer lo que nunca se registró, así que todo empieza por el guardado.
    • Los usuarios reciben primero un sitio que funciona; escribir bien el arreglo y contárselo a los demás viene después.

    15 XP

  2. Empareja cada problema cotidiano con lo que de verdad lo resuelve.

    Pistas
    • Una rama solo ayuda si la línea principal sigue funcionando mientras experimentas: para eso están las dos líneas.
    • Un conflicto es información: te dice que dos personas tocaron la misma línea, y solo una persona puede decidir cuál versión es la correcta.

    13 XP

  3. Estás a punto de guardar un cambio. ¿Qué mensaje de commit le sirve de verdad a quien lea el historial dentro de tres meses?

    Pistas
    • Pregúntate qué necesita la siguiente persona para entender este cambio sin abrir el código.
    • Un mensaje útil dice qué cambió y por qué; el cómo ya lo muestra el propio código.

    14 XP