Git

Git

Tutorial Git: Primeros pasos con Git

Aprende los elementos esenciales de un repositorio Git: directorio de trabajo, área de preparación y repositorio local. Domina `git init`, `git clone` y más.

Aprende Git y certifícate

Estructura de un repositorio: Working directory, staging area (index) y repositorio local

En Git, es crucial entender la estructura de un repositorio para poder gestionar el código. Un repositorio local consta de tres áreas principales: el directorio de trabajo (working directory), el área de preparación (staging area o index) y el repositorio local.

El directorio de trabajo es la copia local de los archivos del proyecto en tu máquina. Aquí es donde realizas modificaciones, creas nuevos archivos o eliminas los que ya no son necesarios. Estos cambios son detectados por Git, pero aún no forman parte del historial oficial hasta que son confirmados.

La staging area, o área de preparación, es una zona intermedia que almacena temporalmente los cambios que deseas incluir en el próximo commit. Al usar git add, añades archivos o modificaciones específicos a esta área. Esto permite seleccionar de manera precisa qué cambios serán confirmados, facilitando la organización y claridad en el historial de versiones.

El repositorio local es la base de datos interna donde Git guarda todos los commits y el historial completo del proyecto. Cuando ejecutas git commit, los cambios almacenados en la staging area se registran de forma permanente en el repositorio local. Cada commit incluye un snapshot de los archivos en ese momento, junto con información sobre el autor y un mensaje descriptivo.

Esta separación en tres áreas proporciona control sobre el proceso de confirmación de cambios. Puedes verificar el estado de cada área utilizando el comando git status, que muestra qué archivos han sido modificados, cuáles están en el área de preparación y cuáles están sin seguimiento. Esto es esencial para mantener un flujo de trabajo ordenado y evitar errores al administrar versiones.

Creación de un repositorio: git init vs. clonar repositorio existente

Para comenzar a trabajar con Git en un proyecto, es esencial entender cómo crear un repositorio. Existen dos formas principales de hacerlo: iniciando un repositorio nuevo con git init o clonando un repositorio existente con git clone. La elección entre ambas depende del contexto y las necesidades del desarrollador.

Cuando utilizas git init, estás inicializando un repositorio vacío en el directorio actual. Este comando crea una carpeta oculta llamada .git que contiene toda la información necesaria para que Git pueda rastrear los cambios en tu proyecto. Por ejemplo, si estás empezando un proyecto desde cero, puedes ejecutar:

git init

Después de este comando, tu directorio de trabajo está listo para que comiences a añadir archivos, realizar commits y construir el historial del proyecto. Es importante destacar que, al usar git init, no se configura ningún repositorio remoto, por lo que si más adelante deseas sincronizar tu trabajo con un servidor como GitHub, deberás agregar manualmente la referencia remota utilizando git remote add.

Por otro lado, git clone se utiliza para copiar un repositorio existente desde una ubicación remota o local. Este comando no solo descarga todos los archivos y el historial completo, sino que también configura automáticamente la conexión con el repositorio remoto, asignando el nombre origin por defecto. Esto facilita la colaboración y el intercambio de cambios con otros desarrolladores. Por ejemplo, para clonar un repositorio alojado en GitHub, puedes ejecutar:

git clone https://github.com/usuario/nombre-repositorio.git

Este comando creará una nueva carpeta con el nombre del repositorio y descargará todo su contenido, incluyendo ramas y etiquetas. Además, al tener el remoto configurado, puedes inmediatamente utilizar git pull para actualizar y git push para enviar tus cambios.

La principal diferencia entre git init y git clone radica en que el primero prepara el directorio actual para ser un repositorio Git vacío, mientras que el segundo copia un repositorio ya existente con todo su historial. Si estás empezando un proyecto nuevo, git init es la opción adecuada. Sin embargo, si vas a contribuir a un proyecto existente o necesitas trabajar con código ya desarrollado, debes utilizar git clone para obtener una copia completa del repositorio.

Es fundamental elegir el método correcto para evitar problemas posteriores en el flujo de trabajo. Utilizar git init en un directorio que ya es parte de un repositorio puede causar conflictos y confusión. Por ello, siempre verifica si el directorio actual ya contiene un repositorio Git ejecutando:

git status

Si el comando devuelve información sobre el estado de los archivos, significa que ya estás dentro de un repositorio. En caso contrario, puedes proceder a inicializar o clonar según corresponda.

Estructura interna de un repositorio (carpeta .git)

Cuando ejecutamos git init o clonamos un repositorio, Git crea una carpeta oculta llamada .git en el directorio raíz del proyecto. Esta carpeta es esencial, ya que contiene toda la información necesaria para gestionar el historial y las operaciones del repositorio. Comprender su estructura interna ayuda a entender cómo funciona Git y a resolver posibles problemas.

Dentro de la carpeta .git, encontramos los siguientes componentes clave:

