Guía rápida de comandos de Git que deberías conocer
Vaya por delante que este es un post vivo, es decir, lo iré actualizando en función de las necesidades y los comandos que vaya utilizando. Tampoco pretendo poner todos y cada uno de los comandos existentes, sino más bien quiero que sea una guía con aquellos comandos más útiles y situaciones que nos podemos ir encontrando en el día a día. Te animo a que, si crees que falta alguno, lo comentes en las redes en la publicación que haga en las redes o en mi correo electrónico. En la página principal tenéis los datos de contacto.
Todos los que nos dedicamos al mundo del desarrollo, sabemos lo importante que es tener un sistema de control de versiones para ir guardando los cambios que se van haciendo conforme vas desarrollando el proyecto. No solo nos sirve para tener una trazabilidad de todos los cambios que se han ido haciendo (tanto a ti como los miembros del equipo), sino que es un seguro para poder evitar desastres y poder volver a una versión anterior si algo falla. Y, de todos los que hay (SVN Tortoise, Mercurial, etc.), sin duda alguna Git es el más popular y extendido entre el mundo del desarrollo de software.
Va a ser un post orientado a todos los niveles, ya sea para iniciados como para usuarios avanzados. Además, en cada comando haré una explicación y un ejemplo para que sea más ilustrativo.
git init
Git init es el comando que se utiliza para crear un nuevo repositorio de Git. Cuando hacemos git init
, se crea un nuevo directorio oculto llamado .git
en el directorio actual, que contiene todos los archivos necesarios para gestionar el repositorio.
git init nombre-del-repositorio
git add
git add es un comando utilizado para añadir archivos al stage
, que es la zona donde están los archivos antes de hacer un commit. Cuando hacemos git add
, estamos diciendo a Git que queremos incluir esos archivos en el próximo commit, pero sin hacer el commit. Aquí es importante indicar que no siempre suben cambios en el repositorio, ya que con git add, puedes añadir archivos (o carpetas) aunque estos no hayan sufrido cambios.
Este ejemplo añade a la rama un archivo o carpeta al stage
git add nombre-del-archivo-o-carpeta
git clone
Git clone es un comando utilizado para clonar un repositorio remoto en tu máquina local. Cuando hacemos git clone
, lo que estamos haciendo es crear una copia exacta del repositorio remoto en nuestro equipo, incluyendo todos los archivos, ramas e historial de commits. Este comando es muy útil cuando por ejemplo te incorporas a un equipo de un entorno empresarial y necesitas descargar el proyecto en tu máquina local y empezar a trabajar.
Este ejemplo clona un repositorio remoto en tu máquina local
git clone
Además, puedes especificar el nombre de la carpeta donde quieres que se guarde el proyecto (si no lo haces, se guardará con el nombre del repositorio).
git clone url-del-repositorio nombre-de-la-carpeta
También puedes clonar una rama específica del repositorio remoto (en lugar de clonar todo el repositorio).
git clone -b nombre-de-la-rama url-del-repositorio
git branch
Git branch es un comando utilizado para listar, crear o eliminar las ramas de un repositorio de Git. Este comando es realmente útil cuando trabajas en equipo, ya que permite que cada grupo de trabajo modifique el proyecto en ramas independientes sin afectar a la rama principal. Entonces, una vez se han hechos los cambios, pueden fusionar (merge) su rama con la rama principal para que se actualice con los cambios realizados. De hecho, esta es la forma óptima de trabajar en entornos empresariales, y os encontraréis con ramas de todo tipo: ramas de nuevos desarrollos (features), ramas de corrección de errores (bugfix), ramas de pruebas (testing), etc.
En este ejemplo, se listan todas las ramas del repositorio local
git branch
Si quieres ver todas las ramas del repositorio remoto, puedes usar la opción -r
(remote)
git branch -r
Si quieres ver todas las ramas, incluidas las que están en el repositorio remoto, puedes usar la opción -a
(all)
git branch -a
En este ejemplo, se crea una nueva rama llamada “feature/crud-entidades”
git branch feature/crud-entidades
Y si quieres eliminar una rama que ya no necesitas, añades la opción -d
(delete) y el nombre de la rama. Ojo, para eliminar la rama, no puedes estar en ella, tienes que estar en otra rama. En este ejemplo, se elimina la rama llamada “feature/crud-entidades”
git branch -d feature/crud-entidades
git checkout
Git checkout es un comando utilizado para cambiar de rama o restaurar archivos en un repositorio de Git. Imaginad que hemos terminado el desarrollo de la rama anterior (feature/crud-entidades) y estamos en otra rama haciendo otra cosa, y recibimos un aviso de que el departamento de testing ha encontrado un caso de uso no contemplado. Pues necesitamos ir a la rama anterior para poder desarrollar el caso de uso. Y para ello, haríamos git checkout
. Es importante tener en cuenta que, al cambiar de rama, cualquier cambio no guardado en la rama actual se perderá, por lo que siempre recomendable hacer un commit
(o un stash
) antes de cambiar de rama.
En este ejemplo cambiamos a la rama llamada “feature/crud-entidades”
git checkout feature/crud-entidades
Hay un comando que sirve para crear la rama y entrar en ella directamente, que es git checkout -b nombre-de-la-rama
. Este comando crea la rama y automáticamente pasa a ser el área de trabajo. Lo comento porqué muchos lo desconocen y, para crear una rama nueva y luego entrar en ella hacen dos comandos: git branch nombre-de-la-rama
y luego git checkout nombre-de-la-rama
. Pues con git checkout -b nombre-de-la-rama
, haces todo en un solo comando.
git status
Git status es un comando utilizado para ver el estado actual del repositorio. Cuando hacemos git status
, nos muestra información sobre:
- qué archivos han sido modificados
- qué archivos están en el stage
- qué archivos son nuevos que todavía no se han añadido al stage
La verdad que es un comando muy útil para saber qué cambios se han hecho en el repositorio y qué archivos están listos para subir en el próximo commit
.
Este ejemplo muestra el estado actual del repositorio
git status
git commit
Git commit es un comando utilizado para guardar los cambios realizados en tu repositorio local (importante, los archivos siguen en local, no están en el repositorio). Cuando hacemos git commit
, lo que estamos haciendo es decir: Ok, pues estos ficheros están bien y pueden subir, y entonces se crea un checkpoint en la rama con los ficheros; pero insisto, los ficheros aún no han subido en el repositorio, sino que están ahí guardados pero pendientes de subir (para ello usaremos el siguiente comando de la lista). Cada commit tiene un único identificador, nunca puede haber dos commits con el mismo ID. Además, el parámetro -m
permite escribir un título (que ha de ser el titular, sin entrar en detalles) para describir los cambios realizados.
Este ejemplo hace un commit con el mensaje “Añadir nombre a la entidad”
git commit -m "Añadir nombre a la entidad"
git pull
Git pull es un comando utilizado para actualizar tu repositorio local con los cambios realizados en el repositorio remoto. Cuando hacemos git pull
, lo que estamos haciendo es descargar los cambios que se ha hecho en el repositorio remoto y fusionarlos con nuestra rama actual en el repositorio local. Es importante hacer un git pull
antes de empezar a trabajar en una rama, para asegurarnos de que tenemos la versión más reciente del código y evitar conflictos al hacer un push
más adelante.
git push
Git push es un comando utilizado para subir los cambios guardados en tus commits que tienes en tu repositorio local al repositorio definitivo. Cuando hacemos git push
, todos los cambios que teníamos guardados en los commits previos en repositorio local se suben y se guardan en nuestro repositorio remoto. Atención ya que es importante indicar que para poder hacer un push, primero hay que hacer un commit (ya que si no, no hay nada que subir, lógicamente). Además, si es la primera vez que haces un push a un repositorio remoto, tendrás que especificar el nombre del repositorio remoto y la rama a la que quieres subir los cambios.
Este ejemplo hace un push a la rama main del repositorio.
git push origin main
Por cierto, el nombre origin
es el nombre por defecto que Git asigna al repositorio remoto cuando clonas un repositorio en tu máquina local. Además, main
es el nombre por defecto de la rama principal en muchos repositorios (antes era master
, pero ahora se está cambiando a main
en muchos casos).
git merge
Git merge es un comando utilizado para fusionar dos ramas en un repositorio de Git. Cuando hacemos git merge
, lo que estamos haciendo es combinar los cambios realizados en una rama con otra rama. Para ello, primero tendremos que ir a la rama de destino (donde quieres que se fusionen los cambios) mediante git checkout nombre-de-la-rama
y luego aplicar el git merge. Este comando es muy útil cuando hemos terminado de trabajar en una rama y queremos integrar los cambios realizados en la rama principal.
Es importante tener en cuenta que al hacer un merge, pueden surgir conflictos si los mismos archivos han sido modificados en las dos ramas. En ese caso, tendremos que resolver los conflictos manualmente antes de poder completar el merge.
Si por ejemplo hemos terminado nuestro desarrollo del crud de entidades y queremos integrarlo en la rama principal, tendremos que ir a la rama principal con el siguiente comando:
git checkout main
Y luego hacer el merge de la rama “feature/crud-entidades”
git merge feature/crud-entidades
Conflictos
Un conflicto ocurre cuando dos (o varias) personas han hecho cambios en la misma línea (o bloque) de código de un mismo archivo y han subido los cambios al repositorio remoto. Obviamente, el repositorio no sabe cuáles son los cambios que han de conservarse, con lo que, te avisa de que hay un conflicto y que debe ser resuelto.
Para resolver un conflicto, hay que abrir el archivo en cuestión y buscar las líneas marcadas con <<<<<<<
, =======
y >>>>>>>
Estas líneas indican las partes del código que han sido modificadas por cada persona. Entonces, hay que decidir cuáles son los cambios que se quieren conservar y eliminar estas líneas de conflicto. Una vez resuelto, se guardan los cambios en tu repositorio local con git commit
y finalmente se hace git push
para subir los cambios al repositorio remoto.
Se pueden evitar los conflictos? Naturalmente, pero para ello se necesita una buena disciplina de trabajo en equipo y que cada uno sepa qué ficheros tocar sin que “moleste” a nadie. Normalmente, si queréis ahorraros problemas de conflictos antes de subir los cambios al repositorio remoto con git push
, siempre es recomendable el siguiente orden:
git commit
(para guardar los cambios en tu repositorio local)
git commit -m "Últimos cambios entidad"
git pull
de la rama de destino (para obtener los últimos cambios del repositorio remoto)git pull origin main
- Mergear los cambios con
git merge
de la rama de destino (main) en tu rama actual (feature/crud-entidades) para asegurarte de que tienes la versión más reciente del código y evitar conflictos al hacer el push más adelante.git checkout feature/crud-entidades git merge main
En este punto, si hay conflictos, ya te saldrá la alerta y tendrás que resolverlos. Obviamente, si hay conflictos, no se debe hacer
git push
hasta que no estén resueltos. - Si todo es correcto, ya puedes hacer
git push
para subir los cambios al repositorio remoto con la garantía de que no habrá conflictos.git push origin main
git log
Git log es un comando utilizado para ver el historial de commits en un repositorio de Git. Cuando hacemos git log
, nos muestra una lista de todos los commits realizados en el repositorio, junto con información como el autor, la fecha y el mensaje del commit. Este comando es muy útil para revisar los cambios realizados en el proyecto y para encontrar un commit específico si necesitamos volver a una versión anterior del código.
Este ejemplo muestra el historial de commits en el repositorio
git log
Si quieres ver el historial de commits de una rama específica, puedes usar la opción nombre-de-la-rama
para filtrar los commits por esa rama.
git log nombre-de-la-rama
Hay varias opciones para ver el log, por ejemplo, si queremos ver un log más compacto, podemos usar la opción --oneline
, que muestra cada commit en una sola línea con su identificador y mensaje.
git log --oneline
Además, si quiers ver un log gráfico que muestre las ramas y los merges, puedes usar la opción --graph
.
git log --graph --oneline --all