Git, ¿Cómo restablecer el origen / maestro a una confirmación?

245

Restablezco mi maestro local a una confirmación mediante este comando:

git reset --hard e3f1e37

cuando ingreso el $ git statuscomando, la terminal dice:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Como también quiero restablecer el origen / encabezado, pago al origen / maestro:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

y restablecer el encabezado con este comando:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Luego intenté agregar commit a origin / header que no tuve éxito.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Finalmente, pago con mi maestro local.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Desde entonces, reinicio el jefe de origen / maestro, espero que local y origen deben estar en la misma dirección, pero como ves, git dice que mi local / maestro está detrás de origen / maestro en 7 confirmaciones.

¿Cómo puedo solucionar este problema? Lo que estoy buscando es Jefe de punto local / maestro y origen / maestro para el mismo compromiso. La siguiente imagen muestra lo que hice. Gracias.

ingrese la descripción de la imagen aquí

Hesam
fuente
En primer lugar, asegúrese de poder forzar el código de inserción a una rama protegida en su proyecto, de lo contrario no podrá ...
DarmVillegas

Respuestas:

563

origin/xxxlas ramas siempre apuntan a un control remoto. No puede verificarlos, ya que no apuntan a su repositorio local (solo verifica el commit. Es por eso que no verá el nombre escrito en el marcador de rama de la interfaz de línea de comando, solo el hash de commit).

Lo que debe hacer para actualizar el control remoto es forzar el empuje de sus cambios locales para dominar:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master
Simon Boudrias
fuente
99
eso hace la operación solicitada, pero tenga en cuenta que hará infelices a las personas que ya retiraron los commits del master.
mnagel
Seguí estos pasos y retrocedió. Pero el origen / HEAD ahora está apuntando a una rama que no sea master. ¿Qué puedo hacer para arreglar esto?
Daniil Shevelev
1
No debes preocuparte por el origen / CABEZA, simplemente empuja la buena referencia al origen / referencia
Simon Boudrias
De acuerdo, tuve que hacer esto hoy después de fusionar accidentalmente las ramas equivocadas y luego empujar al origen. Funciona bien, pero podría ser muy perjudicial si otras personas han estado revisando las ramas afectadas desde su origen. Usar con precaución.
Nick W.
1
No funciona remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
52

La solución encontrada aquí nos ayudó a actualizar el maestro a una confirmación anterior que ya se había enviado:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

La diferencia clave de la respuesta aceptada es el hash de confirmación "e3f1e37:" antes del maestro en el comando push.

jkovacs
fuente
1
No funciona:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
@ m0skit0 como dice el mensaje you should pull first:)
intuitivopixel
La respuesta a esto está en stackoverflow.com/a/10544328/1019307 , git config receive.denynonfastforwards falsepero en realidad lo configuré manualmente en mi repositorio local de git /opt/gitque tengo creado para jugar con las ideas aquí. No estoy seguro de cómo o si puede hacer esto para bitbucket, github, etc. Y @intuitivepixel no tiene sentido, ya que revierte lo que estaba tratando de lograr con el restablecimiento completo.
HankCa
Hola @jkovacs, no quiero que se eliminen nuevos cambios en el maestro. Solo quiero enviar ese hash de confirmación "e3f1e37" al maestro de origen. ¿Es posible omitiendo el segundo comando git reset --hard "e3f1e37"?
KarenAnne
Hola @jkovacs, acabo de confirmar que puedo omitir el segundo paso. :)
KarenAnne
2

Suponiendo que su rama se llama mastertanto aquí como remotamente, y que su control remoto se llama origin, puede hacer lo siguiente:

git reset --hard <commit-hash>
git push -f origin master

Sin embargo, debe evitar hacer esto si alguien más está trabajando con su repositorio remoto y ha retirado sus cambios. En ese caso, sería mejor revertir las confirmaciones que no desea y luego presionar de manera normal.

Mahmoud Zaher
fuente
1

Como tuve una situación similar, pensé en compartir mi situación y cómo me ayudaron estas respuestas (gracias a todos).

Así que decidí trabajar localmente modificando mi último commit cada vez que quería guardar mi progreso en la rama principal (lo sé, debería haberme ramificado, haberme comprometido con eso, seguir presionando y luego volver a fusionarme con el master).

Una tarde en la noche, con miedo paranoico de perder mi progreso a una falla de hardware o algo fuera del éter, decidí empujar al maestro a su origen. Más tarde, seguí modificando mi rama maestra local y cuando decidí que era hora de presionar nuevamente, me enfrenté a diferentes ramas maestras y descubrí que no puedo modificar el origen / upstream ( ¡duh! ) Como puedo hacerlo con las ramas de desarrollo local.

Así que no compré el master localmente porque ya estaba después de un commit. El Maestro no ha cambiado. Ni siquiera tuve que reiniciar, duro, mi confirmación actual estaba bien.

Simplemente forcé el empuje al origen, sin siquiera especificar qué compromiso quería forzar en el maestro, ya que en este caso es lo que sea HEAD. Comprobado git diff master..origin/masterpara que no haya diferencias y eso es todo. Todo arreglado. ¡Gracias! (Lo sé, soy un novato git, ¡por favor perdona!).

Entonces, si ya está bien con su rama maestra localmente, solo:

git push --force origin master
git diff master..origin/master
Paul-Sebastian Manole
fuente