HEAD: Archivo que apunta a la referencia de la rama actual. Por defecto, suele apuntar a refs/heads/master o refs/heads/main. Este archivo indica en qué punto del historial estamos trabajando y es fundamental para las operaciones de commit y checkout.

config: Archivo de configuración específico del repositorio. Aquí se almacenan las configuraciones locales que pueden sobrescribir las globales definidas con git config --global. Por ejemplo, es posible definir un usuario y correo electrónico específicos para un repositorio concreto.

description: Utilizado principalmente por algunos servidores Git para proporcionar una descripción del repositorio. En repositorios locales no tiene un papel significativo.

hooks/: Directorio que contiene scripts de hooks o ganchos que Git ejecuta antes o después de ciertas acciones, como commits, merges o pushes. Estos scripts pueden automatizar tareas como validar código, enviar notificaciones o desplegar aplicaciones.

info/: Contiene información adicional de configuración. El archivo info/exclude permite especificar archivos o directorios que se deben excluir del seguimiento de Git, similar al .gitignore pero a nivel del repositorio.

logs/: Almacena los registros de los movimientos de las referencias del repositorio, como cambios en ramas o resets. Por ejemplo, logs/HEAD registra todas las actualizaciones de la referencia HEAD. Estos registros son útiles para operaciones de recuperación y para entender el historial de cambios.

objects/: Directorio donde Git almacena todos los objetos del repositorio, incluyendo commits, árboles (trees) y blobs (contenido de los archivos). Los objetos se organizan en subdirectorios según los primeros dos caracteres de su hash SHA-1, lo que mejora la eficiencia en el almacenamiento y acceso.

Por ejemplo:

.git/objects/
├── 17/
│   └── c5e2f6...
├── a9/
│   └── 8d1c4b...
└── pack/

refs/: Contiene las referencias a las ramas y etiquetas del repositorio. Se divide en subdirectorios como heads/ para las ramas locales, remotes/ para las ramas remotas y tags/ para las etiquetas. Estas referencias apuntan a hashes de commits específicos.

index: Archivo que representa el área de preparación o staging area. Gestiona los cambios que han sido añadidos con git add pero aún no confirmados con git commit. El índice es esencial para construir el siguiente commit de manera controlada.

packed-refs: Archivo que almacena referencias empaquetadas para optimizar el rendimiento en repositorios con gran cantidad de referencias. En lugar de mantener cada referencia como un archivo separado en refs/, Git las empaqueta en este archivo único.

Para visualizar la estructura interna de la carpeta .git, puedes utilizar el siguiente comando en la terminal:

ls -la .git

Es fundamental tener precaución al manipular los archivos dentro de .git, ya que modificar o eliminar alguno de ellos puede corromper el repositorio. Si necesitas realizar operaciones avanzadas o solucionar problemas, es preferible utilizar los comandos proporcionados por Git en lugar de editar los archivos manualmente.

La carpeta .git es el núcleo del repositorio; sin ella, Git no podría rastrear los cambios ni mantener el historial. Por eso, al copiar o mover proyectos, es importante asegurar que esta carpeta se incluya si deseas conservar el control de versiones.

Añadir y confirmar cambios (git add, git commit)

Una vez que has realizado cambios en tu proyecto, es fundamental que Git los rastree para mantener un historial coherente. El primer paso para incluir estos cambios es utilizar el comando git add, que añade los archivos modificados al área de preparación (staging area). Este comando permite especificar qué cambios serán incluidos en el próximo commit, dando control granular sobre el proceso.

Por ejemplo, para añadir un archivo específico al área de preparación:

git add nombre_del_archivo.ext

Si deseas añadir todos los cambios en el directorio actual y subdirectorios, puedes utilizar:

git add .

Es importante ser selectivo al usar git add ., ya que puede incluir archivos no deseados. Para verificar qué archivos están en el área de preparación, puedes usar:

git status

Este comando mostrará en rojo los archivos modificados que no están en el área de preparación y en verde aquellos que ya han sido añadidos.

Una vez que los cambios están en el área de preparación, se confirma su incorporación al repositorio local utilizando git commit. Este comando registra los cambios añadidos y crea una nueva entrada en el historial del repositorio. Para realizar un commit simple, se puede ejecutar:

git commit -m "Mensaje descriptivo del commit"

El mensaje de commit debe ser claro y conciso, describiendo de manera precisa lo que se ha modificado. Esto facilita la comprensión del historial y colabora en el trabajo en equipo. Por ejemplo:

git commit -m "Corrige error en la función de autenticación"

Para commits que requieren una descripción más detallada, es recomendable omitir la opción -m y permitir que Git abra el editor de texto predeterminado:

git commit

Esto te dará espacio para escribir un mensaje más elaborado, incluyendo una línea inicial breve y, a continuación, un párrafo explicativo si es necesario.

