HOWTO · Git

Cómo mover el puntero de una rama de Git a un commit diferente

Mueva una rama de Git que está activa (checked out) con git reset, u otra rama no activa con git branch -f o git update-ref. Conozca qué cambia cada comando y cómo elegir un commit de destino.

En esta página

Para mover el puntero de una rama de Git a un commit elegido, use git reset cuando la rama está activa (checked out). Para mover una rama diferente mientras permanece en su rama actual, use git branch -f o git update-ref. git branch -f se niega a mover una rama que esté activa en cualquier árbol de trabajo. git update-ref actualiza la referencia directamente sin actualizar el índice ni el árbol de trabajo; usarlo en una rama activa puede dejar esos archivos en el commit anterior mientras HEAD apunta al nuevo. Reemplace <target-commit> a continuación por un hash de commit, una etiqueta u otra expresión de revisión que identifique el commit que desea.

Mover la rama activa a un commit con git reset

git reset mueve la rama actual al commit seleccionado. Elija su modo según lo que deba suceder con el índice y el árbol de trabajo. Un reinicio suave (soft) mueve la rama y deja ambos como están. El modo mixto (mixed) predeterminado mueve la rama y actualiza el índice, dejando los archivos del árbol de trabajo como están. Un reinicio duro (hard) mueve la rama y hace que el índice y los archivos rastreados del árbol de trabajo coincidan con el commit de destino.

Antes de usar git reset --hard, guarde cualquier cambio rastreado que necesite: este comando puede descartar cambios no confirmados en archivos rastreados. Los archivos no rastreados generalmente se dejan intactos, pero Git puede eliminarlos o sobrescribirlos cuando obstruyen la escritura de rutas rastreadas desde el commit de destino. El siguiente ejemplo independiente crea un repositorio temporal, hace dos commits en main y mueve la rama activa de vuelta al primer commit:

set -eu
repo_dir=$(mktemp -d)
trap 'rm -rf "$repo_dir"' EXIT
cd "$repo_dir"
git init -q -b main
git config user.name Example
git config user.email example@example.com
printf 'first version\n' > note.txt
git add note.txt
git commit -q -m first
first_commit=$(git rev-parse HEAD)
printf 'second version\n' > note.txt
git commit -q -am second
git reset --hard "$first_commit" >/dev/null
printf 'Branch: %s\n' "$(git branch --show-current)"
printf 'Commit: %s\n' "$(git log -1 --format=%s)"
Branch: main
Commit: first

Use una revisión como HEAD~1 o un hash de commit como destino al aplicar el comando en su propio repositorio. Si necesita conservar cambios locales rastreados, considere git reset --soft <target-commit> o git reset --mixed <target-commit> y revise el índice y el árbol de trabajo resultantes antes de confirmar. Un reinicio cambia solo la rama actual; no mueve directamente otro nombre de rama.

Mover una rama diferente y no activa a un commit

Para mover una rama distinta de la activa, mantenga la rama de destino sin activar en el árbol de trabajo actual. git branch -f mueve forzosamente la referencia de la rama indicada al commit seleccionado. Por ejemplo, git branch -f feature <target-commit> mueve feature a ese commit. Confirme el nombre de la rama y el destino antes de usar -f, ya que reemplaza deliberadamente la punta actual de la rama. Se negará a mover una rama activa en un árbol de trabajo.

También puede actualizar la referencia de la rama directamente con git update-ref. Use el nombre completo de la referencia y una revisión que se resuelva al commit de destino: git update-ref -m "move feature to target" refs/heads/feature <target-commit>. La opción -m registra el mensaje proporcionado en el reflog, lo que ayuda a explicar más tarde por qué se movió la referencia. Para esta tarea, feature es una rama diferente y no activa, por lo que cualquiera de los dos comandos la mueve mientras su rama actual permanece activa. A diferencia de git branch -f, git update-ref no se niega ante una rama activa: cambia la referencia pero deja intactos el índice y los archivos del árbol de trabajo. Si actualiza la rama actual de este modo, HEAD se resuelve al nuevo commit mientras el índice y los archivos siguen reflejando el antiguo, por lo que pueden aparecer como modificados respecto al nuevo commit.

git checkout -b feature <target-commit> crea una rama nueva y la activa; no mueve una rama feature existente. Activar directamente un commit separa (detaches) HEAD. Rebase tiene otro propósito: reproduce commits sobre una nueva base y puede crear nuevos ID de commit, por lo que no es una forma directa de apuntar una rama existente a un commit arbitrario. Elija reset para la rama activa, o uno de los comandos de referencia anteriores para una rama diferente y no activa.