UP | HOME

Git: repositorio local

Table of Contents

En este apartado se listan y explican, brevemente, los comandos básicos de Git. Con estos comandos podrás manejar el control de versiones de tus proyectos con Git.

Antes de empezar debes tener muy claro que Git hace el seguimiento de ficheros, no de carpetas. Además, los ficheros son identificados por su ruta (aboluta o relativa) y que, siempre, en nuestros proyectos, usaremos rutas relativas.

Inicializar un repositorio de Git

Para inicializar un repositorio de Git, muévete al directorio de trabajo y ejecuta el siguiente comando:

git init

A partir de ahora Git hará un seguimiento de los cambios que se produzcan en el directorio de trabajo, que ahora es un repositorio.

Estado de un repositorio

Esta es la opción de Git MÁS IMPORTANTE, ya que te permite conocer el estado en que se encuentra el respositorio y, además, obtendrás información de las acciones que puedes realizar según el estado:

git status

Este comando te informará del estado en que se encuentran los ficheros del repositorio. Además, este comando es fundamental y muy útil porque, en función del estado te informa, además, de los comandos y opciones que puedes usar.

Estas son las posibilidades con las que te pudes encontrar:

  • El repositorio está limpio: no hay cambios.
  • Hay ficheros sin seguimiento: estos ficheros están en el directorio de trabajo pero Git no sabe nada de ellos, no están en el repositorio.
  • Hay cambios no rastreados: hay cambios en los ficheros que se indique, lo que significa que estos ficheros están en Git pero han sufrido cambios en el directorio de trabajo.
  • Cambios en el área de preparación o stage: son ficheros que has marcado para que se añadan en el siguiente commit.

Confirmar cambios (add y commit)

Sea cual sea el escenario del cambio, si los quieres confirmar en Git tienes que llevar a cabo 2 pasos:

  1. Añadir los cambios al state o área de preparación
  2. Crear un commit, que se aplicará sobre el state o área de preparación del paso anterior

Estos dos pasos se llevan a cabo con sendos comandos:

  1. git add
  2. git commit

En el git add tienes que indicar los cambios que deseas introducir en el stage o área de preparación. Por ejemplo, git add fic1.txt fic2.txt añadaría al stage los cambios en esos dos ficheros. Si quieres añadir todos los ficheros con cambios puedes usar el atajo git add . (fíjate en el último punto).

Tras añadir los cambios en el stage ya puedes llevar a cabo el segundo paso: git commit. Este comando tiene que ir acompañado de una descripción, por ejemplo: git commit -m "Nuevos ficheros añadidos al repositorio".

Ver el historial de commits

Para ver el historial de los cambios o commits que has hecho usa el comando:

git log

Este comando tiene un serie de opciones para ver más o menos información. Algunos ejemplos son:

  • git log --graph para ver el grafo con el camino de los cambios en el repositorio.
  • git log --oneline para ver los commits junto a la descripción, nada más.
  • git log --stat para ver qué ficheros fueron cambiados y cuántos cambios se han producido.
  • git log --p para ver los detalles de los cambios en los ficheros.
  • git log --all para ver el árbol completo con los commits de todas las ramas que se hayan podido crear y existan.

Puedes combinar opciones. Por ejemplo: para ver el resumen en una línea de todos los commits en forma de árbol o grafo, puedes usar esta combinación de opciones:

git log --oneline --graph --all

Otra opción que nos ofrece Git es la de ver estos logs formateados de tal manera que podamos usar dicha información para liberar una nueva versión de nuestro software:

git shortlog

Ver los cambios hechos en un repositorio

Existe un comando muy útil de Git que nos permite ver los cambios que se han hecho. Existen varios escenarios que se describen en los siguientes apartados pero, en general, la sintaxis del comando es:

git diff [--staged] [<path>] [<commit1>] [<commit2>]

Donde, si indicas la opción --staged solo verás los cambios de los ficheros que hay en el área de preparación y el repositorio, y si añades un path entonces solo verás los cambios de ese fichero con respecto al repositorio.

Por último, si añades la referencia a dos commits verás los cambios que se han producido entre dichos commits.

En los siguientes apartados se muestran los posibles escenarios en que podemos usar el comando git diff:

Ver los cambios entre el directorio de trabajo y el repositorio

Se utiliza el comando git diff sin más. Puedes especificar la ruta de un fichero a continuación para ver los cambios solo en ese fichero. Por ejemplo, si quieres ver los cambios que hay entre un hipotético fichero doc/fic1.txt entonces puedes indicar la ruta a continuación: git diff doc/fic1.txt.

Ver los cambios entre el área de preparación y el repositorio

Para ver qué cambios hay entre los ficheros que están en el área de preparación y el repositorio tienes que usar la opción --staged, tal que así: git diff --staged.

Si solo quieres ver los cambios que se han hecho entre el fichero que está en el área de preparación doc/fic1.txt y el repositorio, entonces añade al final la ruta: git diff --staged doc/fic1.txt.p

