Comandos Esenciales de Git
El conjunto de comandos de Git de uso diario para equipos de Python: desde clonar hasta confirmar y enviar, además de los comandos de inspección que agilizan la depuración del historial.
Receta
git status -sb
git diff
git add pyproject.toml uv.lock src/
git commit -m "feat(billing): add tax line item [BILL-42]"
git push -u origin feat/bill-42-taxCuándo usar esto:
- Al comenzar a trabajar en una rama de ticket
- Al inspeccionar cambios no confirmados antes de la revisión
- Al enviar ramas de características y abrir PRs
- Para búsquedas rápidas en el historial cuando CI falla en
main
Ejemplo de Trabajo
# Clonar y configurar la identidad (una vez por máquina)
git clone git@github.com:acme/billing-api.git
cd billing-api
git config user.name "Ada Lovelace"
git config user.email "ada@acme.com"
# Bucle diario
git checkout main
git pull --rebase origin main
git checkout -b feat/bill-42-tax
# ... editar archivos Python ...
uv lock # si las dependencias cambiaron
git add pyproject.toml uv.lock src/billing/tax.py tests/test_tax.py
git commit -m "feat(billing): add tax line item [BILL-42]"
git fetch origin
git rebase origin/main
git push -u origin feat/bill-42-taxLo que esto demuestra:
status -sbcorto para resumen de rama y elementos preparados- Archivo de bloqueo confirmado con cambios de dependencias
- Rebase antes de enviar mantiene un historial lineal
- ID de ticket en el mensaje de commit para trazabilidad
Análisis Profundo
Cómo Funciona
- Árbol de trabajo - Archivos en disco;
git addprepara instantáneas en el índice. - Commits - Instantáneas inmutables referenciadas por SHA.
- Remotos -
origintípicamente GitHub/GitLab;fetchdescarga referencias sin fusionar. - Ramas - Punteros con nombre a commits;
HEADes el checkout actual.
Referencia de Comandos
| Tarea | Comando |
|---|---|
| ¿Qué cambió? | git status, git diff, git diff --staged |
| Historial | git log --oneline -20, git log -p file.py |
| Deshacer preparación | git restore --staged file.py |
| Descartar ediciones | git restore file.py |
| Guardar trabajo en progreso (WIP) | git stash push -m "wip tax" |
| Actualizar rama | git pull --rebase origin main |
Notas de Python
# Ver quién tocó por última vez una prueba fallida
git blame tests/test_tax.py
# Encontrar el commit que cambió la tasa de IVA predeterminada
git log -S "DEFAULT_VAT" --oneline -- src/Errores Comunes
git add .captura secretos -.envse cuela en los commits. Solución:.gitignore+git add -ppara repositorios sensibles.- Confirmar sin archivo de bloqueo - CI
uv sync --frozenfalla. Solución: siempreuv lockcon ediciones depyproject.toml. - Fusionar commits de
pullen características - Historial ruidoso. Solución:pull --rebaseen ramas privadas. - Forzar envío de ramas compartidas - Reescribe el historial del equipo. Solución:
--force-with-leasesolo en tufeat/*antes de la revisión. - Adición accidental enorme -
.venv/o__pycache__/. Solución: gitignore global para artefactos de Python. - Ruido de commits vacíos - Commits "WIP" antes de enviar. Solución:
git commit --amendo squash antes del PR.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| GitHub Desktop / GitKraken | Preferencia por diff visual | Flujos de trabajo de scripting y SSH de servidor |
jj (Jujutsu) | Experimentando con VCS | El estándar del equipo es la CLI de Git |
| Panel git de IDE | Preparación rápida | Aprendiendo a resolver conflictos de rebase |
gh pr create | PR desde la terminal | Necesitas tener instalada la CLI de GitHub |
Preguntas Frecuentes
¿merge vs rebase en ramas de características?
Rebase sobre main para un historial de PR limpio en ramas privadas; merge en ramas de lanzamiento compartidas según la política del equipo.
¿Cómo deshago un commit pero mantengo los cambios?
git reset --soft HEAD~1 mueve HEAD un commit hacia atrás manteniendo los archivos preparados.
¿Qué va en los mensajes de commit?
Asunto imperativo, ID de ticket, cuerpo explicando el porqué - consulta Convenciones y Guía de Estilo.
¿Debo confirmar .python-version?
Sí, cuando el equipo usa pyenv/mise - documenta el pin del intérprete junto con requires-python.
¿Cómo veo las ramas remotas?
git branch -r después de git fetch --prune elimina las ramas de seguimiento remoto obsoletas.
¿Recuperar rama eliminada?
git reflog luego git checkout -b feat/x <sha> dentro de la ventana predeterminada de 90 días.
¿Comparar contra main?
git diff origin/main...HEAD muestra el delta del PR en estilo de tres puntos.
¿Etiquetar lanzamientos desde la CLI?
git tag -a v1.2.0 -m "release 1.2.0" luego git push origin v1.2.0 cuando la etiqueta activa el despliegue.
¿Clonar con submodules?
git clone --recurse-submodules para repositorios que gestionan dependencias nativas - raro en servicios puramente de Python.
¿Commits firmados?
Configura la firma SSH o GPG cuando la política de la organización lo requiera - git log --show-signature verifica.
Relacionado
- Branching & Merging - estrategias de ramas
- Git Configuration - alias y hooks
- GitHub CLI - automatización de PR
- Environment Setup Checklist - configuración inicial de git
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.