¿Cómo puedo mover HEAD a una ubicación anterior? (Cabeza separada) y Deshacer confirmaciones

Resuelto timpone asked hace 8 años • 8 respuestas

En Git, estaba intentando hacer squash commitfusionándome en otra rama y luego restableciendo HEADal lugar anterior a través de:

git reset origin/master

Pero necesito salir de esto. ¿Cómo puedo mover HEAD a la ubicación anterior?

Tengo el fragmento SHA-1 ( 23b6772) de la confirmación al que necesito moverlo. ¿Cómo puedo volver a este compromiso?

timpone avatar Dec 30 '15 04:12 timpone
Aceptado

Antes de responder, agreguemos algunos antecedentes, explicando qué HEADes esto.

First of all what is HEAD?

HEADes simplemente una referencia a la confirmación actual (más reciente) en la rama actual.
Sólo puede haber uno HEADen un momento dado (excluyendo git worktree).

El contenido de HEADse almacena en su interior .git/HEADy contiene los 40 bytes SHA-1 de la confirmación actual.


detached HEAD

Si no está en la última confirmación, lo que significa que HEADapunta a una confirmación anterior en el historial, se llama detached HEAD.

Ingrese la descripción de la imagen aquí

En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama, ya que HEADno apunta a la punta de la rama actual:

Ingrese la descripción de la imagen aquí

Ingrese la descripción de la imagen aquí


Algunas opciones sobre cómo recuperarse de un HEAD desprendido:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to go back

Esto verificará la nueva rama que apunta a la confirmación deseada.
Este comando realizará el pago a una confirmación determinada.
En este punto, puede crear una rama y comenzar a trabajar a partir de este momento.

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Siempre puedes usar el reflogtambién.
git reflog mostrará cualquier cambio que haya actualizado HEADy al verificar la entrada de reflog deseada se restablecerá HEADesta confirmación.

Cada vez que se modifique el HEAD habrá una nueva entrada en elreflog

git reflog
git checkout HEAD@{...}

Esto lo llevará de regreso al compromiso deseado.

Ingrese la descripción de la imagen aquí


git reset --hard <commit_id>

"Mueva" su HEAD nuevamente al compromiso deseado.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Nota: ( Desde Git 2.7 ) también puedes usar git rebase --no-autostash.

ingrese la descripción de la imagen aquí


git revert <sha-1>

"Deshacer" el compromiso o rango de compromiso dado.
El comando de reversión "deshará" cualquier cambio realizado en la confirmación dada.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Este esquema ilustra qué comando hace qué.
Como puedes ver allí, reset && checkoutmodifica el HEAD.

Ingrese la descripción de la imagen aquí

CodeWizard avatar Dec 29 '2015 21:12 CodeWizard

Primero reseta nivel local:

git reset 23b6772

Para ver si estás en la posición correcta, verifica con:

git status

Verás algo como:

En la rama maestra Su rama está detrás de 'origen/maestro' por 17 confirmaciones y se puede avanzar rápidamente.

Luego, reescribe el historial en tu sucursal de seguimiento remoto para reflejar el cambio:

git push --force-with-lease // a useful command @oktober mentions in comments

Usar --force-with-leaseen lugar de --forcegenerará un error si otros se han comprometido mientras tanto con la rama remota, en cuyo caso debes buscar primero. Más información en este artículo .

amuliar avatar Oct 10 '2018 13:10 amuliar