Ver las diferencias entre commits: diff

Si quieres ver las diferencias que hay entre dos commits puede usar el comando siguiente:

git diff <commit 1> <commit 2>

donde:

  • <commit 1> es el hash del commit origen, y
  • <commit 2> es el hash del commit destino.

Existen varias posibilidades y opciones. Te resumo algunas de ellas:

  • git diff <hash commit a> <hash commit b> para ver los cambios entre los commits indicados (para especificar estos commits se tienen que usar los códigos hash que verás en el git log).
  • git diff --name-only <hash commit a> <hash commit b> para ver solo los nombres de los ficheros que han sufrido cambios entre los dos commits indicados.

El siguiente apartado lo dedico por completo a explicarte cómo interpretar la salida del comando git diff.

HEAD y referencias relativas a commits

El commit sobre el que estamos trabajando tiene un puntero llamado HEAD.

Podemos usar el puntero o referencia HEAD de Git para identificar commits. En vez de usar el hash del commit podemos usar el HEAD:

  • HEAD apunta al último commit.
  • HEAD^ apunta al penúltimo commit.
  • HEAD^^ apunta a dos commits atrás.
  • HEAD^^^ apunta a tres commits atrás… vas entendiendo, ¿verdad?

Si quieres apuntar a muchos commits atrás o, si lo prefires, puedes usar esta otra alternativa:

  • HEAD~1 apunta al penúltimo commit.
  • HEAD~2 apunta a dos commits atrás.
  • HEAD~10 apunta a diez commits atrás.

Sabiendo esto, podemos comparar los últimos dos commits así:

git diff HEAD^ HEAD

O, podemos ver los cambios que se han producido en los últimos tres commits así:

git diff HEAD~3 HEAD

Descartar cambios

Otra opción útil en Git es git restore, con el que podemos descargar los cambios que hay en el directorio de trabajo con respecto al repositorio.

La sintaxis, en general, es:

git restore [--staged] [<path>]

Donde:

  • <path> es una o varias rutas a los ficheros cuyos cambios quieres descartar y es opcional (si no se indica se descartan los cambios de todos los ficheros), y
  • --staged es una opción que, si se indica, descarta los cambios de los ficheros que están en el ára de preparación.

Es un comando MUY PELIGROSO porque descarta los cambios que has hecho sin posibilidad de recuperarlos.

Ignorar ficheros: .gitignore

Podemos indicar a Git qué ficheros queremos que ignore y, por tanto, que no haga un seguimiento de ellos.

Se utiliza un fichero llamado .gitignore que se crea en la raíz del proyecto para indicar en él, a través de reglas, qué ficheros queremos ignorar. ¿Por qué? Entre otras cosas:

  • Porque contienen información sensible
  • Porque son ficheros temporales
  • Porque no son relevantes para el proyecto

