Git
28 preguntas · 5 preguntas de salida · 5 retos · 3 simulacros
Fundamentos de Git
Configuración inicial de Git
¿Cómo configuras tu nombre y correo en Git, y para qué sirven?
Estados de un archivo en Git
¿Qué estados puede tener un archivo en Git?
git init y git clone
¿Cuál es la diferencia entre `git init` y `git clone`?
Git vs GitHub
¿Cuál es la diferencia entre Git y GitHub?
Qué es Git
¿Qué es Git y para qué sirve?
Las tres áreas de Git
¿Cuáles son las tres áreas de Git y cómo se mueve un cambio entre ellas?
Commits y cambios
Deshacer cambios en Git
¿Cómo deshaces cambios en Git y cómo eliges el comando correcto?
git add y git commit
¿Qué hacen `git add` y `git commit`, y por qué son dos pasos separados?
git log e historial
¿Cómo revisas el historial de commits de un repositorio?
git status y git diff
¿Para qué sirven `git status` y `git diff`, y en qué se diferencian?
El archivo .gitignore
¿Qué es `.gitignore` y para qué sirve?
Ramas
Crear y cambiar de ramas
¿Cómo creas una rama y cómo cambias a ella?
Merge vs Rebase
¿Cuál es la diferencia entre merge y rebase, y cuándo usar cada uno?
Merge (fusionar ramas)
¿Qué es un merge y cuál es la diferencia entre un fast-forward y un merge commit?
Qué es una rama
¿Qué es una rama (branch) en Git y para qué sirve?
Rebase
¿Qué hace `git rebase` y para qué se usa?
Resolver conflictos de merge
¿Por qué ocurren los conflictos y cómo los resuelves?
Trabajo remoto
Clonar vs Fork
¿Cuál es la diferencia entre clonar y hacer un fork de un repositorio?
Pull Requests
¿Qué es un Pull Request y para qué sirve?
push, pull y fetch
¿Cuál es la diferencia entre `git fetch`, `git pull` y `git push`?
Ramas de seguimiento (upstream)
¿Qué es una rama de seguimiento y para qué sirve la bandera `-u` al hacer push?
Remotos y origin
¿Qué es un remoto en Git y qué es `origin`?
Flujos y buenas prácticas
Buenos mensajes de commit
¿Qué hace que un mensaje de commit sea bueno?
git cherry-pick
¿Qué hace `git cherry-pick` y cuándo lo usarías?
Git Flow vs GitHub Flow
¿Qué es un flujo de ramas y en qué se diferencian Git Flow y GitHub Flow?
git stash
¿Qué es `git stash` y cuándo lo usarías?
reset vs revert vs checkout
¿Cuál es la diferencia entre `git reset`, `git revert` y `git checkout`?
Tags y versiones
¿Qué son los tags en Git y cuál es la diferencia entre un tag anotado y uno ligero?
Retos de código
Preguntas de comandos
¿Qué diferencia hay entre estos dos comandos?
Tienes un commit hecho localmente y ejecutas uno u otro:
# Opcion A
git reset --soft HEAD~1
# Opcion B
git reset --hard HEAD~1
Predice: en cada caso, ¿qué pasa con el commit y, sobre todo, qué pasa con tus cambios?
Ambos deshacen el último commit (mueven la rama a HEAD~1), pero difieren en qué pasa con los cambios:
git reset --soft HEAD~1: deshace el commit y conserva los cambios en el staging area. No se pierde nada; quedan listos para recommitear.git reset --hard HEAD~1: deshace el commit y borra los cambios del staging y del working directory. Se pierde ese trabajo.
reset mueve el puntero de la rama a otro commit. Lo que cambia es qué hace con el contenido: --soft lo deja en staging, --mixed (por defecto) lo deja sin stage en el working directory, y --hard lo elimina. Por eso --hard es peligroso: es la única variante que borra trabajo. Además, reset reescribe historia, así que solo debe usarse en commits locales no publicados.
¿Qué hace cada uno y en qué se diferencian?
# Opcion A
git fetch origin
# Opcion B
git pull origin main
Predice: ¿cuál de los dos modifica tu rama de trabajo actual y cuál no?
git fetch origin: descarga los cambios del remoto y actualiza las ramas remotas (origin/main), pero NO modifica tu rama local ni tu working directory.git pull origin main: hacefetchy además integra los cambios en tu rama actual (por defecto con merge), así que sí modifica tu trabajo.
fetch solo trae información y actualiza las referencias remotas: es la opción segura para revisar antes de integrar. pull es aproximadamente fetch + merge: baja e integra en un solo paso, por lo que puede provocar un merge commit o conflictos en tu rama. La diferencia clave: fetch solo mira, pull mira y aplica.
¿Cómo queda el historial con cada uno?
Estás en la rama feature, que salió de un commit antiguo de main, y mientras tanto main recibió commits nuevos. Ejecutas uno u otro:
# Opcion A
git switch feature
git rebase main
# Opcion B
git switch main
git merge feature
Predice: ¿cómo queda el historial en cada caso? ¿Alguno crea un commit extra? ¿Alguno reescribe la historia?
git rebase main(desdefeature): reaplica los commits defeatureencima demain, dejando un historial lineal sin merge commit, pero reescribiendo la historia (los commits obtienen hashes nuevos).git merge feature(desdemain): crea un merge commit con dos padres, dejando un historial ramificado que conserva la historia real y no cambia los hashes existentes.
El rebase mueve tus commits a una base nueva, por eso el historial queda recto pero los identificadores cambian; solo es seguro en ramas locales. El merge une las historias con un commit especial de dos padres, conservando lo que realmente pasó; es seguro en ramas compartidas. La regla de oro: no rebasear historia pública.
¿Qué hacen estos comandos y qué relación tienen?
Editaste estilos.css pero no has hecho git add. Ejecutas uno u otro:
# Opcion A (comando clasico)
git checkout -- estilos.css
# Opcion B (comando moderno)
git restore estilos.css
Predice: ¿qué le pasa a tus cambios en estilos.css? ¿Hacen lo mismo?
Ambos comandos hacen lo mismo: descartan los cambios sin commitear de estilos.css, devolviéndolo al estado del último commit. La diferencia es de sintaxis/claridad:
git checkout -- estilos.css: la forma clásica;checkouthacía demasiadas cosas.git restore estilos.css: la forma moderna, específica para restaurar archivos (recomendada).
Desde Git 2.23, el viejo checkout se dividió en git switch (para cambiar de rama) y git restore (para restaurar archivos), porque checkout hacía tantas cosas que confundía. En este caso ambos descartan cambios de forma irreversible, así que hay que estar seguro de no querer esos cambios.
¿Qué muestra y a qué apunta cada referencia?
# Comando 1
git log --oneline
# Comando 2
git show HEAD~2
# Comando 3
git diff HEAD~2 HEAD
Predice: ¿qué muestra git log --oneline? ¿A qué commit se refiere HEAD~2? ¿Qué compara el tercer comando?
git log --oneline: muestra el historial de commits, uno por línea, con el hash corto y el mensaje, del más nuevo al más viejo.HEAD~2: referencia relativa al commit que está dos posiciones antes del actual (HEADes el actual,HEAD~1su padre,HEAD~2dos atrás).git show HEAD~2muestra ese commit.git diff HEAD~2 HEAD: muestra todos los cambios acumulados entre el commit de hace dos posiciones y el commit actual.
Git permite referirse a los commits no solo por su hash, sino de forma relativa con ~: HEAD~1, HEAD~2, etc. (HEAD^ equivale a HEAD~1). Esto evita tener que copiar hashes largos. --oneline compacta el log para leerlo rápido, y las referencias relativas se combinan con comandos como show, diff o reset.