Hoja de referencia de comandos de Git: Los comandos que realmente usas, con ejemplos
Una referencia práctica de Git agrupada por lo que estás intentando hacer, desde tu primer compromiso hasta deshacer un error. Mantenlo abierto mientras trabajas y utiliza la guía para deshacer antes de intentar algo arriesgado.
- Un cambio se mueve a través de tres áreas: directorio de trabajo, área de preparación y repositorio.
git statuses el comando más seguro que tienes, así que ejecútalo constantemente.- Utilice
git revertpara deshacer confirmaciones compartidas y mantengagit reset --hardpara el trabajo local del que esté seguro. git reflognormalmente puede rescatar confirmaciones que creías perdidas.
Nadie recuerda todos los comandos de Git y usted no es necesario. Esta hoja de trucos de comandos de Git se centra en el pequeño conjunto que cubre casi todo el trabajo diario, agrupado por el trabajo que estás intentando realizar.
Probamos los comandos locales en un repositorio de demostración desechable usando Git para Windows, y el resultado que se muestra proviene de esa ejecución, sin las advertencias de final de línea. Sus hashes de confirmación serán diferentes. Los comandos remotos necesitan un servidor, por lo que no los ejecutamos. ¿Nuevo en el control de versiones? Comience con nuestro tutorial de Git para principiantes.
Cómo piensa Git: tres áreas
La mayor parte de la confusión desaparece una vez que sabes dónde reside el cambio:
| Área | lo que contiene | Se mudó allí por |
|---|---|---|
| Directorio de trabajo | Tus archivos mientras los editas | Edición |
| Área de preparación (índice) | Cambios seleccionados para la próxima confirmación | agregar git |
| repositorio local | Tu historial de confirmaciones guardado | git comprometerse |
| repositorio remoto | La copia compartida, como en GitHub. | git empujar |
Configurar e iniciar un proyecto
| Comando | que hace |
|---|---|
git config --global nombre.usuario "Asha" |
Establece tu nombre en las confirmaciones |
git config --global usuario.correo electrónico "a@b.com" |
Establece tu correo electrónico en confirmaciones |
git config --global init.defaultBranch principal |
Nombra nuevas ramas predeterminadas main |
inicio de git |
Crea un repositorio en la carpeta actual. |
git clon <url> |
Descarga un repositorio existente |
configuración de git --lista |
Muestra tu configuración actual |
Guarda tu trabajo
| Comando | que hace |
|---|---|
estado de git |
Muestra lo que ha cambiado |
git agregar archivo.txt |
Etapas de un archivo |
git agregar. |
Organiza todos los cambios en esta carpeta |
git agregar -p |
Etapas de partes seleccionadas de un archivo |
diferencia git |
Muestra cambios sin etapas |
git diff --en etapas |
Muestra lo que se comprometerá. |
git commit -m "Mensaje" |
Guarda los cambios preparados como una confirmación. |
git commit -am "Mensaje" |
Organiza archivos rastreados y los confirma |
Así es como cambia la vista de estado breve a medida que avanza un nuevo archivo:
$ echo "hello" > app.txt
$ git status --short
?? app.txt
$ git add app.txt
$ git status --short
A app.txt
$ git commit -m "Add app file"
?? significa sin seguimiento y A significa agregado a la preparación. En el formato de dos columnas, la columna de la izquierda es el área de preparación y la columna de la derecha es su directorio de trabajo. Tenga en cuenta que git commit -am omite archivos nuevos, por lo que primero debe agregarlos explícitamente.
Sucursales
| Comando | que hace |
|---|---|
rama git |
Listas de sucursales locales |
rama git -a |
Incluye sucursales remotas |
función de cambio de git/iniciar sesión |
Se muda a una sucursal |
git switch -c función/iniciar sesión |
Crea una rama y se mueve hacia ella. |
función de combinación de git/iniciar sesión |
Fusiona esa rama con la actual. |
git rebase principal |
Reproduce tus confirmaciones además de main |
git rama -d característica/iniciar sesión |
Elimina una rama fusionada |
git rama -D función/iniciar sesión |
Forzar la eliminación de una rama no fusionada |
Aquí hay una pequeña rama de funciones de principio a fin:
$ git switch -c feature/login
$ echo "login" >> app.txt
$ git commit -am "Add login"
$ git switch main
$ git merge --no-edit feature/login
$ git log --oneline --graph
* d0450b6 Add login
* 676b684 Add app file
$ git branch -d feature/login
Deleted branch feature/login (was d0450b6).
El historial es una línea recta porque main no se había movido, por lo que Git realizó una fusión rápida. Aún verás git checkout en guías más antiguas. Funciona, pero los comandos más nuevos switch y restore dividen sus muchas tareas en otras más claras. Para elegir entre fusionar y rebase, lea Git merge vs rebase.
Trabajar con controles remotos
| Comando | que hace |
|---|---|
git remoto -v |
Enumera los controles remotos y sus URL |
git remoto agregar origen <url> |
Conecta un control remoto |
git buscar |
Descarga cambios sin fusionar |
git tirar |
Obtiene y luego se integra en su rama |
git empujar |
Sube tus confirmaciones |
git push -u función de origen/inicio de sesión |
Empuja una nueva rama y la rastrea |
git push origin --eliminar función/iniciar sesión |
Elimina una rama remota |
git push --force-con-arrendamiento |
La fuerza empuja, pero sólo si nadie más ha empujado |
fetch siempre es seguro porque nunca cambia tus archivos. Si necesita sobrescribir una rama después de una rebase, prefiera --force-with-lease a simple --force, ya que se niega a borrar las nuevas confirmaciones de un colega.
Reserva: deja el trabajo a un lado
Stash es útil cuando necesitas cambiar de tarea pero no estás listo para comprometerte:
$ echo "wip" >> app.txt
$ git stash
$ git status --short
# clean, the change is put away
$ git stash pop
$ git status --short
M app.txt
| Comando | que hace |
|---|---|
alijo de git |
Guarda los cambios y limpia su directorio de trabajo. |
git alijo -u |
Incluye archivos sin seguimiento |
lista de alijo de git |
Muestra alijos guardados |
git alijo pop |
Restaura el último alijo y lo elimina |
aplicar git stash |
Lo restaura pero lo mantiene guardado. |
Ver historial
| Comando | que hace |
|---|---|
registro de git --una línea |
Muestra una línea por confirmación |
git log --oneline --graph --all |
Dibuja todas las ramas |
git log -p archivo.txt |
Muestra los cambios de un archivo a lo largo del tiempo. |
git mostrar <hash> |
Muestra un compromiso en detalle |
git culpa archivo.txt |
Muestra quién cambió por última vez cada línea. |
git reflog |
Muestra todos los lugares donde HEAD ha estado |
git bisectar |
Búsquedas binarias de la confirmación que agregó un error |
Deshacer errores: “Quiero…”
Esta es la parte que la mayoría de la gente busca. Encuentra tu situación:
| Situación | Comando |
|---|---|
| Descartar ediciones no preparadas en un archivo | git restaurar archivo.txt |
| Eliminar un archivo pero conservar las ediciones | git restaurar --archivo preparado.txt |
| Reparar el mensaje o los archivos de la última confirmación. | git confirmar --enmendar |
| Deshacer la última confirmación y mantener los cambios preparados | git reset --soft HEAD~1 |
| Deshacer la última confirmación y mantener los cambios sin realizar | git restablecer CABEZA ~ 1 |
| Deshacer una confirmación enviada de forma segura | git revertir <hash> |
| Deseche todos los cambios locales | reinicio de git --duro |
| Eliminar archivos sin seguimiento | git clean -fd (vista previa con -n) |
| Recuperar un compromiso “perdido” | git reflog, luego git branch rescue <hash> |
Consejo: Antes de cualquier riesgo, ejecuta git branch backup. No cuesta nada y te da una etiqueta a la que regresar. git reset --hard y git clean pueden destruir permanentemente el trabajo no comprometido, que ni siquiera reflog puede recuperar.
Restablecer vs revertir vs restaurar
Estos tres nombres causan mucha confusión, pero hacen cosas bastante diferentes:
| Comando | Actúa sobre | ¿Cambia la historia? | ¿Seguro en sucursales compartidas? |
|---|---|---|---|
restaurar git |
Archivos | No | Sí, pero descarta las ediciones locales. |
git revertir |
Un compromiso, agregando su opuesto | Se suma a ello | si |
restablecer git |
El puntero de rama | Lo reescribe | No |
En nuestra demostración, cometimos una línea incorrecta y la revertimos. El archivo volvió a su contenido anterior, mientras que el error permaneció visible en el registro como historial:
$ echo "oops" >> app.txt
$ git commit -am "Bad change"
$ git revert --no-edit HEAD
$ cat app.txt
hello
login
Luego git reset --soft HEAD~1 eliminó esa última confirmación pero mantuvo sus cambios preparados, lo que git status --short mostró como M app.txt.
Etiquetas
| Comando | que hace |
|---|---|
etiqueta git |
Listas de etiquetas |
etiqueta git v1.0 |
Crea una etiqueta ligera |
etiqueta git -a v1.0 -m "Lanzamiento" |
Crea una etiqueta anotada, ideal para lanzamientos. |
origen de git push v1.0 |
Empuja una etiqueta (las etiquetas no se envían de forma predeterminada) |
Las etiquetas a menudo desencadenan canales de lanzamiento, como explica nuestra guía de CI/CD de GitHub Actions.
Un flujo de trabajo diario sencillo
git switch main
git pull
git switch -c feature/search
# edit files
git status
git add -p
git commit -m "Add search by product name"
git push -u origin feature/search
# open a pull request, get a review, then merge
Escriba mensajes de confirmación que expliquen el cambio en el imperativo, como “Reparar redireccionamiento de inicio de sesión”. Te lo agradecerás cuando leas el registro dentro de seis meses.
Errores comunes
- Confirmar secretos. Eliminar un archivo en una confirmación posterior no lo elimina del historial. Gire el secreto inmediatamente y use
.gitignore. - Reescribir el historial compartido. No restablezca ni cambie la base de confirmaciones que otros ya hayan realizado.
- Usar
git add .a ciegas. Marquegit statusprimero, para que los archivos de compilación y los registros queden fuera. - Usando simple
--force. Prefiero--force-with-lease. - Hacer grandes compromisos. Los pequeños son más fáciles de revisar, revertir y dividir.
Conclusión
Aprenda las tres áreas y una docena de comandos, y Git dejará de dar miedo. Tenga a mano la tabla de deshacer y recuerde que git status y git reflog son su red de seguridad. Para generar confianza, cree un repositorio desechable y rómpalo y repárelo deliberadamente, ya que ese es el lugar más barato para cometer errores.
Preguntas frecuentes
¿Cuáles son los comandos de Git más utilizados?
El conjunto cotidiano es git status, agregar, confirmar, enviar, extraer, cambiar, bifurcar, fusionar y registrar. Esos pocos comandos cubren la mayor parte de un día laboral típico.
¿Cómo deshago mi última confirmación en Git?
Si es local, use git reset –soft HEAD~1 para mantener los cambios preparados. Si ya lo ha activado, utilice git revert para que el historial permanezca intacto para los demás.
¿Cuál es la diferencia entre git fetch y git pull?
git fetch solo descarga datos nuevos y deja sus archivos en paz. git pull recupera y luego fusiona o modifica esos cambios en su rama actual.
¿Cuál es la diferencia entre git reset y git revert?
git reset mueve el puntero de la rama y puede reescribir el historial. git revert agrega una nueva confirmación que deshace una anterior, lo que la hace segura en ramas compartidas.
¿Puedo recuperar una rama eliminada en Git?
Generalmente sí. Encuentre su última confirmación con git reflog, luego vuelva a crear la rama con el nombre de la rama git seguido del hash, siempre que Git aún no la haya limpiado.
sigue aprendiendo
¿Necesitas ayuda con pruebas, WordPress o SEO?
Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.
Más guías sobre testing, IA y desarrollo moderno
¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.
Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas
Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…
Leer artículo →DevOpsExplicación de las variables de entorno: archivos .env, secretos y configuración bien hechos
Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…
Leer artículo →Desarrollo de softwareExplicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429
La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …
Leer artículo →Automatización de pruebasBurlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan
Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…
Leer artículo →Pruebas de softwareExplicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%
Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…
Leer artículo →Bases de datos y SQLDELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno
DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…
Leer artículo →Bases de datos y SQLVistas SQL explicadas: cree, use y evite los errores, con ejemplos
Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…
Leer artículo →Desarrollo de softwareInterfaz TypeScript versus tipo: diferencias reales, probadas con el compilador
Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…
Leer artículo →Desarrollo de softwarePython *args y **kwargs explicados: funciones flexibles con ejemplos claros
Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…
Leer artículo →Desarrollo de softwareFunciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas
Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…
Leer artículo →Inteligencia artificial¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar
¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…
Leer artículo →DevOpsMonitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos
Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…
Leer artículo →DevOpsDocker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta
Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…
Leer artículo →Automatización de pruebasTDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una
TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …
Leer artículo →Pruebas de softwarePruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales
Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…
Leer artículo →Bases de datos y SQLValores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar
Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…
Leer artículo →Bases de datos y SQLDeclaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes
CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…
Leer artículo →Desarrollo de software¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico
¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…
Leer artículo →Desarrollo de softwareExplicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos
El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…
Leer artículo →Desarrollo de softwareExplicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales
Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…
Leer artículo →Inteligencia artificial¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla
¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…
Leer artículo →DevOpsImplementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir
Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…
Leer artículo →Automatización de pruebasPruebas inestables: qué las causa y cómo solucionarlas para siempre
Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…
Leer artículo →Pruebas de softwarePruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6
Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…
Leer artículo →Pruebas de softwareCaso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno
Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…
Leer artículo →Bases de datos y SQLOptimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos
Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…
Leer artículo →Bases de datos y SQLSQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado
SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …
Leer artículo →Desarrollo de softwareTutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera
Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…
Leer artículo →Desarrollo de softwareManejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos
El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…
Leer artículo →Desarrollo de softwareClases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales
Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…
Leer artículo →Inteligencia artificial¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones
¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…
Leer artículo →DevOpsComandos de Linux para principiantes: la guía esencial de terminal con ejemplos
Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…
Leer artículo →Automatización de pruebasSelenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir
Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…
Leer artículo →Pruebas de softwarePartición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos
Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …
Leer artículo →Pruebas de softwareSeveridad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales
Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…
Leer artículo →Bases de datos y SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos
Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…
Leer artículo →Bases de datos y SQLTransacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento
Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…
Leer artículo →Desarrollo de softwareHoja de trucos de comandos de Git: los comandos que realmente usas, con ejemplos
Una hoja de referencia de comandos de Git agrupada por tarea: configuración, preparación, ramas, controles remotos, almacenamiento, historial y desh…
Leer artículo →Desarrollo de softwareExplicación de las promesas de JavaScript: luego, captura, Promise.all y errores comunes
Las promesas de JavaScript se explican con el código que ejecutamos: estados, luego y cadenas de captura, manejo de errores, Promise.all, allSettled…
Leer artículo →Desarrollo de softwareTutorial del diccionario Python: métodos, ejemplos y patrones comunes
Un tutorial de diccionario de Python con el código que ejecutamos: crear, leer y actualizar dictados, métodos clave, fusión, comprensión, patrones d…
Leer artículo →Inteligencia artificial¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico
¿Qué es RAG? Generación de recuperación aumentada explicada paso a paso: indexación, fragmentación, incrustaciones, recuperación, un pequeño ejemplo…
Leer artículo →DevOpsTutorial de Terraform para principiantes: infraestructura como código desde el primer archivo hasta los módulos
Un tutorial de Terraform para principiantes: comience sin una cuenta en la nube, aprenda init, planifique y aplique, luego variables, resultados, es…
Leer artículo →DevOpsDocker vs Kubernetes: diferencias clave, cómo funcionan juntos y cuál necesita
Docker vs Kubernetes explicó: qué hace cada uno, la misma aplicación se ejecuta con ambos, se comparan Docker Compose y Swarm, los Dockershim cambia…
Leer artículo →Automatización de pruebasTutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales
Un tutorial de pytest para principiantes con pruebas que ejecutamos en pytest 9.2: afirmaciones, accesorios, parametrización, conftest, marcadores, …
Leer artículo →Pruebas de softwareCiclo de vida de pruebas de software (STLC): 6 fases, criterios de entrada y salida, ejemplo
Se explicó el ciclo de vida de las pruebas de software: seis fases de STLC con criterios de entrada y salida, entregables, un ejemplo de función de …
Leer artículo →Desarrollo de softwareGit merge vs rebase: diferencias, ejemplos y cuándo usar cada uno
Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.
Leer artículo →Desarrollo de softwareList comprehension en Python: sintaxis, ejemplos y cuándo evitarla
List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.
Leer artículo →