{"id":24745936,"url":"https://github.com/bmmedina99/git-practice","last_synced_at":"2026-04-29T20:09:32.468Z","repository":{"id":195857700,"uuid":"691763920","full_name":"bmmedina99/git-practice","owner":"bmmedina99","description":"Repositorio para practicar y testear comandos de Git y Github","archived":false,"fork":false,"pushed_at":"2024-10-15T19:51:31.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"production","last_synced_at":"2025-01-28T03:34:42.932Z","etag":null,"topics":["git","github"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmmedina99.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-14T20:53:16.000Z","updated_at":"2024-10-15T19:49:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"b7c2effe-1880-4108-b197-b1e34b767121","html_url":"https://github.com/bmmedina99/git-practice","commit_stats":null,"previous_names":["bmmedina99/git-practice"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmmedina99%2Fgit-practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmmedina99%2Fgit-practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmmedina99%2Fgit-practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmmedina99%2Fgit-practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmmedina99","download_url":"https://codeload.github.com/bmmedina99/git-practice/tar.gz/refs/heads/production","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245037608,"owners_count":20550899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","github"],"created_at":"2025-01-28T03:31:14.648Z","updated_at":"2026-04-29T20:09:32.459Z","avatar_url":"https://github.com/bmmedina99.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"![Guía práctica de comandos básicos de Git](./assets/banner-git.png)\r\n\r\n\u003e **Esta guía está en contanste mejora**\u003cbr\u003e\r\n\u003e El objetivo no es solo mostrar los comandos, sino ayudar  a entender cómo y cuándo usarlos en situaciones reales de desarrollo.\r\n\r\n# ¿Qué es Git?\r\n\r\nCuando estamos creando un proyecto queremos mantenerlo seguro a los cambios y aquí es donde entra **Git** un **sistema de control de versiones distribuido**, guardando snapshots de tu código *(commits)* ayudando a comparar y revertir cambios sin perder historial.\r\n\r\n\u003e[!NOTE]\r\n\u003e **Snapshot** es el guardado de un estado de tu repositorio local en un momento específico, donde se encontrarían todos los archivos rastreados.\r\n\r\n## Objetivo de esta guía\r\n\r\nEn esta guía, conocerás y aplicarás los **comandos básicos** y esenciales para gestionar **repositorios** con Git \u0026 GitHub, siguiendo buenas prácticas y un flujo de trabajo eficiente.\r\n\r\n---\r\n\r\n### Instalación y configuración inicial\r\n\r\n#### Instalación\r\n\r\nPara poder trabajar con **Git**, primero necesitas instalarlo en tu sistema. Puedes descargarlo desde la **[página oficial de Git](https://git-scm.com/download/)**. Para probar que lo tienes instalado, prueba a ejecutar el siguiente comando:\r\n\r\n```sh\r\ngit --version\r\n```\r\n\r\n#### Configuración inicial\r\n\r\nAntes de empezar a crear commits y ramas, debemos decirle a **Git** quién esta editando. Esto es de **mucha importancia**, ya que cada commit quedará registrado con tu nombre y correo identificando tu trabajo *(y otros colaboradores sabrán a quién felicitar... o **reclamar**)*\r\n\r\n- **Tu nombre y correo:** Estos datos aparecerán en el historial de commits:\r\n\r\n```sh\r\ngit config --global user.name \"[tu_nombre]\"\r\n```\r\n```sh\r\ngit config --global user.email \"[tu_correo@ejemplo.com]\"\r\n```\r\n\u003e La flag *--global* afecta a todos los repositorios locales en tu máquina.\r\n\r\n\u003e [!TIP]\r\n\u003e Usa el mismo correo que tienes registrado en **GitHub**, así tu avatar aparecerá automáticamente en los commits.\r\n\r\n**Para ver la configuración actual:**\r\n\r\n```sh\r\ngit config --list\r\n```\r\nSi al comando anterior le agregas la flag `--global`, verás solo la configuración global:\r\n\r\n```sh\r\ngit config --global --list\r\n```\r\n\r\n**Otras configuraciones (recomendadas):** Aunque no son obligatorias, estas opciones mejoran la experiencia con **Git**:\r\n\r\n- **Cambiar el editor de texto:** Git necesita un editor de texto para mensajes de commits y merges. Configura `Visual Studio Code` como editor predeterminado:\r\n\r\n```sh\r\ngit config --global core.editor \"code --wait\"\r\n```\r\n- **Configurar la rama principal:** Por defecto, Git usa `master` como nombre de la rama principal. Puedes cambiarlo a `production` u otro nombre que prefieras:\r\n\r\n```sh\r\ngit config --global init.defaultBranch [nombre_rama]\r\n```\r\n\r\n- **Almacenar credenciales:** Si usas HTTPS para clonar repositorios, puedes configurar **Git** para que recuerde tus credenciales y no te las pida cada vez que hagas `push` o `pull`:\r\n\r\n```sh\r\ngit config --global credential.helper store\r\n```\r\n\r\n---\r\n\r\n### Empezando un proyecto con Git\r\n\r\nCuando comienzas un nuevo proyecto o te unes a uno existe, lo primero es **inicializar** el repositorio local y **enlazarlo** a un repositorio remoto.\r\n\r\n1. **Crear un repositorio local**\r\n\r\n```sh\r\ngit init\r\n```\r\n**Inicializa** el repositorio local en la carpeta actual. Esto genera un directorio oculto `.git/` donde se guardará todo el historial de tu proyecto.\r\n\r\n2. **Enlazar a un repositorio remoto**\r\n\r\n```sh\r\ngit remote add \u003cremoto\u003e \u003curl_del_repositorio\u003e\r\n```\r\nUna vez que tienes tu repo local, puedes enlazarlo a un **repositorio remoto** *(por ejemplo, en GitHub, GitLab, etc.)* para poder **subir** y **descargar** cambios.\r\n\r\n**Flags útiles:**\r\n- `git remote -v` → Muestra las URLs de los repositorios remotos enlazados *(fetch y push)*\r\n- `git remote remove \u003cremoto\u003e` → Elimina el enlace al repositorio remoto.\r\n- `git remote prune \u003cremoto\u003e` → Elimina referencias a ramas remotas que ya no existen.\r\n- `git remote show \u003cremoto\u003e` → Muestra información detallada del remoto especificado.\r\n\r\n\u003e [!NOTE]\r\n\u003e El nombre más común para el **remoto** es `origin`, pero puedes otro nombre si manejas varios remotos *(por ejemplo, `upstream` o `fork`)*\r\n\r\n3. **Clonar un proyecto existente**\r\n\r\n```sh\r\ngit clone \u003curl_del_repositorio\u003e\r\n```\r\nSi el proyecto ya existe en un repositorio remoto, en lugar de `init` usarás `clone`. Esto crea una carpeta con el código, el historial y la conexión al remoto.\r\n\r\n**Flags útiles:**\r\n- `git clone --depth \u003cn\u003e \u003curl_del_repositorio\u003e` → Clona solo los últimos **n** commits.\r\n- `git clone --branch \u003crama\u003e \u003curl_del_repositorio\u003e` → Clona una rama específica.\r\n- `git clone --single-branch \u003curl_del_repositorio\u003e` → Clona solo la rama por defecto sin otras ramas.\r\n\r\n---\r\n\r\n### Primer commit y seguimiento de archivos\r\n\r\nAntes de guardar cambios, Git necesita saber **qué archivos han cambiado** y cuáles quieres incluir en el siguiente **commit** *(guardado de cambios)*\r\n\r\n4. **Ver el estado del repositorio**\r\n\r\n```sh\r\ngit status\r\n```\r\nMuestra el estado actual del repositorio local, qué archivos están **modificados**, **agregados**, **eliminados** o **sin seguimiento** *(untracked)*.\r\n\r\n**Flags útiles:**\r\n- `git status -s` → Muestra el estado en formato compacto.\r\n  - **`M`**: Modificado | **`A`**: Agregado *(staged)* | **`D`**: Eliminado | **`??`**: Sin seguimiento *(untracked)*\r\n- `git status -b` → Muestra información de la rama actual.\r\n\r\n5. **Agregar archivos al área de preparación (staging area)**\r\n\r\n```sh\r\ngit add \u003carchivo\u003e\r\n```\r\nAgrega un archivo específico al área de preparación *(staging area)*, indicando que formará parte del próximo commit.\r\n\r\n**Flags útiles:**\r\n- `git add .` → Agrega todos los cambios, **incluyendo** archivos nuevos.\r\n- `git add -u` → Agrega solo archivos modificados y eliminados, **excluyendo** archivos nuevos.\r\n\r\n6. **Quitar archivos del área de preparación (staging area)**\r\n\r\n```sh\r\ngit restore \u003carchivo\u003e\r\n```\r\nRestaura los cambios realizados a un archivo específico en el área de preparación *(staging area)*, quitándolo de la lista de archivos que serán incluidos en el próximo commit.\r\n\r\n**Flags útiles:**\r\n- `git restore .` → Restaura todos los archivos modificados.\r\n- `git restore --staged \u003carchivo` → Agrega solo archivos modificados y eliminados, **excluyendo** archivos nuevos.\r\n\r\n7. **Guardar los cambios con un commit**\r\n\r\n```sh\r\ngit commit\r\n```\r\nGuarda los cambios del área de preparación *(staging area)* en el repositorio local con un mensaje descriptivo.\r\n\r\n\u003e [!NOTE]\r\n\u003e Como una **recomendación** echa un vistazo al estándar de **[Conventional Commits](https://www.conventionalcommits.org/es/)** para que los mensajes sean más claros.\r\n\r\n**Flags útiles:**\r\n- `git commit -m “\u003cmensaje\u003e”` → Crea un commit con el mensaje especificado directamente en la línea de comandos.\r\n- `git commit --amend` → Modifica el último commit, útil para corregir mensajes o agregar archivos olvidados.\r\n- `git commit --amend --no-edit` → Modifica el último commit sin cambiar el mensaje.\r\n\r\n8. **Ver el historial de commits**\r\n\r\n```sh\r\ngit log\r\n```\r\nMuestra el historial de commits de la rama actual.\r\n\r\n**Flags útiles:**\r\n- `git log -n \u003cnº\u003e` → Muestra solo los últimos **nº** commits.\r\n- `git log --oneline` → Muestra cada commit en una línea.\r\n- `git log --graph` → Muestra el historial en forma de gráfico.\r\n- `git log --all` → Muestra el commit de todas las ramas.\r\n- `git log --stat` → Muestra estadísticas de los archivos modificados.\r\n- `git log --author=\u003cnombre\u003e` → Muestra únicamente los commits del autor especificado.\r\n\r\n\u003e [!TIP]\r\n\u003e Puedes combinar varias flags para personalizar la salida del historial, la combinación más popular es:\r\n\u003e `git log --oneline --graph --all`\r\n\r\n---\r\n\r\n### Trabajando con ramas\r\n\r\nCuando tienes en mente una nueva idea o alguna correción, es buena práctica crear una **rama nueva** para trabajar en esos cambios sin afectar la rama principal.\r\n\r\n9. Listar y gestionar ramas\r\n\r\n```sh\r\ngit branch\r\n```\r\n**Muestra** las ramas locales existentes e indica en que rama te **encuentras** actualmente.\r\n\r\n**Flags útiles:**\r\n- `git branch \u003cnombre\u003e` → Crea una nueva rama local.\r\n- `git branch -m \u003cnombre_nuevo\u003e` → Renombra la rama actual.\r\n- `git branch -m \u003cviejo\u003e \u003cnuevo\u003e` → Renombra una rama especificada.\r\n- `git branch -d \u003cnombre\u003e` → Elimina una rama (solo si está fusionada)\r\n- `git branch -D \u003cnombre\u003e` → Fuerza la eliminación de una rama local.\r\n- `git branch -r` → Muestra solo las ramas remotas.\r\n- `git branch -v` → Muestra el último commit de cada rama.\r\n\r\n\u003e [!TIP]\r\n\u003e Usa esta flag extra `git branch --set-upstream-to=\u003cremoto\u003e/\u003crama_remota\u003e \u003crama_local\u003e`, para establecer una rama remota como seguimiento de una rama local.\r\n\r\n10.  Cambiar entre ramas *(forma moderna)*\r\n\r\n```sh\r\ngit switch \u003crama\u003e\r\n```\r\nCambia a una rama existente en tu repositorio local.\r\n\r\n**Flags útiles:**\r\n- `git switch -` → Cambia a la rama anterior en la que estabas trabajando.\r\n- `git switch -c \u003crama\u003e` → Crea y cambia a una nueva rama.\r\n\r\n11.  Comando legacy, pero multiuso\r\n\r\n```sh\r\ngit checkout\r\n```\r\nComando multiuso que antes usaba para todo, pero ahora se recomienda usar `git switch` para cambiar ramas y `git restore` para restaurar archivos.\r\n\r\n**Flags útiles:**\r\n- `git checkout \u003crama\u003e` → Cambia de rama.\r\n- `git checkout -b \u003cnombre_rama\u003e` → Crea y cambia a una nueva rama.\r\n- `git checkout -` → Cambia a la rama anterior. Equivalente a `git switch -`.\r\n- `git checkout -- \u003carchivo\u003e` → Descarta cambios en un archivo *(obsoleto, usar `git restore`)*\r\n\r\n---\r\n\r\n### Sincronizando y colaboración con repositorios remoto\r\n\r\nAquí es donde vemos el verdadero **poder de Git**, al permitirnos colaborar con otros desarrolladores y mantener nuestro código sincronizado con un **repositorio remoto**.\r\n\r\n1.  Descargar cambios sin aplicarlos\r\n\r\n```sh\r\ngit fetch\r\n```\r\nDescarga los últimos cambios del repositorio remoto por defecto *(origin)*, pero **no los aplica** automáticamente a tu rama actual. Esto te permite revisar los cambios antes de integrarlos.\r\n\r\n**Flags útiles:**\r\n- `git fetch \u003cremoto\u003e` → Descarga cambios de un remoto específico.\r\n- `git fetch \u003cremoto\u003e \u003crama\u003e` → Descarga cambios de una rama específica del remoto.\r\n- `git fetch --prune` → Elimina referencias a ramas remotas que ya no existen.\r\n- `git fetch --dry-run` → Simula el fetch sin descargar nada, mostrando qué cambios se descargarían.\r\n\r\n13.  Fusionar cambios descargados\r\n\r\n```sh\r\ngit merge \u003crama\u003e\r\n```\r\nFusiona los cambios de otra rama con tu rama actual. Usualmente se usa después de `git fetch` para integrar los cambios descargados.\r\n\r\n**Flags útiles:**\r\n- `git merge --no-ff \u003crama\u003e` → Fuerza un merge commit incluso si es posible un *fast-forward*.\r\n- `git merge --ff-only \u003crama\u003e` → Solo permite *fast-forward*, fallando si no es posible.\r\n- `git merge --abort` → Cancela la fusión en curso si hay conflictos.\r\n- `git merge --continue` → Continúa una fusión después de resolver conflictos.\r\n- `git merge --squash \u003crama\u003e` → Fusiona los cambios de la rama especificada en un solo commit sin crear un merge commit.\r\n\r\n\u003e [!NOTE]\r\n\u003e El *fast-forward* ocurre cuando la rama actual puede avanzar directamente a la punta de la otra rama sin necesidad de un commit de fusión.\r\n\r\n14. Descargar y fusionar en un solo paso\r\n\r\n```sh\r\ngit pull\r\n```\r\nDescarga los cambios del remoto y los fusiona automáticamente con tu rama actual. Es una combinación de `git fetch` seguido de `git merge`. **Úsalo cuando confíes en que no habrá conflictos**.\r\n\r\n**Flags útiles:**\r\n- `git pull \u003cremoto\u003e \u003crama\u003e` → Descarga y fusiona una rama específica de un remoto específico.\r\n- `git pull --rebase` → Usa rebase en lugar de merge para integrar los cambios.\r\n- `git pull --ff-only` → Solo permite *fast-forward*, fallando si no es posible.\r\n- `git pull --prune` → Elimina referencias a ramas remotas que ya no existen.\r\n\r\n15. Subir cambios al repositorio remoto\r\n\r\n```sh\r\ngit push\r\n```\r\nSube los commits de tu rama local al repositorio remoto asociado.\r\n\r\n**Flags útiles:**\r\n- `git push \u003cremoto\u003e \u003crama\u003e` → Sube los commits a un remoto y rama específicos.\r\n- `git push -u \u003cremoto\u003e \u003crama\u003e` → Sube los commits y establece la rama remota como seguimiento de la rama local.\r\n- `git push --force` → Fuerza el push, sobrescribiendo los cambios en el remoto *(usar con precaución)*.\r\n- `git push --force-with-lease` → Fuerza el push de forma segura, solo si no hay cambios nuevos en el remoto.\r\n- `git push --dry-run` → Simula el push sin subir nada, mostrando qué cambios se subirían.\r\n\r\n\u003e [!WARNING]\r\n\u003e El comando de `git push --force` debe usarse con extrema precaución, ya que puede sobrescribir los cambios en el repositorio remoto y causar pérdida de datos para otros colaboradores. Usalo en ramas personales que solo tú uses.\r\n\r\n---\r\n\r\n### Inspección de cambios y resolución de errores\r\n\r\nSi alguna vez te preguntas *¿qué cambio hice?* o *¿cómo deshago esto?*, estos comandos te ayudarán a inspeccionar y revertir cambios en tu repositorio.\r\n\r\n16. Ver diferencias entre cambios\r\n\r\n```sh\r\ngit diff \u003carchivo\u003e\r\n```\r\n**Muestra** los cambios del archivo especificado, entre el **estado actual** y los cambios que aún no han sido **confirmados**.\r\n\r\n**Flags útiles:**\r\n- `git diff HEAD` → Compara el estado actual con el último commit.\r\n- `git diff \u003ccommit1\u003e \u003ccommit2\u003e` → Compara dos commits específicos.\r\n- `git diff --name-only` → Muestra solo los archivos modificados.\r\n- `git diff --stat` → Resumen estadístico de los cambios.\r\n\r\n17.  Deshacer cambios en archivos\r\n\r\n```sh\r\ngit reset\r\n```\r\nQuita todos los archivos del área de preparación *(staging area)*, manteniendo los cambios locales en el directorio de trabajo.\r\n\r\n**Flags útiles:**\r\n- `git reset --soft \u003ccommit\u003e` → Mueve el HEAD al commit, matiene *staging area* y *working directory*.\r\n- `git reset --mixed \u003ccommit\u003e` → *(por defecto)* Mueve el HEAD al commit, limpia el *staging area* pero mantiene los cambios en el *working directory*.\r\n- `git reset --hard \u003ccommit\u003e` → Mueve el HEAD al commit, limpia el *staging area* y el *working directory*, perdiendo todos los cambios no confirmados.\r\n- `git reset HEAD~1` → Deshace el último commit, manteniendo los cambios en el *working directory*. *Cambia el número en el HEAD para deshacer más commits*\r\n\r\n\u003e [!CAUTION]\r\n\u003e El uso del flag **--hard** debe hacerse con extrema precaución. Ese flag **ELIMINA** cambios permanentemente y es **IRRECUPERABLE** en la mayoría de casos.\r\n\r\n18.  Revertir un commit específico\r\n\r\n```sh\r\ngit revert \u003ccommit\u003e\r\n```\r\nCrea un nuevo commit que deshace los cambios introducidos por un commit anterior específico, sin alterar el historial de commits.\r\n\r\n**Flags útiles:**\r\n- `git revert HEAD` → Reverte el último commit.\r\n- `git revert --no-commit \u003ccommit\u003e` → Prepara los cambios para revertir sin crear un commit automáticamente.\r\n- `git revert --continue \u003ccommit\u003e` → Continúa el proceso de revertir después de resolver conflictos.\r\n- `git revert --abort` → Cancela el proceso de revertir si hay conflictos.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmmedina99%2Fgit-practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmmedina99%2Fgit-practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmmedina99%2Fgit-practice/lists"}