En este fichero indicamos, por cada línea, qué fichero o ficheros ignorar, usando patrones. Algunos ejemplos:

  • message.log ignorará todos aquellos ficheros que se llamen message.log estén donde estén.
  • /message.log ignorará el fichero llamado message.log que está en la raíz del proyecto.
  • logs/message.log ignorará el fichero llamado message.log que está dentro de la carpeta logs.
  • logs/ ignorará todos los ficheros que haya en la carpeta logs.
  • *.log ignorará todos los ficheros que acaben con la extensión .log, estén donde estén.
  • logs/*.txt ignorará todos los ficheros que acaben con .txt dentro de la carpeta logs.

Ramas (branches)

Recuerda configurar tu rama principal con el nombre main que es el nombre que se usa como convención hoy en día para la rama principal de trabajo:

$ git config --global init.defaultBranch main

Recordada esta configuración, ya podemos hablar de ramas: las ramas son diferentes líneas de desarrollo en Git. Nos permite trabajar de forma independiente y sin colisionar en proyectos colaborativos.

También es útil usar ramas aunque trabajemos en un proyecto en solitario porque esto nos permitirá trabajar en características nuevas y hacer pruebas sin estropear la línea principal de trabajo.

Aquí te doy la lista de las opciones, lo que puedes hacer con las ramas y el comando git branch:

  • git branch para ver las ramas actuales.
  • git branch <nombre de la rama> para crear una nueva rama con el nombre indicado.
  • git branch -d <nombre de la rama> para borrar de forma segura un rama ya que no se hará si hay cambios por mezclar.
  • git branch -D <nombre de la rama> para borrar la rama, se encuentre como se encuentre (¡¡¡CUIDADO!!!).
  • git branch -m <nuevo nombre de la rama> para cambiar el nombre de la rama actual por el nuevo nombre indicado.
  • git branch -a para ver las ramas remotas (todavía no hemos entrado al trabajo remoto con Git pero podemos adelantar este comando, para que lo tengas presente).

Checkout: moverse a otra rama o commit

La opción checkout de Git la podemos usar para movernos de rama o de commit.

Moverse a otra rama

Te puedes mover de una rama a otra con el comando git checkout indicando el nombre de la nueva rama. Imagina que estás en la rama main y quieres moverte a la rama ejemplo:

git checkout ejemplo

Los cambios que no hayan sido commiteados se arrastran.

Un opción muy útil es la de crear la rama y moverse a ella. Lo que haríamos en dos comandos:

git branch ejemplo
git checkout ejemplo

El ejemplo anterior, la de crear una rama y moverte a ella, lo puedes hacer en un único comando, con la opción -b de checkout:

git checkout -b ejemplo

Moverse a otro commit

¿Para qué podemos querer hacer esto? Para ver el estado de los ficheros y del proyecto en un commit atrás en el tiempo. Para moverte:

git checkout <hash del commit al que te quieres mover>

En este punto, el puntero HEAD quedará detacheado (detached HEAD state) lo que significa que no estás en ninguna rama. Así que, cualquier cambio que hagas en esta situación quedará huérfano.

Para volver al último commit, imaginando que estás en la rama main, basta con hacer:

git checkout main

Mezclar ramas

Puedes mezclar ramas haciendo un merge o un rebase. Te resumo en los siguientes apartados cómo hacerlo.

Merge

Para mezclar un rama en otra tienes que situarte en el destino, en la rama donde se hará la mezcla. Por ejemplo, si quieres mezclar una rama llamada rama1 en la rama principal main tienes que realizar estos pasos:

  1. Cambia a la rama main si no estás ya en ella: git checkout main.
  2. Ejecuta el comando siguiente para mezclar lo que hay en rama1: git merge rama1.

Cuando mezclas con un merge Git puede hacer esta mezcla o fusión de dos maneras:

  • Mezcla por avance rápido o fast-forward si no ha habido cambios en la rama destino desde la bifurcación.

merge1.png

Figure 1: Imagen representando un commit fast-forward

  • Mezcla por tres vías en la que Git creará un commit adicional para unir el camino de las dos ramas a fusionar.

[[merge2.png]

Además, cuando mezclas dos ramas se pueden producir colisiones o conflictos si en ambas ramas se ha modificado el mismo fichero en la misma línea. Veremos, más adelante, cómo se resuelven estos conflictos ya que, si esto sucede, tendrás que terminar la fusión a mano.

Rebase

La idea es la misma que con el merge: vas a la rama donde quieres fusionar y fusionas la rama origen.

La diferencia es que el rebase crea un histórico lineal, llevando los commits del origen al final de los commits del destino. Así pues, como contrapartida, pierdes la "historia real" de lo que sucedió y cómo sucedió.

rebase2.png

Figure 2: Imagen representando un commit por tres vías

En los rebase también se pueden producir conflictos que habría que resolver a mano para terminar de fusionar las dos ramas.

Para hacer el rebase de un rama rama1 a main tienes que realizar estos pasos:

  1. Cambia a la rama main si no estás ya en ella: git checkout main.
  2. Ejecuta el comando siguiente para mezclar lo que hay en rama1: git rebase rama1.

Información de ramas fusionadas y no fusionadas

Por último, es conveniente saber si una rama ha sido o no fusionada, así como otra información que puede resultar interesante. Estos comandos te ayudarán a ello:

  • Para ver la última confirmación de cambios en cada rama: git branch -v
  • Para saber las ramas que ya han sido fusionadas: git branch --merged
  • Para saber las ramas que no han sido fusionadas todavía: git branch --no-merged

Rebase interactivo

Un rebase interactivo te permite reorganizar y editar el historial de commits de manera flexible y controlada. Por ejemplo, con un rebase interactio puedes:

  • Reordenar commits: puedes cambiar el orden en que se aplicaron los commits.
  • Aplastar commits: puedes combinar varios commits en uno solo.
  • Dividir commits: puedes dividir un commit en varios commits más pequeños.
  • Editar commits: puedes editar el mensaje de commit o incluso el contenido del commit.
  • Eliminar commits: puedes eliminar commits que ya no sean necesarios.
  • Reorganizar commits para que tengan un orden lógico y coherente.

Para dar comienzo a un commit interactivo tienes que ejecutar el comando git commit -i <commit> donde <commit> es la referencia del commit a partir del cual das comienzo al rebase interactivo. Por ejemplo:

git rebase -i HEAD~5

Das comienzo al commit interactivo a partir del commit HEAD~5 (este no se incluye).

Al iniciar un commit interactivo se abrirá el editor de textos y aparecen la referencia a todos los commits junto a un comentario con todas las opciones disponibles.

Aquí puedes ver la captura del editor de textos que muestra información de un rebase interactivo:

rebase_interactivo_800x800.png

Figure 3: Rebase interactivo

Author: Román Ginés Martínez Ferrández

Created: 2025-10-14 mar 12:05

Validate