¿Por qué usar Git?¶
Git es un sistema de control de versiones distribuido que te permite llevar un registro detallado de los cambios en tu código. Es como tener un “historial de cambios” súper poderoso que no solo guarda qué cambió, sino también quién lo cambió, cuándo y por qué.
Esta guía te llevará desde la Instalación hasta dominar los Comandos esenciales para uso diario para uso diario, incluyendo cómo trabajar con Trabajando con repositorios remotos como GitHub. Al final entenderás perfectamente el Flujo de trabajo básico que usan los desarrolladores profesionales.
Ventajas del control de versiones¶
Historial completo: Podés ver cada cambio que hiciste en tu proyecto
Respaldo automático: Tu código está seguro, nunca más vas a perder trabajo
Experimentación segura: Probá cambios sin miedo a romper lo que funciona
Colaboración: Trabajá con otros sin pisar el código del compañero
Portabilidad: Llevá tu proyecto completo a cualquier computadora
Conceptos fundamentales¶
Antes de empezar a usar Git, es importante entender algunos conceptos clave. Estos conceptos aparecerán constantemente cuando uses los Comandos esenciales para uso diario y entender bien la diferencia entre el Working Directory (Directorio de trabajo), Staging Area (Área de preparación) y los commit es fundamental para dominar Git.
Repositorio (repo)¶
Es una carpeta de proyecto que Git está “controlando”. Contiene todos los archivos de tu proyecto más un historial completo de sus cambios.
commit¶
Es como una “foto” de tu proyecto en un momento específico. Cada commit tiene:
Los cambios realizados
Un mensaje descriptivo
Fecha y hora
Autor del cambio
Working Directory (Directorio de trabajo)¶
Es donde tenés los archivos en los que estás trabajando actualmente.
Staging Area (Área de preparación)¶
Es un espacio intermedio donde “preparás” los cambios antes de confirmarlos con un commit.
Estados de los archivos¶
Untracked: Git no conoce el archivo
Staged: El archivo está preparado para el próximo commit
Committed: El archivo está guardado en el historial
Modified: El archivo fue modificado desde el último commit
Instalación y configuración inicial¶
Instalación¶
En Linux (Ubuntu/Debian):
sudo apt update
sudo apt install gitEn Linux (CentOS/RHEL/Fedora):
sudo dnf install gitEn macOS:
# Con Homebrew
brew install git
# O usar el que viene con Xcode
xcode-select --installEn Windows:
Descargá Git desde git-scm.com
O usá Git Bash que viene incluido
Configuración inicial¶
Antes de usar Git por primera vez, configurá tu identidad. Esta información aparecerá en todos los commit que hagas:
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"Configuraciones útiles adicionales:
1 2 3 4 5 6 7 8 9# Editor por defecto (opcional) git config --global core.editor "code --wait" # VS Code git config --global core.editor "nano" # Nano (simple) # Colores en la terminal git config --global color.ui auto # Verificar configuración git config --list
Primeros pasos: tu primer repositorio¶
Crear un nuevo repositorio¶
# Crear directorio y entrar
mkdir mi-proyecto
cd mi-proyecto
# Inicializar Git
git initEsto crea una carpeta oculta .git donde Git guarda toda la información del
repositorio. Una vez inicializado, podés comenzar a usar todos los
Comandos esenciales para uso diario para gestionar tus archivos.
Tu primer commit¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14# Crear un archivo echo "# Mi Primer Proyecto" > README.md # Ver el estado git status # Agregar archivo al staging area git add README.md # Verificar el estado nuevamente git status # Hacer el commit git commit -m "Primer commit: agregar README"
Comandos esenciales para uso diario¶
git status - ¿Qué está pasando?¶
git status es tu comando de diagnóstico más importante. Te muestra el estado
actual de tu repositorio, incluyendo qué archivos fueron modificados, cuáles
están en el staging area listos para commit, y cuáles son completamente nuevos
(untracked). Es como preguntarle a Git “¿qué está pasando aquí?” y obtener un
resumen completo de la situación. Usalo constantemente para entender dónde estás
parado antes de hacer cualquier operación.
git statusEste comando te muestra:
Qué archivos cambiaron
Qué está en el staging area
Qué archivos son nuevos (untracked)
git add - Preparar cambios¶
git add es el comando que mueve archivos desde tu directorio de trabajo al
Staging Area (Área de preparación). Piensa en el staging area como un “área de preparación”
donde seleccionás exactamente qué cambios querés incluir en tu próximo
commit. Esto te permite hacer commits granulares y específicos,
incluso si modificaste múltiples archivos. Podés agregar archivos individuales,
grupos de archivos, o todos los cambios de una vez. Es fundamental para mantener
un historial limpio y organizado.
1 2 3 4 5 6 7 8 9 10 11 12# Agregar un archivo específico git add archivo.txt # Agregar varios archivos git add archivo1.txt archivo2.txt # Agregar todos los archivos modificados git add . # Agregar archivos por patrón git add *.py # todos los .py git add src/ # todo en la carpeta src
git commit - Confirmar cambios¶
git commit toma todos los archivos que están en el Staging Area (Área de preparación) y los
guarda permanentemente en el historial de tu Repositorio (repo). Cada
commit es como una “fotografía” de tu proyecto en ese momento específico, con un
mensaje descriptivo que explica qué cambios se hicieron y por qué. Es
irreversible en el sentido de que una vez hecho el commit, esos cambios quedan
grabados en la historia para siempre. Los buenos mensajes de commit son
cruciales para entender la evolución del proyecto más adelante.
1 2 3 4 5 6 7 8 9 10 11# Commit con mensaje git commit -m "Descripción del cambio" # Commit con mensaje más detallado git commit -m "Título del commit Descripción más detallada de lo que se cambió y por qué se hizo el cambio." # Agregar y hacer commit en un paso (solo archivos ya tracked) git commit -am "Mensaje del commit"
git log - Historial de cambios¶
git log te muestra el historial completo de commits en tu
Repositorio (repo). Es como un libro de registro que documenta toda la
evolución de tu proyecto, mostrando quién hizo qué cambios, cuándo y por qué.
Cada entrada incluye el hash único del commit, el autor, la fecha y el mensaje
descriptivo. Con diferentes opciones podés personalizar la vista: ver solo una
línea por commit, buscar commits específicos, ver estadísticas de archivos
modificados, o incluso filtrar por autor o fecha. Es esencial para entender cómo
llegó tu proyecto al estado actual.
1 2 3 4 5 6 7 8 9 10 11 12 13 14# Ver historial completo git log # Ver historial compacto (una línea por commit) git log --oneline # Ver últimos 5 commits git log -5 # Ver cambios en archivos git log --stat # Buscar commits por mensaje git log --grep="bugfix"
git diff - Ver diferencias¶
git diff te muestra exactamente qué cambió entre diferentes estados de tu
proyecto. Sin argumentos, compara tu Working Directory (Directorio de trabajo) actual con el
Staging Area (Área de preparación), mostrándote qué modificaciones aún no agregaste. Con
--staged compara el staging area con el último commit, y con referencias
específicas podés comparar cualquier punto en la historia. Cada diferencia se
muestra línea por línea, con colores que indican qué se agregó (verde) y qué se
eliminó (rojo). Es fundamental para revisar tus cambios antes de hacer un commit
y para entender qué modificó alguien más en el código.
1 2 3 4 5 6 7 8 9 10 11 12# Ver cambios no preparados (working directory vs staging) git diff # Ver cambios preparados (staging vs último commit) git diff --staged # Ver diferencias de un archivo específico git diff archivo.txt # Comparar con un commit anterior git diff HEAD~1 # comparar con el commit anterior git diff HEAD~3 # comparar con 3 commits atrás
Trabajando con archivos¶
Agregar archivos nuevos¶
Para que Git empiece a hacer seguimiento de un archivo nuevo, primero tenés que agregarlo explícitamente con git add - Preparar cambios. Los archivos nuevos aparecen como “untracked” en git status - ¿Qué está pasando? hasta que los agregues al staging area. Una vez agregados y confirmados con git commit - Confirmar cambios, Git comenzará a monitorear todos los cambios futuros en esos archivos.
1 2 3 4 5 6 7 8 9 10# Creamos el archivo touch nuevo-archivo.py echo 'print("Hola mundo")' > nuevo-archivo.py # Git no lo conoce todavía git status # Agregarlo al tracking git add nuevo-archivo.py git commit -m "Agregar script hola mundo"
Modificar archivos existentes¶
Cuando modificás un archivo que Git ya está trackeando, aparecerá como “modified” en git status - ¿Qué está pasando?. Git detecta automáticamente todos los cambios, pero no los incluye en commits hasta que explícitamente los agregues con git add - Preparar cambios. Esto te permite revisar los cambios con git diff - Ver diferencias antes de confirmarlos, asegurándote de que solo incluís las modificaciones que realmente querés guardar en el historial.
1 2 3 4 5 6 7 8 9# Modificar archivo echo 'print("Hola Git!")' >> nuevo-archivo.py # Ver los cambios git diff nuevo-archivo.py # Preparar y confirmar cambios git add nuevo-archivo.py git commit -m "Actualizar mensaje de saludo"
git mv - Renombrar archivos¶
git mv le dice a Git que un archivo fue renombrado o movido, preservando su
historial completo. Es superior a renombrar manualmente porque Git entiende que
es el mismo archivo con nuevo nombre, manteniendo todo el historial de cambios
asociado. Si renombrás manualmente, Git lo ve como un archivo eliminado y otro
nuevo creado, perdiendo la continuidad histórica. Siempre usá git mv para
mantener la integridad del historial de versiones.
1 2 3 4 5 6 7 8 9# Renombrar usando Git (recomendado) git mv archivo-viejo.txt archivo-nuevo.txt git commit -m "Renombrar archivo" # Si ya renombraste manualmente mv archivo-viejo.txt archivo-nuevo.txt git add archivo-nuevo.txt git rm archivo-viejo.txt git commit -m "Renombrar archivo"
git rm - Eliminar archivos¶
git rm elimina archivos tanto del sistema de archivos como del tracking de Git
en una sola operación. Es diferente a simplemente borrar el archivo manualmente,
porque también le dice a Git que deje de hacerle seguimiento. Con --cached
podés mantener el archivo físicamente pero sacarlo del control de versiones
(útil para archivos que agregaste por error al repo). Es la forma correcta de
“des-trackear” archivos sin perder el trabajo local.
1 2 3 4 5 6 7# Eliminar del sistema de archivos y de Git git rm archivo-innecesario.txt git commit -m "Eliminar archivo innecesario" # Solo eliminar de Git (mantener en el sistema) git rm --cached archivo-secreto.txt git commit -m "Dejar de trackear archivo secreto"
Deshaciendo cambios¶
git restore - Descartar cambios no confirmados¶
git restore (o git checkout -- en versiones anteriores) descarta
completamente las modificaciones no guardadas en tu Working Directory (Directorio de trabajo),
regresando los archivos al estado del último commit. Es como un “deshacer”
definitivo para cambios que no querés conservar. Una vez ejecutado, los cambios
se pierden permanentemente, así que usalo solo cuando estés seguro de que querés
eliminar las modificaciones. Es útil cuando experimentaste algo que no funcionó
y querés volver al estado conocido y estable.
1 2 3 4 5 6 7 8 9# Descartar cambios en un archivo específico git checkout -- archivo.txt # Descartar todos los cambios no confirmados git checkout -- . # Alternativa moderna (Git 2.23+) git restore archivo.txt git restore .
git restore --staged - Quitar archivos del staging area¶
git restore --staged (o git reset HEAD en versiones anteriores) mueve
archivos desde el Staging Area (Área de preparación) de vuelta al Working Directory (Directorio de trabajo) sin
perder los cambios. Es como “desagregar” archivos que agregaste con
git add - Preparar cambios pero que decidiste no incluir en el próximo commit. Los cambios
permanecen en tus archivos, solo se quitan del área de preparación. Es perfecto
para cuando agregaste demasiados archivos de una vez y querés hacer commits más
específicos y granulares.
1 2 3 4 5 6 7 8 9# Quitar archivo específico del staging git reset HEAD archivo.txt # Quitar todos los archivos del staging git reset HEAD # Alternativa moderna (Git 2.23+) git restore --staged archivo.txt git restore --staged .
git commit --amend - Modificar el último commit¶
git commit --amend te permite “editar” el último commit, ya sea cambiando su
mensaje o agregando archivos que olvidaste incluir. En realidad no modifica el
commit existente, sino que crea uno nuevo reemplazando al anterior. Es
extremadamente útil para corregir errores menores inmediatamente después de
hacer un commit, como typos en el mensaje o archivos olvidados. Sin embargo, es
peligroso si ya compartiste el commit con otros (git push - Subir cambios), porque
cambiar el historial público puede crear conflictos para otros colaboradores.
# Cambiar el mensaje del último commit
git commit --amend -m "Mensaje corregido"
# Agregar archivos olvidados al último commit
git add archivo-olvidado.txt
git commit --amend --no-editgit reset y git revert - Volver atrás en el tiempo¶
git reset --hard mueve tu Repositorio (repo) a un commit anterior,
eliminando completamente todos los commits posteriores. Es “destructivo” porque
pierdes permanentemente el trabajo realizado después de ese punto. En contraste,
git revert crea un nuevo commit que deshace los cambios de un commit
específico, preservando todo el historial. git reset reescribe la historia,
git revert la extiende. Para trabajo colaborativo siempre preferí git revert
porque no altera el historial que otros podrían tener.
1 2 3 4 5 6 7 8# Ver historial para encontrar el commit git log --oneline # Volver a un commit específico (DESTRUCTIVO) git reset --hard abc1234 # Crear un nuevo commit que deshace cambios (SEGURO) git revert abc1234
Archivo .gitignore¶
El archivo .gitignore le dice a Git qué archivos o carpetas debe ignorar
completamente, como si no existieran. Es esencial para evitar que archivos
temporales, dependencias generadas automáticamente, o información sensible
terminen en tu Repositorio (repo). Una vez que un archivo está listado
en .gitignore, Git no lo mostrará en git status - ¿Qué está pasando? ni permitirá agregarlo
accidentalmente. Es una de las primeras cosas que deberías configurar en
cualquier proyecto nuevo.
Podemos revisar GitHub/gitignore para ejemplos ajustados a diferentes tipos de proyectos.
Crear .gitignore¶
# Crear el archivo
touch .gitignorePatrones comunes¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32# Archivos del sistema .DS_Store Thumbs.db # Archivos de backup *.bak *.tmp *~ # Logs *.log logs/ # Dependencias node_modules/ venv/ __pycache__/ # Archivos de configuración local .env config.local.json # Archivos compilados *.o *.exe *.class # IDEs .vscode/ .idea/ *.swp *.swo
Sintaxis de .gitignore¶
1 2 3 4 5 6archivo.txt # ignorar archivo específico *.log # ignorar todos los .log logs/ # ignorar carpeta completa !importante.log # NO ignorar este archivo (excepción) docs/**/*.pdf # ignorar PDFs en docs y subcarpetas temp/* # ignorar contenido de temp, pero no temp/
Trabajando con repositorios remotos¶
git remote - Conectar con GitHub/GitLab¶
git remote gestiona las conexiones entre tu repositorio local y repositorios
remotos (como GitHub). Un “remoto” es simplemente un repositorio que existe en
otro lugar (servidor, nube, otra computadora) al que podés enviar y desde el
cual podés recibir cambios. Por convención, el remoto principal se llama
“origin”. Configurar remotos te permite sincronizar tu trabajo local con
servicios en la nube, colaborar con otros, y tener respaldos automáticos de tu
código.
1 2 3 4 5 6 7 8# Agregar un remoto llamado 'origin' git remote add origin https://github.com/usuario/mi-proyecto.git # Ver remotos configurados git remote -v # Cambiar URL del remoto git remote set-url origin https://github.com/usuario/nuevo-repo.git
git push - Subir cambios¶
git push envía tus commits locales al repositorio remoto, sincronizando tu
trabajo con el servidor. Es como “publicar” tus cambios para que otros los vean
o para tener una copia de respaldo en la nube. La primera vez necesitás
especificar con -u (upstream) qué rama remota debe trackear tu rama local.
Después de eso, un simple git push es suficiente. Solo podés hacer push de
commits que ya confirmaste localmente; los cambios en tu
Working Directory (Directorio de trabajo) o Staging Area (Área de preparación) no se suben hasta que hagas
git commit - Confirmar cambios.
1 2 3 4 5 6 7 8# Primera vez (establecer upstream) git push -u origin main # Siguientes veces git push # Push específico git push origin main
git pull - Bajar cambios¶
git pull descarga commits del repositorio remoto y los fusiona automáticamente
con tu trabajo local. Es la combinación de git fetch (descargar cambios) y
git merge (fusionar cambios). Usalo al comenzar a trabajar para asegurarte de
tener la versión más reciente del proyecto, especialmente en proyectos
colaborativos. Si hay conflictos entre tu trabajo local y los cambios remotos,
Git te pedirá que los resuelvas manualmente. Es esencial para mantener tu copia
local sincronizada con el trabajo de otros colaboradores.
# Bajar y fusionar cambios del remoto
git pull
# Equivale a hacer:
git fetch # descargar cambios
git merge # fusionar cambiosgit clone - Clonar un repositorio existente¶
git clone descarga una copia completa de un repositorio remoto a tu
computadora local, incluyendo todo el historial de commits, todas las ramas, y
toda la información del proyecto. Es como “fotocopiar” un proyecto completo
desde GitHub (u otro servicio) a tu máquina. Automáticamente configura el remoto
“origin” apuntando al repositorio original y establece el tracking de ramas. Es
la forma estándar de comenzar a trabajar en un proyecto existente o de obtener
el código de cualquier proyecto open source.
1 2 3 4 5 6 7 8 9 10# Clonar repositorio git clone https://github.com/usuario/proyecto.git # Clonar en carpeta específica git clone https://github.com/usuario/proyecto.git mi-carpeta # Ver información del repositorio clonado cd proyecto git remote -v git log --oneline -5
Flujo de trabajo básico¶
Flujo diario típico¶
Este es el flujo que vas a repetir docenas de veces por día cuando trabajes con Git. Primero verificás el estado con git status - ¿Qué está pasando?, hacés modificaciones a tus archivos, revisás los cambios con git diff - Ver diferencias, los preparás con git add - Preparar cambios, los confirmás con git commit - Confirmar cambios con un mensaje descriptivo, y finalmente los subís con git push - Subir cambios. Este ciclo se vuelve tan natural como respirar y es la base de todo desarrollo profesional con control de versiones.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17# 1. Ver estado actual git status # 2. Hacer cambios en archivos # ... editar código ... # 3. Ver qué cambió git diff # 4. Preparar cambios git add . # 5. Confirmar cambios git commit -m "Descripción clara del cambio" # 6. Subir al repositorio remoto git push
Flujo para nuevo proyecto¶
Este flujo te guía desde una carpeta vacía hasta un proyecto completamente
configurado con Git y conectado a un repositorio remoto. Iniciás creando el
Repositorio (repo) local con git init, configurás el
Archivo .gitignore desde el principio para evitar problemas futuros, hacés
tu Tu primer commit, conectás con el remoto usando git remote - Conectar con GitHub/GitLab, y
subís todo con git push - Subir cambios. Es el proceso estándar para comenzar cualquier
proyecto nuevo que querés versionar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18# 1. Crear proyecto local mkdir mi-proyecto cd mi-proyecto git init # 2. Crear archivos iniciales echo "# Mi Proyecto" > README.md echo "*.log" > .gitignore # 3. Primer commit git add . git commit -m "Primer commit: estructura inicial" # 4. Conectar con remoto git remote add origin https://github.com/usuario/mi-proyecto.git # 5. Subir código git push -u origin main
Comandos de información útiles¶
Estado y configuración¶
Estos comandos te dan información crucial sobre el estado actual de tu
repositorio y su configuración. git status - ¿Qué está pasando? te muestra qué está pasando
ahora, git config --list muestra toda tu configuración de Git, y
git remote - Conectar con GitHub/GitLab con git log te dan contexto sobre conexiones remotas e
historial. Son comandos “de solo lectura” que nunca modifican nada, perfectos
para orientarte cuando no estás seguro del estado actual del proyecto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Estado actual git status # Configuración actual git config --list # Información del repositorio git remote -v git log --oneline -10 # Ver archivos tracked git ls-files # Ver espacio usado du -sh .git
Exploración del historial¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Historial gráfico simple git log --graph --oneline # Historial con detalles git log --stat # Buscar en commits git log --grep="fix" git log --author="mi-nombre" # Ver cambios de un archivo git log -p archivo.txt # Ver quién modificó cada línea git blame archivo.txt
Configuraciones útiles¶
Alias para comandos frecuentes¶
1 2 3 4 5 6 7 8 9 10 11# Crear aliases útiles git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.lg "log --oneline --graph" git config --global alias.unstage "reset HEAD --" # Usar los aliases git st # equivale a git status git lg # log gráfico compacto
Configuraciones de editor¶
1 2 3 4 5 6 7 8# Configurar VS Code como editor git config --global core.editor "code --wait" # Configurar Vim git config --global core.editor "vim" # Configurar Nano (más simple) git config --global core.editor "nano"
Configuración de colores¶
# Habilitar colores
git config --global color.ui auto
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch autoErrores comunes y soluciones¶
“fatal: not a git repository”¶
# Verificar que estás en un directorio con Git
ls -la | grep .git
# Si no existe, inicializar
git init“Author identity unknown”¶
# Configurar identidad
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"Commit sin mensaje¶
# Si se abre un editor, escribir mensaje y guardar
# Para salir de Vim: presionar ESC, luego :wq
# Para evitarlo, siempre usar -m
git commit -m "Mensaje descriptivo"Archivos grandes en el historial¶
# Ver archivos más grandes en el repo
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
# Para eliminar archivos grandes del historial (avanzado)
# Considerar usar git-filter-branch o BFG Repo-CleanerProblema con line endings (Windows/Linux)¶
# Para Windows (convierte LF a CRLF al checkout)
git config --global core.autocrlf true
# Para Linux/Mac (mantiene LF)
git config --global core.autocrlf input