{"id":9385,"date":"2025-08-11T22:48:39","date_gmt":"2025-08-11T20:48:39","guid":{"rendered":"https:\/\/www.nicalia.com\/nicapedia\/guias\/desarrollo-web\/guia-de-git\/guia-de-git-comandos-comunes-de-git\/"},"modified":"2026-05-29T12:02:14","modified_gmt":"2026-05-29T10:02:14","slug":"guia-de-git-comandos-comunes-de-git","status":"publish","type":"docs","link":"https:\/\/www.nicalia.com\/nicapedia\/guias\/desarrollo-web\/guia-de-git\/guia-de-git-comandos-comunes-de-git\/","title":{"rendered":"Comandos Git m\u00e1s usados: gu\u00eda de referencia con ejemplos"},"content":{"rendered":"<h1>Gu\u00eda de referencia de comandos Git con ejemplos<\/h1>\n<p>Git es la herramienta de control de versiones m\u00e1s usada del mundo, y aunque existen clientes gr\u00e1ficos, <strong>la l\u00ednea de comandos sigue siendo el entorno m\u00e1s r\u00e1pido, flexible y universal<\/strong> para trabajar con repositorios. Conocer los comandos esenciales te permite moverte con confianza en cualquier proyecto, servidor o entorno de CI\/CD.<\/p>\n<p>Esta gu\u00eda recoge los <strong>comandos Git m\u00e1s utilizados en el d\u00eda a d\u00eda<\/strong>, con ejemplos, opciones \u00fatiles y notas sobre cu\u00e1ndo usar cada uno. Si no est\u00e1s familiarizado con t\u00e9rminos como <em>commit<\/em>, <em>rama<\/em>, <em>HEAD<\/em> o <em>staging area<\/em>, te recomendamos empezar por la <a href=\"https:\/\/www.nicalia.com\/nicapedia\/guias\/desarrollo-web\/guia-de-git\/guia-de-git-terminos-comunes-de-git\/\">gu\u00eda de t\u00e9rminos comunes de Git<\/a>.<\/p>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     TABLA DE REFERENCIA R\u00c1PIDA\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Tabla de referencia r\u00e1pida<\/h2>\n<p>Si ya conoces Git y solo necesitas recordar la sintaxis, aqu\u00ed tienes un resumen de los comandos m\u00e1s frecuentes:<\/p>\n<table>\n<thead>\n<tr>\n<th>Comando<\/th>\n<th>Descripci\u00f3n resumida<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>git clone &lt;url&gt;<\/code><\/td>\n<td>Clonar un repositorio remoto<\/td>\n<\/tr>\n<tr>\n<td><code>git init<\/code><\/td>\n<td>Inicializar un repositorio nuevo<\/td>\n<\/tr>\n<tr>\n<td><code>git status<\/code><\/td>\n<td>Ver el estado actual del \u00e1rea de trabajo<\/td>\n<\/tr>\n<tr>\n<td><code>git add .<\/code><\/td>\n<td>Preparar todos los cambios para commit<\/td>\n<\/tr>\n<tr>\n<td><code>git commit -m \"msg\"<\/code><\/td>\n<td>Crear un commit con mensaje<\/td>\n<\/tr>\n<tr>\n<td><code>git push origin main<\/code><\/td>\n<td>Subir commits al remoto<\/td>\n<\/tr>\n<tr>\n<td><code>git pull<\/code><\/td>\n<td>Descargar y fusionar cambios del remoto<\/td>\n<\/tr>\n<tr>\n<td><code>git fetch<\/code><\/td>\n<td>Descargar cambios sin fusionar<\/td>\n<\/tr>\n<tr>\n<td><code>git branch<\/code><\/td>\n<td>Listar ramas locales<\/td>\n<\/tr>\n<tr>\n<td><code>git checkout -b &lt;rama&gt;<\/code><\/td>\n<td>Crear y cambiar a una nueva rama<\/td>\n<\/tr>\n<tr>\n<td><code>git merge &lt;rama&gt;<\/code><\/td>\n<td>Fusionar otra rama en la actual<\/td>\n<\/tr>\n<tr>\n<td><code>git stash<\/code><\/td>\n<td>Guardar cambios temporales sin commit<\/td>\n<\/tr>\n<tr>\n<td><code>git log --oneline<\/code><\/td>\n<td>Historial de commits compacto<\/td>\n<\/tr>\n<tr>\n<td><code>git diff<\/code><\/td>\n<td>Ver cambios pendientes<\/td>\n<\/tr>\n<tr>\n<td><code>git revert &lt;id&gt;<\/code><\/td>\n<td>Deshacer un commit preservando historial<\/td>\n<\/tr>\n<tr>\n<td><code>git reset --hard HEAD<\/code><\/td>\n<td>Descartar todos los cambios locales<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: COMANDOS B\u00c1SICOS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Comandos b\u00e1sicos de Git<\/h2>\n<h3>1. Inicializar un repositorio<\/h3>\n<pre><code>git init<\/code><\/pre>\n<p>Crea un repositorio Git nuevo en el directorio actual. Genera la carpeta oculta <code>.git\/<\/code> donde Git almacena todo el historial.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> al empezar un proyecto nuevo desde cero, antes de conectarlo a un remoto como GitHub o GitLab.<\/li>\n<li>Para conectarlo a un remoto despu\u00e9s: <code>git remote add origin &lt;url&gt;<\/code><\/li>\n<\/ul>\n<h3>2. Clonar un repositorio<\/h3>\n<pre><code>git clone URL-del-repositorio<\/code><\/pre>\n<p>Crea una copia local completa del repositorio remoto, incluyendo todo el historial y todas las ramas.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> al incorporarte a un proyecto existente o para trabajar localmente con un repositorio de GitHub, GitLab, Bitbucket o un servidor propio.<\/li>\n<li>Si el repositorio es privado, necesitar\u00e1s <a href=\"https:\/\/www.nicalia.com\/nicapedia\/guias\/desarrollo-web\/guia-de-git\/guia-de-git-configurar-el-acceso-a-repositorios-privados\/\">configurar acceso SSH o credenciales<\/a> antes.<\/li>\n<li>Para clonar en una carpeta con nombre diferente: <code>git clone &lt;url&gt; nombre-carpeta<\/code><\/li>\n<li>Para clonar solo la rama principal sin historial completo (m\u00e1s r\u00e1pido en repos grandes): <code>git clone --depth 1 &lt;url&gt;<\/code><\/li>\n<\/ul>\n<h3>3. Ver el estado del \u00e1rea de trabajo<\/h3>\n<pre><code>git status<\/code><\/pre>\n<p>Muestra qu\u00e9 archivos han cambiado, cu\u00e1les est\u00e1n preparados para el pr\u00f3ximo commit y cu\u00e1les no est\u00e1n siendo rastreados por Git.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> antes de cualquier <code>git add<\/code> o <code>git commit<\/code> para saber exactamente en qu\u00e9 estado est\u00e1 tu \u00e1rea de trabajo. Es el comando de orientaci\u00f3n por excelencia.<\/li>\n<li>Versi\u00f3n compacta: <code>git status -s<\/code><\/li>\n<\/ul>\n<h3>4. A\u00f1adir archivos al \u00e1rea de preparaci\u00f3n (staging)<\/h3>\n<pre><code>git add archivo-o-carpeta<\/code><\/pre>\n<p>Prepara los cambios seleccionados para incluirlos en el pr\u00f3ximo commit. No guarda nada permanentemente \u2014 solo mueve los cambios al \u00e1rea de staging.<\/p>\n<ul>\n<li><code>git add .<\/code> \u2192 a\u00f1ade todos los cambios de la carpeta actual.<\/li>\n<li><code>git add -p<\/code> \u2192 modo interactivo: te permite elegir qu\u00e9 fragmentos de cada archivo a\u00f1adir (\u00fatil para commits m\u00e1s precisos).<\/li>\n<li><strong>Importante:<\/strong> si modificas el archivo despu\u00e9s de hacer <code>git add<\/code>, necesitas ejecutarlo de nuevo para incluir los \u00faltimos cambios.<\/li>\n<\/ul>\n<h3>5. Crear un commit<\/h3>\n<pre><code>git commit -m \"Mensaje descriptivo\"<\/code><\/pre>\n<p>Registra de forma permanente en el historial del repositorio los cambios que est\u00e1n en el \u00e1rea de staging.<\/p>\n<ul>\n<li><code>git commit -am \"msg\"<\/code> \u2192 hace <code>git add<\/code> de todos los archivos rastreados y crea el commit en un solo paso (no incluye archivos nuevos sin rastrear).<\/li>\n<li><code>git commit --amend<\/code> \u2192 modifica el \u00faltimo commit (mensaje o contenido). \u00dasalo solo si a\u00fan no has hecho push.<\/li>\n<li><strong>Buena pr\u00e1ctica:<\/strong> mensajes en imperativo y en el idioma del equipo: &#8220;A\u00f1adir validaci\u00f3n de formulario&#8221;, no &#8220;a\u00f1adido formulario&#8221; ni &#8220;cambios&#8221;.<\/li>\n<\/ul>\n<h3>6. Comparar cambios<\/h3>\n<pre><code>git diff<\/code><\/pre>\n<p>Muestra las diferencias entre el \u00e1rea de trabajo y el \u00e1rea de staging (cambios a\u00fan no preparados).<\/p>\n<ul>\n<li><code>git diff --staged<\/code> \u2192 muestra diferencias entre staging y el \u00faltimo commit (lo que se va a commitear).<\/li>\n<li><code>git diff rama1..rama2<\/code> \u2192 compara el contenido de dos ramas.<\/li>\n<li><code>git diff commit1..commit2<\/code> \u2192 compara dos commits espec\u00edficos usando sus IDs.<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: RAMAS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Comandos de ramas en Git<\/h2>\n<h3>7. Gestionar ramas<\/h3>\n<pre><code>git branch\ngit branch nueva-rama\ngit branch -d rama-a-borrar<\/code><\/pre>\n<ul>\n<li>Sin argumentos: lista las ramas locales. La rama activa aparece marcada con <code>*<\/code>.<\/li>\n<li><code>git branch -a<\/code> \u2192 muestra tambi\u00e9n las ramas remotas.<\/li>\n<li><code>git branch -m nombre-nuevo<\/code> \u2192 renombra la rama actual.<\/li>\n<li><code>git branch -d<\/code> \u2192 elimina una rama solo si ya est\u00e1 fusionada. Usa <code>-D<\/code> para forzar el borrado.<\/li>\n<\/ul>\n<h3>8. Cambiar de rama (checkout \/ switch)<\/h3>\n<pre><code>git checkout nombre-de-rama\ngit checkout -b nueva-rama<\/code><\/pre>\n<p>Cambia la rama activa. Con <code>-b<\/code> crea la rama y cambia a ella en un solo paso.<\/p>\n<ul>\n<li>En versiones de Git \u2265 2.23 existe el comando m\u00e1s expl\u00edcito: <code>git switch nombre-de-rama<\/code> (para cambiar) y <code>git switch -c nueva-rama<\/code> (para crear y cambiar).<\/li>\n<li><code>git checkout -- archivo<\/code> \u2192 restaura un archivo concreto al estado del \u00faltimo commit, descartando los cambios locales.<\/li>\n<li><strong>Precauci\u00f3n:<\/strong> si tienes cambios sin commitear al cambiar de rama, Git puede pedirte que los guardes con <code>git stash<\/code> primero.<\/li>\n<\/ul>\n<h3>9. Fusionar ramas<\/h3>\n<pre><code>git merge rama-a-fusionar<\/code><\/pre>\n<p>Combina el historial de la rama indicada con la rama activa actualmente.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> cuando el trabajo de una rama de feature est\u00e1 terminado y quieres incorporarlo a <code>main<\/code> o <code>develop<\/code>.<\/li>\n<li>Si hay conflictos, Git marca los archivos afectados. Debes resolverlos manualmente, hacer <code>git add<\/code> de los archivos resueltos y luego <code>git commit<\/code>.<\/li>\n<li><code>git merge --no-ff rama<\/code> \u2192 crea siempre un commit de merge, aunque no sea necesario (\u00fatil para mantener el historial expl\u00edcito).<\/li>\n<li><code>git merge --abort<\/code> \u2192 cancela el merge en curso si hay conflictos que no quieres resolver ahora.<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: REMOTO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Comandos de sincronizaci\u00f3n con el remoto<\/h2>\n<h3>10. Descargar cambios sin fusionar<\/h3>\n<pre><code>git fetch<\/code><\/pre>\n<p>Descarga las actualizaciones del repositorio remoto (nuevas ramas, nuevos commits) pero <strong>no modifica tu \u00e1rea de trabajo ni tu rama activa<\/strong>. Es la forma segura de ver qu\u00e9 hay en el remoto antes de integrar.<\/p>\n<ul>\n<li><code>git fetch origin<\/code> \u2192 descarga del remoto llamado <code>origin<\/code>.<\/li>\n<li><code>git fetch --all<\/code> \u2192 descarga de todos los remotos configurados.<\/li>\n<\/ul>\n<h3>11. Descargar y fusionar cambios<\/h3>\n<pre><code>git pull<\/code><\/pre>\n<p>Equivale a <code>git fetch<\/code> + <code>git merge<\/code>. Trae los cambios del remoto y los integra directamente en la rama activa.<\/p>\n<ul>\n<li><code>git pull --rebase<\/code> \u2192 en lugar de crear un commit de merge, reaplica tus commits locales encima de los remotos. Produce un historial m\u00e1s lineal y limpio.<\/li>\n<li><strong>Error habitual:<\/strong> si tienes commits locales que divergen del remoto, <code>git pull<\/code> puede crear un merge commit no deseado. Usa <code>--rebase<\/code> para evitarlo.<\/li>\n<\/ul>\n<h3>12. Enviar cambios al remoto<\/h3>\n<pre><code>git push origin rama<\/code><\/pre>\n<p>Sube tus commits locales a la rama indicada del repositorio remoto.<\/p>\n<ul>\n<li><code>git push -u origin rama<\/code> \u2192 vincula la rama local a la remota para que futuros <code>git push<\/code> y <code>git pull<\/code> no necesiten especificar el remoto y la rama.<\/li>\n<li><code>git push --force-with-lease<\/code> \u2192 fuerza el push de forma m\u00e1s segura que <code>--force<\/code>: falla si alguien m\u00e1s subi\u00f3 cambios al remoto desde tu \u00faltimo fetch.<\/li>\n<li><strong>Precauci\u00f3n con <code>--force<\/code>:<\/strong> reescribe el historial remoto. Nunca lo uses en ramas compartidas como <code>main<\/code>.<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: HISTORIAL Y DIAGN\u00d3STICO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Historial, diagn\u00f3stico y b\u00fasqueda<\/h2>\n<h3>13. Revisar el historial de commits<\/h3>\n<pre><code>git log<\/code><\/pre>\n<p>Lista los commits de la rama activa con autor, fecha y mensaje completo.<\/p>\n<ul>\n<li><code>git log --oneline<\/code> \u2192 formato compacto, un commit por l\u00ednea. El m\u00e1s usado en el d\u00eda a d\u00eda.<\/li>\n<li><code>git log --oneline --graph --all<\/code> \u2192 visualiza el \u00e1rbol de ramas en el terminal.<\/li>\n<li><code>git log --after=\"2025-01-01\" --before=\"2025-03-31\"<\/code> \u2192 filtra por rango de fechas.<\/li>\n<li><code>git log --grep=\"texto\"<\/code> \u2192 busca commits cuyo mensaje contenga el texto.<\/li>\n<li><code>git log -- archivo<\/code> \u2192 muestra solo los commits que tocaron un archivo espec\u00edfico.<\/li>\n<\/ul>\n<h3>14. Ver qui\u00e9n cambi\u00f3 cada l\u00ednea (blame)<\/h3>\n<pre><code>git blame archivo<\/code><\/pre>\n<p>Muestra el archivo l\u00ednea por l\u00ednea con el autor, la fecha y el ID del commit que introdujo cada cambio.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> para entender por qu\u00e9 se escribi\u00f3 cierta l\u00ednea de c\u00f3digo o qui\u00e9n introdujo un bug.<\/li>\n<li><code>git blame -L 20,40 archivo<\/code> \u2192 limita la salida a las l\u00edneas 20-40.<\/li>\n<\/ul>\n<h3>15. Buscar dentro del c\u00f3digo<\/h3>\n<pre><code>git grep \"texto\"<\/code><\/pre>\n<p>Busca cadenas o patrones en los archivos rastreados por Git. Es m\u00e1s r\u00e1pido que <code>grep<\/code> normal porque solo busca en archivos del repositorio, ignorando <code>node_modules<\/code>, <code>.git\/<\/code>, etc.<\/p>\n<ul>\n<li><code>git grep -i \"texto\"<\/code> \u2192 b\u00fasqueda sin distinguir may\u00fasculas\/min\u00fasculas.<\/li>\n<li><code>git grep \"texto\" -- \"*.php\"<\/code> \u2192 busca solo en archivos PHP.<\/li>\n<\/ul>\n<h3>16. Resumen de commits por autor<\/h3>\n<pre><code>git shortlog<\/code><\/pre>\n<p>Agrupa los commits por autor con un recuento. Muy \u00fatil para generar changelogs o ver la distribuci\u00f3n de trabajo en el equipo.<\/p>\n<ul>\n<li><code>git shortlog -sn<\/code> \u2192 muestra solo el n\u00famero de commits por autor, ordenados de mayor a menor.<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: DESHACER Y RECUPERAR\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Deshacer cambios y recuperar versiones<\/h2>\n<h3>17. Revertir un commit (seguro)<\/h3>\n<pre><code>git revert commitID<\/code><\/pre>\n<p>Crea un <strong>nuevo commit<\/strong> que deshace los cambios del commit indicado, sin borrar ni modificar el historial existente. Es la forma segura de revertir en ramas compartidas.<\/p>\n<ul>\n<li><strong>Cu\u00e1ndo usarlo:<\/strong> cuando necesitas deshacer algo que ya est\u00e1 en el remoto y otros compa\u00f1eros pueden haber descargado.<\/li>\n<li><code>git revert --no-commit commitID<\/code> \u2192 aplica la reversi\u00f3n sin crear el commit inmediatamente, para que puedas revisarla antes.<\/li>\n<\/ul>\n<h3>18. Resetear al estado de un commit anterior<\/h3>\n<pre><code>git reset --hard HEAD\ngit reset --hard commitID<\/code><\/pre>\n<p>Mueve la rama activa a un commit anterior y <strong>descarta permanentemente<\/strong> todos los cambios posteriores.<\/p>\n<ul>\n<li><code>git reset --soft commitID<\/code> \u2192 mueve el puntero de la rama al commit indicado pero mantiene los cambios en el \u00e1rea de staging (\u00fatil para &#8220;descomprimir&#8221; varios commits en uno).<\/li>\n<li><code>git reset --mixed commitID<\/code> \u2192 mueve el puntero y saca los cambios del staging, pero los mantiene en el \u00e1rea de trabajo.<\/li>\n<li><strong>Precauci\u00f3n:<\/strong> <code>--hard<\/code> es irreversible para los cambios no commiteados. Nunca lo uses en ramas que otros compa\u00f1eros hayan descargado.<\/li>\n<\/ul>\n<h3>19. Guardar cambios temporales (stash)<\/h3>\n<pre><code>git stash save \"mensaje\"\ngit stash list\ngit stash apply\ngit stash pop<\/code><\/pre>\n<p>Guarda los cambios sin commitear en una pila temporal para que puedas cambiar de rama o contexto sin perderlos.<\/p>\n<ul>\n<li><code>git stash<\/code> \u2192 guarda con un mensaje autom\u00e1tico.<\/li>\n<li><code>git stash pop<\/code> \u2192 aplica el \u00faltimo stash guardado <em>y lo elimina<\/em> de la pila.<\/li>\n<li><code>git stash apply stash@{2}<\/code> \u2192 aplica un stash espec\u00edfico sin eliminarlo de la pila.<\/li>\n<li><code>git stash drop stash@{0}<\/code> \u2192 elimina un stash espec\u00edfico sin aplicarlo.<\/li>\n<li><code>git stash -u<\/code> \u2192 incluye tambi\u00e9n archivos no rastreados (nuevos sin <code>git add<\/code>).<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: MANTENIMIENTO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Mantenimiento y configuraci\u00f3n<\/h2>\n<h3>20. Eliminar archivos del seguimiento de Git<\/h3>\n<pre><code>git rm archivo<\/code><\/pre>\n<p>Elimina el archivo tanto del \u00e1rea de trabajo como del \u00edndice de Git. El cambio quedar\u00e1 preparado para el siguiente commit.<\/p>\n<ul>\n<li><code>git rm -r carpeta\/<\/code> \u2192 elimina una carpeta y su contenido recursivamente.<\/li>\n<li><code>git rm --cached archivo<\/code> \u2192 deja de rastrear el archivo en Git pero lo mantiene en disco. \u00datil para a\u00f1adirlo al <code>.gitignore<\/code> a posteriori.<\/li>\n<\/ul>\n<h3>21. Limpiar archivos no rastreados<\/h3>\n<pre><code>git clean -n\ngit clean -fd<\/code><\/pre>\n<ul>\n<li><code>-n<\/code> (o <code>--dry-run<\/code>) \u2192 solo lista lo que se eliminar\u00eda, sin borrar nada. \u00dasalo siempre primero.<\/li>\n<li><code>-f<\/code> \u2192 fuerza la limpieza (obligatorio para que <code>git clean<\/code> borre algo).<\/li>\n<li><code>-d<\/code> \u2192 incluye tambi\u00e9n carpetas no rastreadas.<\/li>\n<li><code>-x<\/code> \u2192 incluye archivos ignorados por <code>.gitignore<\/code> (\u00fatil para limpiar builds o caches).<\/li>\n<\/ul>\n<h3>22. Configurar Git<\/h3>\n<pre><code>git config --global user.name \"Tu Nombre\"\ngit config --global user.email \"tu@email.com\"<\/code><\/pre>\n<p>Establece la identidad que aparecer\u00e1 en todos tus commits. La opci\u00f3n <code>--global<\/code> aplica a todos los repositorios del sistema; sin ella, la configuraci\u00f3n es solo para el repositorio actual.<\/p>\n<ul>\n<li><code>git config --list<\/code> \u2192 muestra todas las configuraciones activas.<\/li>\n<li><code>git config --global core.editor \"code --wait\"<\/code> \u2192 establece VS Code como editor por defecto para mensajes de commit y resoluci\u00f3n de conflictos.<\/li>\n<li><code>git config --global init.defaultBranch main<\/code> \u2192 establece <code>main<\/code> como nombre de rama inicial en todos los repos nuevos.<\/li>\n<\/ul>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: FLUJO DE TRABAJO T\u00cdPICO \u2014 NUEVO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Flujo de trabajo Git t\u00edpico paso a paso<\/h2>\n<p>Los comandos anteriores cobran sentido dentro de un flujo de trabajo real. Este es el ciclo habitual al trabajar en una feature o correcci\u00f3n:<\/p>\n<ol>\n<li><strong>Actualizar la rama principal antes de empezar:<\/strong>\n<pre><code>git checkout main\ngit pull<\/code><\/pre>\n<\/li>\n<li><strong>Crear una rama de trabajo:<\/strong>\n<pre><code>git checkout -b feature\/nombre-de-la-feature<\/code><\/pre>\n<\/li>\n<li><strong>Desarrollar y hacer commits regularmente:<\/strong>\n<pre><code>git status\ngit add .\ngit commit -m \"Descripci\u00f3n clara del cambio\"<\/code><\/pre>\n<\/li>\n<li><strong>Subir la rama al remoto:<\/strong>\n<pre><code>git push -u origin feature\/nombre-de-la-feature<\/code><\/pre>\n<\/li>\n<li><strong>Abrir una Pull Request \/ Merge Request<\/strong> en GitHub, GitLab o Bitbucket para revisi\u00f3n del equipo.<\/li>\n<li><strong>Fusionar en main una vez aprobada:<\/strong>\n<pre><code>git checkout main\ngit merge feature\/nombre-de-la-feature\ngit push<\/code><\/pre>\n<\/li>\n<li><strong>Eliminar la rama de feature:<\/strong>\n<pre><code>git branch -d feature\/nombre-de-la-feature\ngit push origin --delete feature\/nombre-de-la-feature<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: ERRORES COMUNES \u2014 NUEVO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Errores comunes en Git y c\u00f3mo resolverlos<\/h2>\n<h3>\u00abYour local changes would be overwritten by merge\u00bb<\/h3>\n<p>Tienes cambios sin commitear en archivos que el merge tambi\u00e9n va a modificar. Git se niega a sobrescribirlos. Soluci\u00f3n: guarda los cambios con <code>git stash<\/code>, haz el merge o pull, y luego recupera tus cambios con <code>git stash pop<\/code>.<\/p>\n<h3>\u00abfatal: refusing to merge unrelated histories\u00bb<\/h3>\n<p>Ocurre al intentar fusionar dos repositorios que no comparten ning\u00fan commit en com\u00fan (por ejemplo, un repo local iniciado con <code>git init<\/code> con uno remoto que ya ten\u00eda commits). Soluci\u00f3n: <code>git pull origin main --allow-unrelated-histories<\/code>.<\/p>\n<h3>\u00aberror: failed to push some refs\u00bb<\/h3>\n<p>El remoto tiene commits que t\u00fa no tienes localmente. Necesitas primero incorporar esos cambios. Soluci\u00f3n: <code>git pull --rebase origin main<\/code> y luego <code>git push<\/code>.<\/p>\n<h3>Conflictos de merge no resueltos<\/h3>\n<p>Git marca los archivos con conflicto con las secciones <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;<\/code>, <code>=======<\/code> y <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;<\/code>. El proceso para resolverlos es: editar los archivos manualmente para dejar el contenido correcto, ejecutar <code>git add archivo-resuelto<\/code> por cada archivo y finalmente <code>git commit<\/code> para completar el merge.<\/p>\n<h3>Commit con mensaje incorrecto (antes de hacer push)<\/h3>\n<p>Si el \u00faltimo commit a\u00fan no est\u00e1 en el remoto, puedes corregirlo con <code>git commit --amend -m \"Mensaje correcto\"<\/code>.<\/p>\n<h3>Accidentalmente commite\u00e9 en la rama equivocada<\/h3>\n<p>Si a\u00fan no has hecho push: cambia a la rama correcta, ejecuta <code>git cherry-pick &lt;commitID&gt;<\/code> para copiar el commit all\u00ed, y luego vuelve a la rama equivocada y deshaz el commit con <code>git reset --hard HEAD~1<\/code>.<\/p>\n<p><!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     H2: FAQ \u2014 NUEVO\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<h2>Preguntas frecuentes sobre comandos Git<\/h2>\n<h3>\u00bfCu\u00e1l es la diferencia entre git pull y git fetch?<\/h3>\n<p><code>git fetch<\/code> descarga las actualizaciones del remoto pero no modifica tu \u00e1rea de trabajo ni tu rama activa \u2014 solo actualiza las referencias remotas locales. <code>git pull<\/code> hace lo mismo pero adem\u00e1s fusiona (o rebasa) esos cambios en tu rama actual. <code>fetch<\/code> es m\u00e1s seguro cuando quieres revisar qu\u00e9 cambi\u00f3 antes de integrar.<\/p>\n<h3>\u00bfCu\u00e1l es la diferencia entre git merge y git rebase?<\/h3>\n<p><code>git merge<\/code> une dos ramas creando un nuevo commit de merge, preservando el historial completo con todas las bifurcaciones. <code>git rebase<\/code> reaplica los commits de tu rama encima de otra, produciendo un historial lineal m\u00e1s limpio pero reescribiendo los IDs de commit. Regla general: usa merge en ramas compartidas (main, develop) y rebase en ramas de feature locales antes de hacer push.<\/p>\n<h3>\u00bfCu\u00e1l es la diferencia entre git revert y git reset?<\/h3>\n<p><code>git revert<\/code> crea un nuevo commit que deshace los cambios de otro commit, sin modificar el historial existente. Es seguro en ramas compartidas. <code>git reset<\/code> mueve el puntero de la rama hacia atr\u00e1s, reescribiendo el historial. Solo debe usarse en commits que a\u00fan no est\u00e1n en el remoto.<\/p>\n<h3>\u00bfC\u00f3mo ver todos los comandos disponibles de Git?<\/h3>\n<p>Ejecuta <code>git help<\/code> para el resumen b\u00e1sico, <code>git help -a<\/code> para el listado completo de comandos, o <code>git help &lt;comando&gt;<\/code> para la documentaci\u00f3n detallada de un comando espec\u00edfico. Por ejemplo: <code>git help log<\/code>.<\/p>\n<h3>\u00bfC\u00f3mo deshacer el \u00faltimo git add sin perder los cambios?<\/h3>\n<p>Con <code>git reset HEAD archivo<\/code> (o <code>git restore --staged archivo<\/code> en Git \u2265 2.23). Esto saca el archivo del \u00e1rea de staging pero mantiene los cambios en el \u00e1rea de trabajo.<\/p>\n<h3>\u00bfC\u00f3mo eliminar una rama remota?<\/h3>\n<p>Con <code>git push origin --delete nombre-de-rama<\/code>. Para eliminar tambi\u00e9n la referencia local de esa rama remota: <code>git fetch --prune<\/code>.<\/p>\n<h3>\u00bfQu\u00e9 es el archivo .gitignore y c\u00f3mo funciona?<\/h3>\n<p>Es un archivo de texto en la ra\u00edz del repositorio que le indica a Git qu\u00e9 archivos o carpetas debe ignorar (no rastrear). Se usa para excluir archivos de configuraci\u00f3n local, dependencias (<code>node_modules\/<\/code>, <code>vendor\/<\/code>), builds compilados, archivos con credenciales, etc. Cada l\u00ednea es un patr\u00f3n: <code>*.log<\/code> ignora todos los archivos .log; <code>\/dist<\/code> ignora la carpeta dist en la ra\u00edz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda de referencia de comandos Git con ejemplos Git es la herramienta de control de versiones m\u00e1s usada del mundo, y aunque existen clientes gr\u00e1ficos, la l\u00ednea de comandos sigue siendo el entorno m\u00e1s r\u00e1pido, flexible y universal para trabajar con repositorios. Conocer los comandos esenciales te permite moverte con confianza en cualquier proyecto, servidor [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":9381,"menu_order":3,"comment_status":"open","ping_status":"closed","template":"","doc_tag":[],"doc_badge":[],"class_list":["post-9385","docs","type-docs","status-publish","hentry","no-post-thumbnail"],"acf":[],"author_avatar":"https:\/\/secure.gravatar.com\/avatar\/c64e192e92bea4df8a48c5da36fb4618ceff98bc7377f1f887657a979722a633?s=96&d=mm&r=g","author_name":"Jose Manuel Garc\u00eda Romero","_links":{"self":[{"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/docs\/9385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/comments?post=9385"}],"version-history":[{"count":5,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/docs\/9385\/revisions"}],"predecessor-version":[{"id":9972,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/docs\/9385\/revisions\/9972"}],"up":[{"embeddable":true,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/docs\/9381"}],"wp:attachment":[{"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/media?parent=9385"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/doc_tag?post=9385"},{"taxonomy":"doc_badge","embeddable":true,"href":"https:\/\/www.nicalia.com\/nicapedia\/wp-json\/wp\/v2\/doc_badge?post=9385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}