Saltar a contenido

Concepto de ramas (branch) en Git

Antes de analizar el estado de un repositorio, es necesario entender qué es una rama (branch), un concepto fundamental en Git.

Cómo Git almacena los datos

A diferencia de otros sistemas que almacenan los cambios de forma incremental, Git guarda instantáneas completas (copias puntuales del proyecto en un momento dado). Cada confirmación o commit contiene:

  • Los archivos tal y como estaban en ese instante.
  • Metadatos (autor, fecha, mensaje).
  • Enlaces a commits anteriores (uno o varios si es una fusión).

Ejemplo inicial:

git add README test.rb LICENSE
git commit -m "Initial commit of my project"

Tras esta confirmación, Git crea:

  • Un blob por cada archivo (contenido).
  • Un objeto árbol con la estructura del directorio.
  • Un objeto commit que apunta al árbol y a su padre.

El repositorio contendrá cinco objetos: tres blobs, un árbol y un commit.

Qué es una rama

Una rama en Git es un apuntador móvil que señala una confirmación. La rama principal se llama por defecto master (aunque actualmente suele llamarse main). Cada vez que realizas un commit, la rama avanza automáticamente al nuevo estado.

Master

La rama “master” no es especial; simplemente es la creada por defecto con git init.

Crear una nueva rama

Para crear una nueva rama:

git branch testing
Esto crea un nuevo apuntador llamado testing, que apunta al mismo commit actual.

Git usa un apuntador especial llamado HEAD para saber en qué rama estás. HEAD apunta siempre a la rama activa (por ejemplo, master o testing).

Ramas

Puedes verlo con:

git log --oneline --decorate
Ejemplo de salida:
f30ab (HEAD, master, testing) add feature #32
34ac2 fixed bug #1328
98ca9 initial commit of my project

Cambiar de rama

Para saltar a otra rama, se usa:

git checkout testing
Ahora HEAD apunta a testing.

Si realizas cambios y los confirmas:

vim test.rb
git commit -a -m "made a change"
La rama testing avanzará, mientras que master permanecerá en su posición.

Volver a master:

git checkout master

Esto:

  • Mueve HEAD a master.
  • Restaura los archivos del directorio de trabajo según la última confirmación de master.

Cambios...

Cambiar de rama modifica los archivos del directorio de trabajo. Si Git no puede hacerlo limpiamente, no permitirá el cambio.

Trabajando con varias ramas

Puedes seguir trabajando en master y hacer commits:

vim test.rb
git commit -a -m "made other changes"
Ahora el historial diverge:

  • testing contiene sus cambios.
  • master tiene otros diferentes.

Visualiza el historial con:

git log --oneline --decorate --graph --all
Ejemplo:
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32
* 34ac2 fixed bug #1328
* 98ca9 initial commit of my project

Ventajas de las ramas en Git

Las ramas en Git son ligeras y rápidas, ya que solo almacenan un apuntador (un hash SHA-1 de 40 caracteres). Crear una rama cuesta apenas unos bytes, a diferencia de otros sistemas que copian todos los archivos.

Gracias a esto:

  • Crear y eliminar ramas es casi instantáneo.
  • Fusionar ramas es sencillo (Git conoce sus padres comunes).
  • Se fomenta un flujo de trabajo basado en ramas (feature branches).

Actividades

  • AC 213 (RA4 / CE4f / IC1 /1p) Crea un nuevo repositorio

    • Sobre este repositorio crea y confirma un fichero llamado nombre.txt con tu nombre
    • Confirma los cambios
    • Crea una nueva rama llamada test
    • En la rama test, modifica el fichero nombre.txt y
    • añade tus apellidos.
    • Crea un nuevo fichero llamado curso.txt y
    • añade el curso que estas.
    • Visualiza las ramas
    • Vuelve a la rama primera y crea un fichero
    • llamado modulo.txt
  • AC 214 (RA4 / CE4f / IC1 /1p) En tu repositorio local clona: https://github.com/WordPress/WordPress. Luego súbelo a tu repositorio en GitHub con una rama con tu nombre.

  • PR 215 (RA4 / CE4f / IC1 /5p) Sobre el repositorio de la AC213, realiza:

    • Fusionar todas las ramas para que todos los ficheros estén en master
    • Borra la rama test
  • PR 216 (RA4 / CE4f / IC1 /5p) Crea un repositorio en GitHub y sobre él:

    • Crea el fichero nombre.text y añade tu nombre
    • Confirma
    • Crea una nueva rama llamada test
    • Crea un nuevo fichero llamado curso.txt
    • y añade tu curso
    • Abre el fichero nombre.txt y añade tus apellidos.
    • Confirma los cambios
    • Cambia a la rama principal y abre el fichero
    • nombre.txt
    • Añade tu dirección.
    • Fusiona la rama test en la rama master
    • Resuleve los conflictos que puedan darse
  • PR 217 (RA4 / CE4f / IC1 /5p) Crea un repositorio en GitHub y sobre él:

    • Crea el fichero nombre.txt y añade tu nombre
    • Confirma
    • Crea una nueva rama llamada test
    • Crea un nuevo fichero llamado curso.txt y añade tu curso
    • Abre el fichero nombre.txt y añade tus apellidos.
    • Confirma los cambios
    • Cambia a la rama principal y añade los nuevos cambios