¿Quieres cambiar mi maestro a una confirmación anterior, cómo puedo hacer esto?

92

Quiero retroceder a una confirmación anterior, luego publicar ese código y luego volver a la última confirmación.

es decir, mi maestro está apuntando a una versión de confirmación anterior solo para que pueda pulir esa versión, luego quiero volver a la última confirmación que tenía inicialmente.

¿Cómo puedo hacer esto?

Blankman
fuente

Respuestas:

100

Si desea hacer esto y revertir el maestro a la confirmación anterior:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

Alternativamente:

git reset --hard master~1        # Reset current branch to one commit ago on master
Tyler Brock
fuente
1
Así que un año después estoy mirando esto y pienso que es una forma terrible de hacerlo. Bueno, al menos es algo fácil de entender.
Tyler Brock
1
sí, es por eso que voté a favor, fácil de entender, ¿tal vez debería haber presentado un enlace a una mejor manera?
Andrew Atkinson
1
Tuve que hacer lo mismo usando SourceTree. El proceso es similar. 1) cree una nueva rama para el estado maestro actual, para que no pierda nada. 2) eliminar master 3) crear una nueva rama master, seleccionando la confirmación deseada
Danilo Gomes
¿Qué sucede con la confirmación que "eliminamos" del maestro después de esto?
Arthur Colombini Gusmão
1
Esto debe evitarse si tiene un repositorio remoto. Causa algunos errores si lo hace, porque la dirección del primer maestro difiere del nuevo maestro que creó recientemente.
MAChitgarha
60

Tu pregunta no está clara. Creo que lo que estás pidiendo es esto:

git push -f origin $old_commit_id:master

¿Qué hará esto? Impulsará el $old_commit_idcompromiso de origincomo el nuevo jefe de originla masterrama de.

Si eso es lo que desea, no necesita tocar su mastersucursal local en absoluto.

Aristóteles Pagaltzis
fuente
Esto me causó un master (non-fast-forward)fracaso. La solución @jtdubs funcionó.
Bobby Norton
3
Simplemente pase -fpara forzarlo, aunque el repositorio remoto puede estar configurado para prohibirlo. Actualicé la respuesta.
Aristóteles Pagaltzis
no funciona para mí, aunque la respuesta aceptada sí funciona
MobileMon
No dijiste exactamente lo que querías o por qué no funcionó, así que no puedo decirte por qué no funcionó y cómo se pudo haber hecho (si hubiera podido).
Aristóteles Pagaltzis
Parece que pierdes la historia pasada a distancia con este enfoque, estuvo bien para mí. Solo llamándolo.
Shawn
43

utilizar git reset --hard <old commit number>

restablecerá el HEAD a esta confirmación anterior.

Además, también debe usar git push -f originpara modificar el repositorio remoto.

KawaiKx
fuente
34

Si desea evitar el empuje forzado, aquí le mostramos cómo revertir su repositorio a una confirmación anterior y preservar todo el trabajo intermedio:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

¡Hecho! Reemplace 307a5cd con cualquier confirmación que desee en su repositorio.

(Sé que las dos primeras líneas se pueden combinar, pero creo que eso deja menos claro lo que está pasando)

Aquí está gráficamente:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

Elimina efectivamente c3 y c4 y vuelve a establecer su proyecto en c2. Sin embargo, c3 y c4 todavía están disponibles en el historial de tu proyecto si alguna vez quieres volver a verlos.

Bronson
fuente
1
¡Esto funcionó sin problemas! Si ha llegado hasta aquí y está leyendo esto, esta parece ser la forma más limpia de revertir al maestro a un compromiso más profundo.
ddisqq
No encuentro las palabras para explicar cuánto te amo por esto, estoy más allá de las palabras agradecido por haber podido arreglar algo que me tuvo molestado por 6 horas y me causó tanto dolor de cabeza. ¡¡¡¡¡¡¡Gracias Señor!!!!!!!
Kostas Tsakalidis
9

Suponiendo un gráfico de confirmación como este:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

Primero desea pagar mastery crear una sucursal que apunte a donde masterse encuentra actualmente:

git checkout master
git branch pointer master

Debería verse así ahora:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

Ahora que ya estas en master , le diremos a la masterrama que retroceda una confirmación:

git reset master~1

Ahora, master debería retroceder un espacio, pero la pointerrama todavía está en la confirmación más reciente:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

En este punto, puede presionar mastera un control remoto, o donde quiera, luego avanzar rápido fusionarlo de nuevo alpointer rama. Puedes matar la pointerrama en ese punto:

git push origin master
git merge --ff-only pointer
git branch -D pointer

Final:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)
C0M37
fuente
1
Si el origen / maestro está en C, git push origin masterfallará con la punta de su rama actual detrás de su contraparte remota . También debe pasar una bandera -f.
sassospicco
8

Puede simplemente git checkout <commit-id>hacer lo que sea necesario y luego git checkout mastervolver al nuevo código.

Si realmente necesita modificar el código anterior para publicarlo, probablemente debería:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

Además, no puedo recomendar git flow lo suficiente. Hace todo esto bastante fácil.

jtdubs
fuente
1

Para pasar a una versión anterior:

git checkout <version hash>

haz tu trabajo aquí y comprométete con

git commit --amend

Para volver al maestro :

git checkout master

Pablo fernandez
fuente
1
Eso no funcionará. git reset --hardapuntó su rama maestra de nuevo a la confirmación anterior, por git checkout masterlo que no hará nada.
jtdubs
Es cierto, gracias por la corrección. +1 para ti, también eliminaría mi respuesta, pero creo que el commit --amendpaso es lo suficientemente útil
Pablo Fernandez
¿Qué es --amend?
Shafizadeh