Comandos Git: 149 en grupos, con buscador y favoritos
La guía rápida de comandos Git es una tabla lista para usar: 149 comandos agrupados en once escenarios —inicialización y configuración, commits del día a día, ramas, fusiones y rebase, deshacer y revertir, trabajo remoto, stash, etiquetas, submódulos y worktrees, historial y diagnóstico, e ignorar y atributos—, y cada uno trae una explicación, un ejemplo que se puede pegar tal cual y un nivel de riesgo entre «atención» y «peligro»: los comandos que pueden perder cambios sin confirmar o reescribir una historia ya compartida se reconocen de un vistazo.
La guía rápida de comandos Git es una tabla lista para usar: 149 comandos agrupados en once escenarios —inicialización y configuración, commits del día a día, ramas, fusiones y rebase, deshacer y revertir, trabajo remoto, stash, etiquetas, submódulos y worktrees, historial y diagnóstico, e ignorar y atributos—, y cada uno trae una explicación, un ejemplo que se puede pegar tal cual y un nivel de riesgo entre «atención» y «peligro»: los comandos que pueden perder cambios sin confirmar o reescribir una historia ya compartida se reconocen de un vistazo.
Está pensada para tres momentos: cuando recuerdas qué quieres hacer pero no cómo se escribe el comando (busca «deshacer commit», «borrar rama remota»); cuando conoces el comando pero no estás seguro de si puede perder algo (mira el nivel de riesgo y las notas); y cuando tocas Git por primera vez y quieres entender qué se mueve entre add, commit y push (mira el diagrama de las cuatro áreas del principio y los esquemas de operaciones de más abajo).
Al final de la página hay una terminal Git simulada que funciona solo en memoria: admite más de 30 subcomandos habituales, el grafo de commits de la derecha cambia en tiempo real con cada comando y trae 10 niveles de práctica, del «primer commit» a «resolver un conflicto de fusión». No es un Git real y no toca tu ordenador ni la red, pero su semántica sigue el manual oficial, así que lo aprendido se traslada a una máquina real.
Cómo usarlo
01Buscaescribe en la caja de arriba el nombre del comando o lo que quieres hacer (por ejemplo «deshacer», «push forzado», «borrar rama»); admite varias palabras separadas por espacios y solo muestra los resultados que coinciden con todas, ordenados por el grupo original.
02Explora por escenariopulsa las chips de grupo para ver solo una categoría, o usa el índice de grupos que hay bajo el diagrama de «las cuatro áreas» para saltar al bloque correspondiente; marca «ver solo comandos con riesgo» para repasarlos antes de ejecutarlos.
03Copiapulsa el texto azul del comando o el icono de copiar de la derecha para copiar el comando, y el segundo icono para copiar el ejemplo; en «combinaciones habituales» puedes copiar una receta entera.
04Favoritosla estrella fija los comandos que más usas arriba, en «mis favoritos»; se guardan en este navegador (localStorage) y no se sincronizan entre dispositivos.
05Practicabaja a la «terminal de práctica», elige un nivel y escribe los comandos según el objetivo; cada comando se evalúa automáticamente y, si te atascas, puedes pedir una pista o la solución, y reiniciar el nivel a su estado inicial.
Ejemplos de entrada y salida
Si escribes «deshacer commit» en el buscador, aparecen estas filas del grupo «deshacer y revertir» (extracto):
Así se resuelve en la terminal simulada el nivel 4, «deshacer el último commit pero conservar los cambios»:
text
git reset --soft HEAD~1 deshace el último commit y deja los cambios preparados atención
git reset HEAD~1 deshace el último commit y devuelve los cambios al árbol de trabajo sin preparar
git reset --hard <commit> puntero de rama, índice y árbol de trabajo vuelven todos a <commit> peligro
git revert <commit> crea un commit nuevo que invierte los cambios; la historia no cambia y se puede subir sin riesgo
bash
user@toolun-lab:~/project (main)$ git log --oneline
7f3a1c2 (HEAD -> main) wip: cambios pendientes
2b9e0d4 init: add README
user@toolun-lab:~/project (main)$ git reset --soft HEAD~1
HEAD está ahora en 2b9e0d4 init: add README
--soft: solo mueve el puntero de rama; el índice y el árbol de trabajo se conservan (el contenido del commit deshecho queda preparado)
Aviso: el commit descartado 7f3a1c2 todavía se puede recuperar con git reflog
user@toolun-lab:~/project (main)$ git status -s
A app.js
A secret.env
✔ Nivel superado: deshace el último commit pero conserva los cambios.
Cómo funciona
Las cuatro áreas: los comandos solo mueven datos
Casi cualquier comando de Git se puede entender como «llevar contenido de un área a otra». El árbol de trabajo son los archivos que ves y editas; el índice es la lista de «cómo será el próximo commit»; el repositorio local (.git) guarda todos los commits; y el repositorio remoto es lo mismo, en otra máquina.
add al índice, commit al repositorio, push al remoto; en sentido inverso, fetch y restore
Con este esquema, casi todas las dudas de «cómo deshago esto» tienen una respuesta común: si te equivocaste y aún no has hecho add, recupera con git restore <file> desde el índice; si ya hiciste add y no quieres confirmarlo, usa git restore --staged; si ya confirmaste, usa git reset; y si ya lo subiste, solo puedes añadir un commit inverso con git revert.
Un commit es una instantánea y una rama es solo un puntero
Un objeto commit registra: la instantánea de todo el árbol de directorios (no un diff), el id del commit padre, el autor y la fecha, y el mensaje. Todo eso se pasa por SHA-1 (en repositorios nuevos, opcionalmente SHA-256) para obtener el id del commit, así que cualquier cambio, aunque sea una letra del mensaje, produce un id completamente nuevo. Por eso --amend, rebase y cherry-pick «reescriben la historia»: generan commits nuevos y los antiguos simplemente dejan de estar referenciados.
Una rama es un archivo de 40 caracteres en .git/refs/heads/<name> cuyo contenido es el id de un commit. HEAD apunta normalmente al nombre de una rama. Por eso crear una rama es instantáneo (escribir un archivo pequeño), cambiar de rama es redirigir HEAD a otro nombre y actualizar el árbol de trabajo a la instantánea de ese commit, y borrar una rama es solo borrar un puntero: los commits no desaparecen de inmediato.
Elegir entre merge y rebase
mismo punto de partida, dos historias distintas según merge o rebase
merge registra con fidelidad lo que pasó: las dos líneas se unen en el commit de fusión y cualquiera puede ver que esa funcionalidad se desarrolló en paralelo. rebase hace que la historia parezca siempre lineal, con un git log más legible y un git bisect más útil, pero a cambio cambian todos los ids de commit. La regla práctica: haz rebase sin miedo en tus ramas aún no subidas; en una rama sobre la que pueden estar trabajando otros, haz solo merge. git pull --rebase es la aplicación diaria de esa regla: recoloca tus commits locales no subidos después de lo último del remoto y evita una ristra de «Merge branch 'main' of …».
Los tres modos de reset
qué área devuelve cada uno de los tres modos al commit de destino
--soft va bien para «dividir o reagrupar commits»: el puntero retrocede y el contenido sigue en el índice. --mixed (el modo predeterminado) va bien para «volver a elegir qué confirmar». --hard sí descarta de verdad: los cambios del árbol de trabajo que nunca se confirmaron no se pueden recuperar, mientras que los commits deshechos siguen en la base de objetos; git reflog muestra cada movimiento de HEAD y git reset --hard HEAD@{1} vuelve al estado anterior al reset. De forma predeterminada, el reflog se conserva 90 días (30 días para las entradas inalcanzables): esa es la ventana de arrepentimiento que te da Git.
Cómo se decide el nivel de riesgo
La marca «peligro» se aplica a dos familias: comandos que descartan contenido sin confirmar del árbol de trabajo (restore, reset --hard, clean, stash drop, checkout -- <file>) y comandos que reescriben una historia que otros ya pueden tener (push --force, branch -D de una rama sin fusionar). La marca «atención» se aplica a comandos que cambian el estado pero se pueden revertir, o que exigen confirmar antes el alcance (commit --amend, rebase, merge --squash, push --delete). Los comandos de solo lectura (log, diff, status, show, blame) no llevan marca.
Alcance y limitaciones
Origen de los comandos
se toma como referencia el manual oficial de Git (git-scm.com/docs, Git 2.4x); git switch y git restore necesitan la versión 2.23 o superior, y la forma antigua checkout también aparece.
Criterio de inclusión
comandos y opciones que se usan en el desarrollo diario, la colaboración y el diagnóstico; cada uno tiene su explicación en la página del manual. No se incluyen comandos plumbing (hash-object, cat-file, update-ref, etc.) ni operaciones propias de una plataforma (las acciones web de PR en GitHub o de MR en GitLab).
Terminal simulada
implementa la semántica esencial de los subcomandos habituales (avance rápido o fusión a tres bandas, detección de conflictos por archivo, los tres modos de reset, rebase lineal, stash y push/pull remotos); no admite rebase interactivo, bisect, submódulos, hooks ni todas las opciones de los archivos de configuración, y un rebase con conflictos se aborta solo en lugar de esperar a que lo resuelvas.
Lo que no hace
no se conecta a repositorios reales, no lee el .git de tu ordenador ni ofrece un resolutor gráfico de conflictos.
Favoritos y recientes
se guardan solo en este navegador y desaparecen al borrar los datos del sitio.
Casos de uso típicos
Un commit hecho demasiado pronto, mal escrito o en la rama equivocada
Busca «deshacer» o entra en el grupo «deshacer y revertir», distingue primero los casos «aún no subido» (reset, --amend) y «ya subido» (revert) y elige después el comando. En «combinaciones habituales» hay recetas completas como «confirmé en main y quiero moverlo a una rama nueva».
Dejar limpios los commits sueltos antes de fusionar
git rebase -i HEAD~N junto con squash, fixup o reword; en la tarjeta de rebase del esquema se ve cómo la historia pasa de bifurcada a lineal y por qué los commits antiguos se quedan en gris.
Primera colaboración: remotos, seguimiento y push rechazado
El grupo «trabajo remoto» va de remote add a push -u y --force-with-lease, y los niveles 8 (subir) y 9 (deshacer un commit ya subido) de la terminal de práctica cubren los dos «no me deja subir» más habituales.
Recuperar cosas «desaparecidas»
git reflog, git fsck --lost-found y git stash list están seguidos en «deshacer y revertir»; la receta «recuperar una rama borrada por error» se hace en dos pasos.
Preguntas frecuentes
¿Cuándo uso git reset y cuándo git revert?
Depende de si el commit ya se subió. Si no se ha subido, reset retrocede el puntero y la historia queda limpia. Si ya se ha subido, revert añade un commit inverso y no reescribe la historia que otros ya tienen; de lo contrario, la próxima vez que hagan pull se encontrarán con una bifurcación.
¿Por qué aparece un commit «Merge branch 'main' of …» después de un git pull?
Porque tienes commits locales sin subir y el remoto también tiene commits nuevos, y el pull predeterminado une las dos partes con una fusión. Para evitarlo, usa git pull --rebase o configura de una vez git config --global pull.rebase true.
¿Qué diferencia hay entre --force y --force-with-lease?
--force sobrescribe la rama remota sin condiciones. --force-with-lease comprueba antes si la rama remota sigue en el commit que viste en tu último fetch y lo rechaza si alguien ha subido algo nuevo: deja fuera accidentes como «pisar el commit de un compañero». Para subir después de reescribir la historia, usa siempre esta segunda forma.
¿Por qué el id de commit de la terminal simulada es siempre el mismo?
En Git real, el id sale de aplicar un hash al contenido, el autor y la marca de tiempo; el simulador usa un reloj lógico en lugar del tiempo real y un hash determinista, así que la misma secuencia de operaciones da el mismo id y es fácil comparar con la solución. Sus ids no coinciden con los que calcularía Git real, y es a propósito.
¿Los comandos de la guía funcionan en Windows?
Los comandos son iguales en todas las plataformas. La diferencia está en el shell: en PowerShell && necesita la versión 7.x y conviene envolver las rutas entre comillas; para los saltos de línea, ajusta la entrada core.autocrlf de «inicialización y configuración».
Privacidad
Todos los datos de esta página (la tabla de comandos, los esquemas y la terminal simulada) son contenido estático que se descarga con la página y se ejecuta en tu navegador; buscar, copiar, guardar favoritos y practicar no envían ninguna petición al servidor. Los favoritos se guardan en el localStorage de este equipo y el sitio no puede leerlos. Los enlaces externos de la página apuntan a la documentación oficial de Git y, al pulsarlos, los gestiona el sitio de destino.
Referencias y lecturas
Git Reference Manual(consultado el 2026-09-09)—— la página de manual autoritativa de cada comando; todas las entradas de esta página se contrastaron con ella.
Pro Git, 2.ª edición(consultado el 2026-09-09)—— el capítulo 3, «Ramas», y el apartado 7.7, «Reset al descubierto», son la mejor introducción para entender los punteros y las tres áreas.
Página de manual de git-reset(consultado el 2026-09-09)—— la tabla oficial del efecto de los tres modos sobre HEAD, el índice y el árbol de trabajo.
Página de manual de git-rebase(consultado el 2026-09-09)—— el apartado «Recovering from upstream rebase» explica por qué no hay que hacer rebase en ramas compartidas.
149 comandos Git agrupados por situación, cada uno con explicación, ejemplo y nivel de riesgo; búsqueda, copia con un clic y favoritos; incluye diagramas y una terminal de práctica
Esta herramienta no está traducida por completo; parte del contenido usa el idioma de origen o uno de reserva.
Total 149 comandos
Los datos fluyen entre las cuatro zonas: add a la zona de preparación, commit al repositorio local, push al remoto; en sentido inverso, con fetch / restore / switch. pull = fetch + merge.
Inicialización y configuración
14 entradas· Nuevos repositorios, clones, identidades y configuraciones comunes
Convierta el directorio actual en un repositorio Git (generar .git/)
git init
git init -b main # Especifica el nombre de la rama inicial
Clonar el repositorio remoto localmente y configurar automáticamente el origen
Almacenar temporalmente todos los cambios: nuevos, modificados, eliminados (git add. Equivalente en 2.x)
git add -A
git add -u # Solo se almacenan los cambios temporales y las eliminaciones de los archivos rastreados, excluyendo los archivos nuevos.
Presione "bloquear" de forma interactiva para seleccionar los cambios que se van a preparar y confirmar solo parte de un archivo.
git add -p src/app.js
# y guardar temporalmente esta pieza n saltar s dividir en piezas más pequeñas q salir
Convertir el contenido del área de preparación en un commit.
git commit -m "solución: juicio correcto sobre el tiempo de espera de inicio de sesión"
Omitir agregar: organizar automáticamente los commits modificadas de los archivos rastreados (no se incluirán archivos nuevos)Precaución
git commit -am "docs: update readme"
Es fácil introducir cambios que no desea realizar. Simplemente ejecute git status antes de confirmar.
Reemplace el último commit con el contenido del área de preparación + nueva descripción (corrija los errores tipográficos, complete los archivos que faltan)Precaución
git add forgotten.js
git commit --amend --no-edit #Agregar archivos pero no cambiar la descripción
git commit --amend -m "nueva descripción"
Generar una nueva ID de commit; No modifique los commits que ya hayan sido enviados; de lo contrario, será necesario enviarlos.
Cree un commit vacía sin cambios (activar CI, marcar nodo)
Espacio de trabajo versus área de preparación: aún no hay cambios que agregar
git diff
git diff src/app.js # Ver solo un archivo
Área de preparación frente a el último commit: contenido que se enviará (sinónimo de caché)
git diff --staged
Compara las diferencias entre dos commits/ramas
git diff main feature
git diff HEAD~3 HEAD -- src/
git diff main...feature # Cambios de características en relación con el punto de bifurcación
Mire solo las estadísticas de cuántas líneas se han cambiado para cada archivo
git diff --stat HEAD~1
Muestre las diferencias por palabra en lugar de línea, lo que facilita ver los cambios de redacción.
git diff --word-diff=color README.md
Ver historial de commits
git log
git log -5 # Últimas 5 entradas
git log --oneline # Una línea por línea
La historia de todas las ramas se dibuja en forma de diagrama con nombres de referencia.
git log --oneline --graph --all --decorate
Ver la información y los cambios de un commit
git show HEAD
git show a1b2c3d --stat
git show HEAD:src/app.js # Ver el contenido del archivo de una determinada versión
Elimine el archivo y coloque "eliminar" en el área de almacenamiento temporal
git rm old.txt
git rm -r legacy/
Solo elimine y conserve archivos locales del repositorio (se usa cuando node_modules/.env se envía por error)
git rm --cached .env
echo ".env" >> .gitignore
Cambiar nombre/mover archivos y escenario (igual a mv + git add)
git mv utils.js helpers.js
rama
14 entradas· Crear, cambiar, renombrar, eliminar
Listar ramas locales (* es la rama actual)
git branch
git rama -a # incluye ramas remotas
git branch -vv # Con la última relación de commit y seguimiento
Cree una rama en la commit actual sin cambiar a ella
git branch feature/login
revisión de rama de git a1b2c3d # Crear a partir del compromiso especificado
Cambiar a una rama existente (2.23+; forma antigua de escribir git checkout <branch>)
git switch main
git switch - # Regresar a la rama anterior
Crear y cambiar a una nueva rama (forma antigua de escribir git checkout -b)
git switch -c feature/search
git switch -c hotfix origin/main # Basado en la rama remota
Crear y cambiar (forma antigua de escribir, disponible en todas las versiones)
git checkout -b release/1.2
Cambie el nombre de la rama (al omitir la antigua se cambiará el nombre de la rama actual)
git branch -m master main
git push -u origin main && git push origin --delete master
Eliminar ramas locales fusionadas (las no fusionadas se rechazarán)
git branch -d feature/login
Forzar la eliminación de ramas locales independientemente de si se fusionan o noPeligro
git branch -D experiment
los commits únicas en la rama quedarán huérfanas y se podrán recuperar mediante reflog en el corto plazo.
Enumere las ramas que se han fusionado en la rama actual (mire esto primero cuando limpie)
git branch --merged main
git rama --no-merged # a la inversa
Establezca el flujo ascendente de la rama actual en una rama remota (no es necesario escribir parámetros para pull/push después)
git branch -u origin/feature/login
¿Qué ramas contienen este compromiso?
git branch -a --contains a1b2c3d
Consulte un commit e ingrese al estado de "puntero de cabeza desconectado". Úselo sólo cuando desee realizar cambios.Precaución
git checkout v1.0
git switch -c fix-from-v1 # Si desea conservar los cambios, cree una rama aquí
Los commits en este estado no pertenecen a ninguna rama y se pierden fácilmente después de ser cortados.
Enumere las ramas ordenadas por hora de commit reciente para saber en qué ha estado ocupado recientemente
git branch --sort=-committerdate | head
Eliminar referencias de ramas remotas que ya no existen al extraer (podar)
git fetch -p
git remote prune origin
Fusionar y rebase
16 entradas· fusionar/rebase/seleccionar y manejo de conflictos
Fusionar rama en la rama actual: avance rápido si puede; de lo contrario, se generará un commit de fusión
git switch main
git merge feature/login
Genere siempre commits de fusión, conservando el historial de "había una rama aquí"
git merge --no-ff feature/login
Comprima todos los cambios realizados en la rama en un almacenamiento temporal y podrá realizar un commit manualmente
Cuando se rebase, los significados de nuestro/de ellos se invierten: nuestra es la rama que se rebase.
"Mueva" los commits de la rama actual a la base y luego reprodúzcalas para obtener el historial en línea recta.Precaución
git switch feature
git rebase main
Todos los ID de commit que se muevan cambiarán; Las ramas que han sido empujadas y alguien está trabajando en ellas no deben cambiarse de base.
Rebase interactivo: fusionar/reescribir/reorganizar/eliminar commits después de la commitPrecaución
git rebase -i HEAD~3
# elegir mantener reformular cambiar la descripción aplastar fusionar con la anterior arreglar fusionar y perder la descripción soltar eliminar
Rebase encuentra un conflicto: resolver y continuar después de agregar
git add .
git rebase --continue
Renuncia a este rebase y vuelve al punto de partida.
git rebase --abort
Migrar los commits de old-base..branch a new-base
git rebase --onto main server client
Adecuado para la situación en la que "la rama se abre en el lugar equivocado".
Primero haga un commit de reparación y combínela automáticamente con la commit de destino al realizar el cambio de base.
git commit --fixup a1b2c3d
git rebase -i --autosquash a1b2c3d~1
Copie los cambios de una determinada commit a la rama actual (nueva identificación)
git cherry-pick a1b2c3d
git cherry-pick a1b2c3d..e5f6g7h # Un rango (excluyendo a1b2c3d)
Aplique cambios solo al espacio de trabajo y al área de preparación, no los confirme automáticamente
git cherry-pick -n a1b2c3d
Resuelva los conflictos uno por uno con herramientas gráficas configuradas
Recuerde el método de resolución de conflictos y reutilice automáticamente el mismo conflicto la próxima vez.
Revertir y deshacer
16 entradas· Deshacer espacio de trabajo/área de preparación/enviar y recuperar contenido perdido
Descartar los cambios del espacio de trabajo y restaurar a la versión del área de preparación (forma antigua de escribir git checkout - <archivo>)Peligro
Deshaga el último commit y devuelva los cambios al espacio de trabajo sin prepararlos (predeterminado: mixto)
git reset HEAD~1
El puntero de rama, el área de almacenamiento temporal y el área de trabajo se devuelven para confirmar y los cambios no confirmados se descartan.Peligro
git reset --hard HEAD~1 # Desecha el último compromiso
git reset --hard origin/main # Exactamente igual que el control remoto
Los cambios en el espacio de trabajo son irreversibles; los comprometidos se pueden recuperar usando git reflog.
Mover un archivo fuera del área de preparación (mantener el área de trabajo), equivalente a restaurar --staged
git reset package-lock.json
Genere una nueva commit para compensar los cambios de commit, el historial permanece sin cambios y se puede enviar de forma segura
git revert HEAD
git revert a1b2c3d --no-edit
Deshacer una sección de commits en lotes y enviarlos juntos al final
Deshacer una fusión (-m 1 significa mantener el lado de la primera commit principal)Precaución
git revert -m 1 f00ba12
Después de deshacer la fusión, debe revertirla antes de fusionarla en la misma rama.
Registro de movimiento HEAD: restablecer/rebase/recuperar commits "desaparecidas" después de eliminar ramas
git reflog
git reset --hard HEAD@{2} # Regresar al estado anterior al paso 2
git rama rescate a1b2c3d # Crear una rama para el commit huérfano
Eliminar todos los archivos y directorios sin seguimiento (vista previa con -n primero)Peligro
git clean -n # Vista previa de lo que se eliminará
git clean -fd # ejecutar
git clean -fdx # Elimina incluso los ignorados en .gitignore (como node_modules)
(Forma antigua de escritura) Descartar cambios en el espacio de trabajo, equivalente a git restaurarPeligro
git checkout -- src/app.js
Corregir el autor del compromiso más reciente.Precaución
git commit --amend --author="Zhang San <zs@example.com>" --no-edit
Enumerar objetos inalcanzables, un último recurso cuando reflog no está disponible
git fsck --lost-found
git show <dangling-commit-id>
Recuperar el alijo que se dejó caer accidentalmente (el alijo es esencialmente un commit)
Mostrar la última persona modificada y confirmar línea por línea
git blame -L 40,60 src/app.js
git culpable -w -C src/app.js # Ignorar espacios en blanco, seguir movimientos
Búsqueda binaria de commits que introducen errores
git bisect start
git bisect malo # Actualmente malo
git bisect good v1.1.0 # Esta versión es buena
# Pruebe repetidamente y ejecute git bisect good/bad
git bisect reset
Deje que el guión determine automáticamente si es bueno o malo y lo divida automáticamente en dos partes.
git bisect run npm test
Buscar dentro de archivos rastreados (más rápido que grep -r y no busca node_modules)
git grep -n "TODO" -- "*.ts"
git grep "foo" v1.0 # Buscar en una versión determinada
Ver directamente el contenido de una determinada versión de un archivo sin cortar ramas
git show HEAD~5:src/config.js > old-config.js
Listar solo nombres de archivos modificados
git diff --name-only HEAD~3 HEAD
git diff --name-status main # con estado M/A/D
Ver el número y el espacio ocupado de los objetos del almacén.
Encadenar varios comandos en una receta de «quiero hacer una cosa»; al desplegarla se copia entera.
Deshacer el último commit pero conservar los cambios.
El commit fue demasiado pronto / la descripción se escribió incorrectamente / Quiero dividirlo en dos commits (y aún no se ha enviado)
git reset --soft HEAD~1Enviar y retirar, los cambios aún están en el área de preparación
git statusConfirme que todos los archivos estén en "Cambios a enviar"
git commit -m "nueva descripción"
Deshacer un compromiso ya enviado
Es posible que otros ya lo hayan tomado, la historia no se puede reescribir.
git revert <commit>Generar compromiso inverso
git push
Retroceder a una versión (local)Peligro
El experimento local está mal y quiero volver por completo a un compromiso determinado.
git log --onelineEncuentre la identificación de commit de destino
git stash -u(Opcional) Contrae los cambios que deseas conservar primero
git reset --hard <commit>
Enviado en principal y desea mudarse a una nueva ramaPrecaución
Olvidé abrir una rama y la envié N veces.
git branch feature/xCree una rama en la ubicación actual ("guarde" estas commits)
git reset --hard origin/mainprincipal regresa al estado remoto
git switch feature/x
Combine múltiples commits fragmentarios en unoPrecaución
Organice el historial antes de abrir un PR (la rama no es utilizada por otros)
git rebase -i HEAD~4Cambie la selección en las siguientes líneas para aplastar o arreglar
git push --force-with-leaseRequerido sólo si la rama ha sido empujada
Deje que la rama de funciones se mantenga al día con el último progreso de main
main tiene una nueva commit y la rama de funciones debe continuar encima de ella
git fetch origin
git switch feature/x
git rebase origin/maino git merge origin/main (mantener commits de fusión)
Cambiar el nombre de maestro a principal (incluido el remoto)Precaución
Unificar el nombre de la rama predeterminada
git branch -m master main
git push -u origin main
git push origin --delete masterPrimero, corte la rama predeterminada a principal en la plataforma de alojamiento.
Recuperar ramas eliminadas accidentalmente
Lo encontré útil después de git branch -D
git reflogEncuentre la identificación de el último commit de la rama (como "commit: xxx")
git branch <name> <commit-id>
Clave/archivo grande enviado por errorPeligro
.env o cientos de archivos MB ingresados al historial
git rm --cached .env && echo ".env" >> .gitignoreSi solo se realiza el último commit: entonces git commit --amend
git filter-repo --path .env --invert-pathsYa en lo profundo de la historia: reescribe todo el historial con git-filter-repo (debe instalarse por separado)
git push --force-with-lease --allTodos los colaboradores deben volver a clonarse; Las claves filtradas deben invalidarse y volverse a emitir de todos modos.
Traer una solución a la rama de lanzamiento.
Los errores corregidos en main también se trasladarán a la versión 1.2.
git switch release/1.2
git cherry-pick <commit>
git push
Fusionar proceso de manejo de estándares de conflictos
git merge / pull report CONFLICTO
git statusVea qué documentos fueron "modificados por ambas partes"
code <file>Procesar <<<<<<< ======= >>>>>>> etiquetas en el editor, conservando el contenido correcto
git add <file>Agregue uno después de que cada uno esté arreglado
git commitCuando rebase, git rebase --continuar
Hay un proyecto existente localmente, envíelo al nuevo almacén remoto vacío.
Primero escribí el código localmente y luego construí un almacén en GitHub.
git init -b main && git add -A && git commit -m "init"
Diagrama: qué hace cada comando con el grafo de commits
Los círculos son commits y las flechas apuntan al commit padre; las etiquetas verdes son ramas y la violeta indica la rama donde está HEAD; los círculos grises ya no están referenciados por ninguna rama (recuperables con reflog) y los rellenos son los commits que crea esta operación.
Commit: añadir un nodo en la punta de la rama actual
git add . && git commit -m "…"
Cada commit recuerda su propio commit padre; una rama no es más que un puntero móvil a un commit, así que al confirmar, main y HEAD avanzan juntos.
Crear una rama: solo un puntero, sin copiar archivos
git switch -c feature
La nueva rama y main apuntan al mismo commit, por lo que crearla es instantáneo; los commits posteriores en feature solo avanzan feature.
Fusión fast-forward: mover el puntero cuando main no tiene commits propios
git switch main && git merge feature
No se crea ningún commit nuevo y el historial sigue siendo una línea recta. Para conservar el rastro de que aquí hubo una rama, hay que usar --no-ff.
Fusión a tres bandas: cuando ambos lados tienen commits nuevos se crea un commit de fusión
git merge feature
Git busca el ancestro común b2, combina los cambios de cada lado respecto a b2 y crea m6 con dos commits padre. Solo hay conflicto cuando la misma zona cambia de forma distinta.
Rebase: reaplicar los commits de feature sobre main
git switch feature && git rebase main
El historial se vuelve una línea recta, pero c3 y d4 se sustituyen por los nuevos commits c3′ y d4′ (los id cambian). No se debe hacer rebase de una rama ya publicada, o el historial de los demás divergirá.
reset: retroceder el puntero de la rama (los commits quedan huérfanos por ahora)
git reset --hard HEAD~1
--soft solo mueve el puntero; --mixed además vacía la zona de preparación; --hard revierte también el árbol de trabajo. El commit huérfano c3 todavía se puede recuperar desde el reflog (se conserva al menos 30 días por defecto).
revert: cancelar con un commit inverso, sin reescribir el historial
git revert HEAD
c3 sigue en el historial y el nuevo commit r4 contiene la inversa de los cambios de c3. Para deshacer un commit ya publicado, conviene usar revert en lugar de reset.
cherry-pick: tomar un solo commit
git cherry-pick x7
Reaplica sobre main el cambio que x7 introdujo respecto a su commit padre y produce x7′ con el mismo contenido pero distinto id. Es la forma habitual de llevar una corrección concreta a una rama de publicación.
Terminal de práctica: escribir los comandos en el navegador
Un simulador de Git completamente en memoria (no es Git real y no se conecta a la red): admite los subcomandos habituales init / add / commit / branch / switch / merge / rebase / reset / revert / stash / tag / remote / push / pull, y el grafo de la derecha se actualiza en tiempo real. 10 niveles van de «la primera confirmación» a «resolver un conflicto de fusión». La práctica de comandos de Linux está enReferencia de comandos de Linux.
git-lab — bashTab para completar · ↑↓ historial · Ctrl+L para limpiar
Terminal de práctica de Git de Toolun: un Git en memoria con el que se puede experimentar libremente sin romper nada.
Escribir git help para ver los subcomandos admitidos; elegir un nivel a la derecha y seguir el objetivo: el grafo de commits se actualiza con cada comando.