Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.54.0
2026-04-20
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.50.1 no changes
-
2.50.0
2025-06-16
- 2.39.4 → 2.49.1 no changes
-
2.39.3
2023-04-17
- 2.36.1 → 2.39.2 no changes
-
2.36.0
2022-04-18
- 2.34.1 → 2.35.8 no changes
-
2.34.0
2021-11-15
- 2.27.1 → 2.33.8 no changes
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 no changes
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 no changes
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.15.4 → 2.19.6 no changes
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.1.4 → 2.11.4 no changes
-
2.0.5
2014-12-17
SINOPSIS
gitreset[--soft|--mixed[-N] |--hard|--merge|--keep] [-q] [<confirmación>]gitreset[-q] [<árbol-ismo>] [--] <especificación-de-ruta>…gitreset[-q] [--pathspec-from-file=<fichero> [--pathspec-file-nul]] [<árbol-ismo>]gitreset(--patch|-p) [<árbol-ismo>] [--] [<especificación-de-ruta>…]
DESCRIPCIÓN
git reset does either of the following:
-
gitreset[<mode>] <commit> changes which commitHEADpoints to. This makes it possible to undo various Git operations, for example commit, merge, rebase, and pull. -
When you specify files or directories or pass
--patch,gitresetupdates the staged version of the specified files.-
gitreset[<modo>] [<confirmación>] -
Set the current branch head (
HEAD) to point at <commit>. Depending on <mode>, also update the working directory and/or index to match the contents of <commit>. <commit> defaults toHEAD. Before the operation,ORIG_HEADis set to the tip of the current branch.El <modo> debe ser uno de los siguientes (predeterminado
--mixed):-
--mixed -
Leave your working directory unchanged. Update the index to match the new
HEAD, so nothing will be staged.Si se especifica
-N, marca las rutas eliminadas como intento de inclusión (ver git-add[1]). -
--soft -
Leave your working tree files and the index unchanged. For example, if you have no staged changes, you can use git reset --soft HEAD~5; git commit to combine the last 5 commits into 1 commit. This works even with changes in the working tree, which are left untouched, but such usage can lead to confusion.
-
--hard -
Overwrite all files and directories with the version from <commit>, and may overwrite untracked files. Tracked files not in <commit> are removed so that the working tree matches <commit>. Update the index to match the new
HEAD, so nothing will be staged. -
--merge -
Restablece el índice y actualiza los ficheros en el árbol de trabajo que son diferentes entre <confirmación> y
HEAD, pero mantiene aquellos que son diferentes entre el índice y el árbol de trabajo (p. ej. aquellos cambios que no han sido agregados). Existe principalmente para restablecer entradas del índice sin fusionar, como aquellas que quedaron atrás porgitam-3ogitswitch-men ciertas situaciones. Si un fichero tiene diferencias entre <confirmación> y el índice tiene cambios sin presentar, se aborta el restablecimiento. -
--keep -
Restablece entradas del índice y actualiza ficheros en el árbol de trabajo que tienen diferencias entre <confirmación> y
HEAD. Si un fichero tiene diferencias entre <confirmación> yHEADtiene cambios locales, se aborta el restablecimiento. -
--recurse-submodules -
--no-recurse-submodules -
Cuando se actualiza el árbol de trabajo, usar
--recurse-submodulestambién restablecerá recursivamente el árbol de trabajo de todos los submódulos activos según la confirmación registrada en el superproyecto, también separando laHEADde los submódulos de esa confirmación.
-
-
gitreset[-q] [<árbol-ismo>] [--] <ruta>... -
gitreset[-q] [--pathspec-from-file=<fichero> [--pathspec-file-nul]] [<árbol>] -
For all specified files or directories, set the staged version to the version from the given commit or tree (which defaults to
HEAD).Esto significa que
gitreset<especificación-de-ruta> es lo opuesto agitadd<especificación-de-ruta>: deja de presentar todos los cambios en los ficheros o directorios especificados. Equivale agitrestore--staged<especificación-de-ruta>....In this mode,
gitresetupdates only the index (without updating theHEADor working tree files). If you want to update the files as well as the index entries, use git-restore[1]. -
gitreset(--patch|-p) [<árbol-ismo>] [--] [<ruta>...] -
Selecciona interactivamente cambios a partir de la diferencia entre el índice y la confirmación o árbol especificado (que se predeterminada a
HEAD). El índice es modificado usando los cambios seleccionados.Esto significa que
gitreset-pes lo opuesto agitadd-p, p. ej. puedes usarlo para retirar selectivamente cambios de la presentación. Ver la sección "Modo interactivo" de git-add[1] para aprender cómo usar la opción--patch.
-
Ver "Restablecer, restaurar y revertir" en git[1] para diferenciar los tres comandos.
OPCIONES
-
-q -
--quiet -
Ser silencioso, solo reportar errores.
-
--refresh -
--no-refresh -
Refresca el índice después de restablecimiento mixto. Habilitado predeterminadamente.
-
--pathspec-from-file=<fichero> -
La especificación de ruta se pasa en
_<fichero>_y no como argumento en la línea de comandos. Si_<fichero>_es exactamente-entonces se usa la entrada estándar. Los elementos de la especificación de ruta se separan por LF o CR/LF. Los elementos de la especificación de ruta pueden ser entrecomillados como se explica para la variable de configuracióncore.quotePath(ver git-config[1]). Ver también--pathspec-file-nuly--literal-pathspecsglobal. -
--pathspec-file-nul -
Sólo significativo con
--pathspec-from-file. Los elementos de la especificación de ruta se separan con el caracter NUL y todos los otros caracteres se toman literalmente (incluyendo saltos de línea y entrecomillados). -
-U<n> -
--unified=<n> -
Generate diffs with <n> lines of context. The number of context lines defaults to
diff.contextor 3 if the configuration variable is unset. (-Uwithout <n> is silently accepted as a synonym for-pdue to a historical accident). -
--inter-hunk-context=<n> -
Muestra el contexto entre pedazos de diferencia, hasta el <número> especificado de líneas, a modo de fusionar pedazos cercanos. Predeterminado a `diff.interHunkContext`o 0 si no se configura la opción.
-
-- -
No interpreta ningún argumento mas como opciones.
- <especificación-de-ruta>...
-
Limita las rutas afectadas por la operación.
Para mas detalles, ver pathspec en gitglossary[7].
EJEMPLOS
- Deshacer inclusión
-
$ edit (1) $ git add frotz.c filfre.c $ mailx (2) $ git reset (3) $ git pull git://info.example.com/ nitfol (4)
-
Estas felizmente trabajando en algo y los cambios en esos ficheros ya los ves bien; no quieres verlos al hacer
gitdiffporque planeas trabajar en otros ficheros y los cambios a los primeros te distraen. -
Alguien te pide incorporar, y parece que vale la pena fusionar esos cambios.
-
Sin embargo, ya ensuciaste el índice (es decir, tu índice no coincide con la
HEADde la confirmación). Pero sabes que la incorporación que vas a hacer no afectafrotz.cofiltre.c, así que reviertes los cambios al índice para esos dos ficheros. Tus cambios en el árbol de trabajo permanecen ahí. -
Entonces puedes incorporar y fusionar, manteniendo aún los cambios en
frotz.cyfilfre.cen el árbol de trabajo.
-
- Deshacer una confirmación y rehacer
-
$ git commit ... $ git reset --soft HEAD^ (1) $ edit (2) $ git commit -a -c ORIG_HEAD (3)
-
Esto se hace mas frecuentemente cuando recuerdas que esta incompleto lo que acabas de confirmar, o escribiste mal tu mensaje de confirmación, o ambos. Deja el árbol de trabajo como estaba antes del "reset".
-
Hacer correcciones a ficheros del árbol de trabajo.
-
"reset" copia la cabeza anterior a
.git/ORIG_HEAD; rehace la confirmación comenzando con su mensaje de registro. Si no necesitas editar mas el mensaje, simplemente puedes dar la opción-C.Ve también la opción
--amendde git-commit[1].
-
- Deshacer una confirmación, haciéndola una rama tópica
-
$ git branch topic/wip (1) $ git reset --hard HEAD~3 (2) $ git switch topic/wip (3)
-
Has hecho algunas confirmaciones, pero te das cuenta que fue prematuro hacerlo en la rama
master. Quieres continuar puliéndolas en una rama tópica, entonces creas la ramatopic/wipa partir de laHEADactual. -
Regresas la rama master para deshacerte de esas tres confirmaciones.
-
Cambias a la rama
topic/wipy sigues trabajando.
-
- Deshacer confirmaciones permanentemente
-
$ git commit ... $ git reset --hard HEAD~3 (1)
-
Las últimas tres confirmaciones (
HEAD,HEAD^yHEAD~2) estuvieron mal y no quieres ni siquiera verlas otra vez. No hagas esto si ya le has dado esas confirmaciones a alguien mas. (Ver la sección "Recuperándose de un rebase río arriba" en git-rebase[1] para las implicaciones de hacerlo.)
-
- Deshacer una fusión o incorporación
-
$ git pull (1) Auto-merging nitfol CONFLICT (content): Merge conflict in nitfol Automatic merge failed; fix conflicts and then commit the result. $ git reset --hard (2) $ git pull . topic/branch (3) Updating from 41223... to 13134... Fast-forward $ git reset --hard ORIG_HEAD (4)
-
El intento de actualizar desde el origen resultó en un montón de conflictos; y como no estabas listo para pasar mucho tiempo fusionando en el momento decides hacerlo después.
-
"pull" no confirmó la fusión, entonces
gitreset--hardque es un sinónimo degitreset--hardHEADlimpia el desastre partiendo del fichero del índice y el árbol de trabajo. -
Fusiona una rama tópica en el rama actual, lo que resulta en un avance rápido.
-
Pero decidiste que la rama tópica aún no esta lista para consumo público. "pull" o "merge" siempre dejan la punta original de la rama actual en
ORIG_HEAD, de tal manera que restableciéndola duramente te trae de vuelta tu fichero del índice y el árbol de trabajo en ese estado, y restablece la punta de la rama a esa confirmación.
-
- Deshacer una fusión o incorporación dentro de un árbol de trabajo sucio
-
$ git pull (1) Auto-merging nitfol Merge made by recursive. nitfol | 20 +++++---- ... $ git reset --merge ORIG_HEAD (2)
-
Incluso si tuvieras modificaciones locales en tu árbol de trabajo, puedes hacer con seguridad
gitpullcuando sabes que los cambios en la otra rama no se traslapan con los tuyos. -
Después de inspeccionar el resultado de la fusión, podrías encontrar que el cambio en la otra rama es insatisfactorio. Ejecutar
gitreset--hardORIG_HEADte regresará a donde estabas, pero descartará tus cambios locales, lo cual no quieres.gitreset--mergemantiene tus cambios locales.
-
- Flujo de trabajo interrumpido
-
Supón que te interrumpen para pedirte una corrección urgente cuando estas en medio de un cambio grande. Los ficheros en tu árbol de trabajo aún no están como para ser confirmados, pero necesitas obtener la otra rama para una corrección rápida.
$ git switch feature ;# trabajas en la rama "feature" y $ work work work ;# te interrumpen $ git commit -a -m "snapshot WIP" (1) $ git switch master $ fix fix fix $ git commit ;# confirma con registro real $ git switch feature $ git reset --soft HEAD^ ;# de regreso al estado de WIP (2) $ git reset (3)
-
Esta confirmación explotará, así que un mensaje de desecho no va mal.
-
Esto quita la confirmación WIP del historial de confirmaciones, y establece tu árbol de trabajo al estado justo antes de que hicieras esa instantánea.
-
En este punto el fichero del índice aún tiene todos los cambios de WIP que confirmaste como snapshot WIP. Esto actualiza el índice para mostrar tus ficheros de WIP como no confirmados.
Ver también git-stash[1].
-
- Restablecer un solo fichero en el índice
-
Supón que has agregado un fichero a tu índice, pero luego decides que no quieres incluirlo en tu confirmación. Puedes quitar el fichero del índice manteniendo tus cambios con git reset.
$ git reset -- frotz.c (1) $ git commit -m "Confirma ficheros en índice" (2) $ git add frotz.c (3)
-
Esto quita el fichero del índice mientras lo mantiene en el directorio de trabajo.
-
Esto confirma todos los cambios en el índice.
-
Agrega el archivo de nuevo al índice.
-
- Mantiene los cambios en el árbol de trabajo descartando algunas confirmaciones previas
-
Supón que estas trabajando en algo y lo confirmas, luego trabajas un poco mas, pero ahora piensas que lo que acabas de hacer debería ir en otra rama que no tiene nada que ver con lo que confirmaste anteriormente. Puedes comenzar una rama nueva y restablecerla manteniendo los cambios en tu árbol de trabajo.
$ git tag start $ git switch -c branch1 $ edición $ git commit ... (1) $ edición $ git switch -c branch2 (2) $ git reset --keep start (3)
-
Esto confirma tus primeras ediciones en
branch1. -
En un mundo ideal, al querer crear
branch2y cambiar a ella podrías haber notado que la confirmación anterior no pertenece al nuevo tópico (es decir,gitswitch-cbranch2start), pero nadie es perfecto. -
Pero ahora puedes usar
reset--keeppara quitar la confirmación no deseada después de cambiar abranch2.
-
- Dividir una confirmación en una secuencia de confirmaciones
-
Supón que has creado montones de cambios lógicamente separados y que los has confirmado en conjunto. Después decides que hubiera sido mejor tener cada grupo de pedazos lógicamente relacionados en su propia confirmación. Puedes usar git reset para rebobinar el historial sin modificar el contenido de tus ficheros locales, y hacer sucesivamente
gitadd-ppara seleccionar interactivamente qué pedazos se incluirán en cada confirmación, usandogitcommit-cpara pre-llenar el mensaje de confirmación.$ git reset -N HEAD^ (1) $ git add -p (2) $ git diff --cached (3) $ git commit -c HEAD@{1} (4) ... (5) $ git add ... (6) $ git diff --cached (7) $ git commit ... (8)-
Primero, restablece el historial una confirmación hacia atrás para eliminar la confirmación original, pero dejando el árbol de trabajo con todos sus cambios.
-Nasegura que cualquier fichero nuevo agregado conHEADquede marcado para quegitadd-plos encuentre. -
Después, interactivamente seleccionamos los pedazos de diferencia a agregar usando la prestación
gitadd-p. Esto te preguntará en secuencia por cada pedazo de diferencia y podrás simplemente usar instrucciones como "si, incluirlo", "no incluirlo" o la muy poderosa "editar". -
Una vez satisfecho con los pedazos que quieres incluir, deberías verificar lo que se ha preparado para la primer confirmación usando
gitdiff--cached. Esto muestra todos los cambios que se han movido al índice y serán confirmados. -
Lo siguiente, confirmar los cambios almacenados en el índice. La opción
-cespecifica pre-llenar el mensaje de confirmación a partir del mensaje original que iniciaste en la primer confirmación. Esto ayuda a evitar volver a teclearlo.HEAD@{1}es una notación especial para referirse a la confirmación donde estabaHEADantes de la confirmación original restablecida (hace 1 cambio). Ver git-reflog[1] para mas detalles. También puedes usar cualquier otra referencia de confirmación válida. -
Puedes repetir los pasos 2 a 4 varias veces para despedazar el código original en cualquier número de confirmaciones.
-
Ahora que has dividido varios cambios en sus respectivas confirmaciones, puede que ya no uses el modo de parche de
gitadd, con tal de seleccionar los cambios sin confirmar restantes. -
Una vez mas, revisa que lo incluido es lo que quieres. También querrías verificar que git diff no muestre algún cambio remanente a ser confirmado después.
-
Y por último, crear la confirmación final.
-
DISCUSIÓN
Las tablas de abajo muestran lo que sucede al ejecutar:
git reset --option target
para restablecer HEAD a otra confirmación (target) con opciones diferentes dependiendo del estado de los ficheros.
En estas tablas, A, B, C y D son estados diferentes de un fichero. Por ejemplo, la primer línea de la primer tabla significa que si un fichero esta en estado A en el árbol de trabajo, en estado B en el índice, en estado C en HEAD y en estado D en target, entonces git reset --soft target dejará el fichero en el árbol de trabajo en estado A y en el índice en estado B. Restablece (es decir, mueve) HEAD (la punta de la rama actual, si no estas en una) a target (que tiene el fichero en estado D).
árbol índice HEAD target árbol índice HEAD
------------------------------------------------------
A B C D --soft A B D
--mixed A D D
--hard D D D
--merge (no permitido)
--keep (no permitido)
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
A B C C --soft A B C
--mixed A C C
--hard C C C
--merge (no permitido)
--keep A C C
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
B B C D --soft B B D
--mixed B D D
--hard D D D
--merge D D D
--keep (no permitido)
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
B B C C --soft B B C
--mixed B C C
--hard C C C
--merge C C C
--keep B C C
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
B C C D --soft B C D
--mixed B D D
--hard D D D
--merge (no permitido)
--keep (no permitido)
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
B C C C --soft B C C
--mixed B C C
--hard C C C
--merge B C C
--keep B C C
git reset --merge es para cuando se quiere restablecer de una fusión con conflictos. Cualquier operación de fusión garantiza que, antes de iniciar, el fichero del árbol de trabajo involucrado en la fusión no tenga un cambio local con respecto al índice, y que escriba el resultado en el árbol de trabajo. Así que si vemos algunas diferencias entre el índice y target y también entre el índice y el árbol de trabajo, eso significa que no estamos restableciendo desde un estado que quedó de una operación de fusión fallida por un conflicto. Es por ello que no se permite la opción --merge en este caso.
git reset --keep es para cuando se eliminan algunas de las últimas confirmaciones en la rama actual mientras se mantienen los cambios en el árbol de trabajo. Si hubieran conflictos entre los cambios en la confirmación que queremos eliminar y los cambios en el árbol de trabajo que queremos mantener, no se permite restablecer. Es por eso que no se permite si hay cambios tanto entre el árbol de trabajo y HEAD como entre HEAD y target. Por seguridad, tampoco se permite cuando hay entradas sin fusionar.
Las tablas siguientes muestran lo que sucede cuando hay entradas sin fusionar:
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
X U A B --soft (no permitido)
--mixed X B B
--hard B B B
--merge B B B
--keep (no permitido)
árbol índice HEAD target árbol índice HEAD
----------------------------------------------------
X U A A --soft (no permitido)
--mixed X A A
--hard A A A
--merge A A A
--keep (no permitido)
X significa cualquier estado y U significa un índice sin fusionar.
GIT
Parte de la suite de git[1]