En ocasiones, es útil combinar los pasos de añadir y confirmar cambios en uno solo. Esto se puede lograr con la opción -a en git commit, que automáticamente añade todos los archivos modificados y rastreados al área de preparación antes de confirmar:

git commit -a -m "Actualiza estilos CSS y corrige typo en index.html"

Sin embargo, es importante notar que git commit -a solo añade archivos que ya están siendo rastreados por Git. Los archivos nuevos que aún no han sido añadidos alguna vez con git add no serán incluidos. Por lo tanto, para archivos nuevos, siempre es necesario usar git add al menos una vez.

Otra opción útil es git add -p, que permite añadir porciones de un archivo en lugar de todo el contenido modificado. Esto es especialmente útil cuando se quiere separar cambios en varios commits para mantener un historial más organizado. Al ejecutar:

git add -p

Git presentará cada fragmento de cambios y preguntará si deseas añadirlo al área de preparación. Puedes responder con opciones como y (sí), n (no), s (dividir en partes más pequeñas) o q (salir), ofreciendo un control más granular.

Para situaciones en las que se ha realizado un commit pero es necesario modificar el mensaje o añadir cambios olvidados, Git proporciona la opción --amend. Por ejemplo:

git commit --amend -m "Mensaje corregido del commit"

Este comando reemplazará el último commit por uno nuevo, conservando los cambios pero actualizando el mensaje o incluyendo modificaciones adicionales que hayan sido añadidas al área de preparación. Es importante usar esta opción con cuidado y solo si el commit aún no ha sido enviado a un repositorio remoto para evitar conflictos.

Visualización del historial: git log y revisión de los primeros cambios

La visualización del historial es esencial para comprender la evolución de un proyecto en Git. El comando git log permite explorar los commits realizados, mostrando detalles clave como el identificador del commit, el autor, la fecha y el mensaje asociado.

Al ejecutar:

git log

se obtiene una lista cronológica inversa de los commits, donde los más recientes aparecen primero. Esta información ayuda a rastrear los cambios y a entender cómo ha progresado el proyecto.

Para una salida más concisa, se puede utilizar la opción --oneline, que muestra cada commit en una sola línea:

git log --oneline

Esto es útil para obtener una visión general rápida del historial. Por ejemplo:

e5f1d3a Añade función de validación de datos
a8c2e9b Corrige error en cálculo de impuestos
d4b5c7f Inicializa el repositorio con archivos base

Es posible personalizar aún más la salida. La opción --graph dibuja una representación gráfica de las ramas y merges:

git log --oneline --graph

Esto facilita visualizar la estructura del repositorio y las relaciones entre commits, especialmente en proyectos con múltiples ramas.

Para filtrar el historial por autor, se utiliza:

git log --author="Nombre del Autor"

Esto muestra únicamente los commits realizados por el autor especificado. También se pueden limitar los resultados a un número determinado de commits con -n:

git log -n 5

Así, se visualizan solo los últimos cinco commits, lo que es útil para focalizarse en cambios recientes.

Si se desea ver las diferencias introducidas en cada commit, la opción -p muestra los parches aplicados:

git log -p

Este detalle permite revisar exactamente qué líneas fueron añadidas, modificadas o eliminadas en cada commit.

Para analizar los primeros cambios realizados en el repositorio, se puede invertir el orden de visualización con --reverse:

git log --reverse

De este modo, los commits se muestran desde el más antiguo hasta el más reciente, facilitando la revisión histórica desde el inicio del proyecto.

El formato de salida también se puede ajustar utilizando placeholders con la opción --pretty=format. Por ejemplo:

git log --pretty=format:"%h - %an, %ar : %s"

Esto personaliza la información mostrada, incluyendo el hash abreviado, el nombre del autor, el tiempo relativo y el mensaje del commit.

Para obtener información detallada de un commit específico, se emplea git show seguido del identificador del commit:

git show e5f1d3a

Este comando despliega todos los detalles y cambios asociados al commit seleccionado.

La revisión constante del historial con git log es una práctica recomendada. Permite entender el flujo de trabajo, identificar cuándo y por qué se hicieron cambios y facilita la colaboración entre desarrolladores. Además, conocer estas opciones avanzadas optimiza la navegación y análisis del historial de commits.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende Git online

Ejercicios de esta lección Primeros pasos con Git

Evalúa tus conocimientos de esta lección Primeros pasos con Git con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de Git

Accede a todas las lecciones de Git y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Git y certifícate

Certificados de superación de Git

Supera todos los ejercicios de programación del curso de Git y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Entender la importancia del directorio de trabajo, la staging area y el repositorio local en Git.
  • Aprender a crear y clonar repositorios utilizando git init y git clone.
  • Explorar la estructura y función interna de la carpeta .git.
  • Realizar y confirmar cambios en el repositorio, comprendiendo el flujo de git add y git commit.
  • Visualizar y analizar el historial del proyecto con git log y git show.