Eliminar la última confirmación en bitbucket

103

Cometí un error y no sé cómo eliminar mi último empuje en el repositorio. Extraigo las últimas actualizaciones de la aplicación, pero tiene conflictos y las envío al repositorio.

¿Cómo borrar mi última confirmación? O como arreglarlo.

Catalina
fuente

Respuestas:

102

En primer lugar, si está trabajando con otras personas en el mismo repositorio de código, no debe eliminar una confirmación, ya que cuando fuerza la actualización en el repositorio, dejará los repositorios locales de sus compañeros de trabajo en un estado ilegal (por ejemplo, si hizo confirmaciones después de la que eliminó, esas confirmaciones no serán válidas ya que se basaron en una confirmación ahora inexistente).

Dicho esto, lo que puedes hacer es revertir el compromiso. Este procedimiento se realiza de manera diferente (diferentes comandos) según el CVS que esté utilizando:

En git :

git revert <commit>

Sobre mercurial :

hg backout <REV>

EDITAR: La operación de reversión crea una nueva confirmación que hace lo contrario que la confirmación revertida (por ejemplo, si la confirmación original agregó una línea, la confirmación de reversión elimina esa línea), eliminando efectivamente los cambios de la confirmación no deseada sin reescribir el historial del repositorio.

asermax
fuente
Gracias por la información. Y sé la consecuencia si elimino la confirmación, simplemente no sé cómo deshacer mi acción porque es la primera vez que tengo un error. Necesito deshacer mi confirmación porque el sistema ya está activo. Solo somos dos los que estamos trabajando con ese repositorio.
Catherine
git backout <REV>? O: hg backout <REV>?
Armando Pérez Marqués
Pero, ¿qué pasa si las confirmaciones agregadas después de la que se va a revertir han realizado modificaciones en la línea que se está eliminando?
rahs
@RahulSaha, dado que lo que estás haciendo es básicamente intentar fusionar una confirmación en la rama, estoy bastante seguro de que te dará un conflicto de fusión que tendrás que resolver.
asermax
98

Si está no trabajar con otros (o está feliz de hacer que la molestia significativa) , entonces es posible eliminar confirmaciones de las ramas Bitbucket.

Si está intentando cambiar una rama no maestra:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

si está intentando cambiar la rama maestra

En git generalmente, la rama maestra no es especial, es solo una convención. Sin embargo, bitbucket y github y sitios similares generalmente requieren que haya una rama principal (presumiblemente porque es más fácil que escribir más código para manejar el evento de que un repositorio no tiene ramas, no estoy seguro). Por lo tanto, debe crear una nueva rama y convertirla en la rama principal:

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

En Bitbucket, vaya a la configuración del repositorio y cambie la "Rama principal" a master_temp(en Github, cambie la "Rama predeterminada").

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

Ahora vaya a Bitbucket y debería ver el historial que desea. Ahora puede ir a la página de configuración y volver a cambiar la rama principal master.

Este proceso también funcionará con cualquier otro cambio de historial (p git filter-branch. Ej .). Solo debe asegurarse de restablecer las confirmaciones adecuadas, antes de que el nuevo historial se separe del anterior.

editar : aparentemente, no necesita ir a todo este lío en github, ya que puede forzar una rama de reinicio .

Tratar con colaboradores molestos

La próxima vez que alguien intente extraer de su repositorio (si ya ha obtenido la confirmación incorrecta), la extracción fallará. Tendrán que restablecer manualmente a una confirmación antes del historial cambiado y luego volver a tirar.

git reset HEAD^
git pull

Si han sacado el compromiso incorrecto y se han comprometido sobre él , entonces tendrán que reiniciar, y luego git cherry-picklos compromisos buenos que quieren crear, recreando efectivamente toda la rama sin el compromiso incorrecto.

Si nunca realizaron la mala confirmación, entonces todo este proceso no los afectará y podrán hacerlo con normalidad.

nada101
fuente
1
Para aquellos que se sienten más cómodos con el uso de SourceTree: 1) Para cambiar la rama principal en la interfaz de usuario web de BitBucket, mire la Configuración de repositorio. 2) Para eliminar una rama en la interfaz de usuario web, busque en la página Ramas. 3) Restablezca el repositorio local como se indicó anteriormente. 4) Empuje sus cambios locales hacia arriba para recrear esas ramas.
Richard Le Mesurier
2
Como alguien que accidentalmente empujó un secreto, aprecié mucho la minuciosidad de esta respuesta. ¡Gracias!
Torque
48

puede restablecerlo para HEAD^luego forzarlo.

git reset HEAD^
git push -u origin master --force

Eliminará su última confirmación y se reflejará en bitbucket como confirmación eliminada, pero permanecerá en su servidor.

Shubanker
fuente
Github permitirá esto, pero al momento de escribir este artículo, Bitbucket no permite empujes forzados.
JamesQMurphy
4
en realidad, bitbucket admite empujes forzados, solo el diferencial, en lugar de eliminar por completo las confirmaciones sin seguimiento, las marca como eliminadas.
Shubanker
La forma recomendada de bitbucket es usar revertir. Pero creo que en mi caso esto es más apropiado. Ya que soy el único que lo usa, y se siente más limpio que usar revert. Gracias.
Nafsaka
1
Sí, esto todavía funciona en Bitbucket. ¡Me acabas de salvar a lo grande! Hice un compromiso / empuje desde mi Eclipse y me mezclé con otro proyecto que tenía. En parte debido a una mala práctica de mi parte al usar la línea de comandos y el eclipse incorporado para trabajar en git.
DarkCygnus
brillante, o más fácil: restablecer la rama actual a esta confirmación, luego usar ese empuje forzado al servidor para solucionar mi problema
Anthony Kal
3

He tenido problemas con git revert en el pasado (principalmente porque no estoy muy seguro de cómo funciona). He tenido problemas para revertir debido a problemas de fusión.

Mi solución simple es esta.

Paso 1.

 git clone <your repos URL> .

su proyecto en otra carpeta, luego:

Paso 2.

git reset --hard <the commit you wanna go to>

luego paso 3.

en su último (y principal) directorio de proyecto (el que tiene la última confirmación problemática) pegue los archivos del paso 2

Paso 4.

git commit -m "Fixing the previous messy commit" 

Paso 5.

Disfrutar

SudoPlz
fuente
1
Cortar y pegar es realmente complicado. Además, esto no resolvería el problema de la pregunta.
Daniel Lee
1
git revertes simple: crea una nueva confirmación que hace lo contrario de los cambios en una confirmación anterior (o varias confirmaciones). No elimina confirmaciones, por lo que no es relevante para esta pregunta. Además, el paso de clonación aquí no es realmente necesario.
naught101
1
Git revert es el mecanismo igual al anterior.
Nafsaka,
3

A continuación, se muestra un enfoque simple en hasta 4 pasos:

0 - Avisa al equipo que vas a arreglar el repositorio

Conéctese con el equipo y hágales saber los próximos cambios.

1 - Eliminar la última confirmación

Suponiendo que su rama objetivo es master:

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

En este punto, ha terminado si trabaja solo.

2 - Arregle los repositorios locales de su compañero de equipo

En el de tu compañero de equipo:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

Si su compañero de equipo no tuvo nuevas confirmaciones, ya ha terminado y debería estar sincronizado.

3 - Recuperación de confirmaciones perdidas

Digamos que un compañero de equipo tenía un compromiso nuevo y no publicado que se perdió en este proceso.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

Haga esto para tantas confirmaciones como sea necesario.

He utilizado con éxito este enfoque muchas veces. Requiere un esfuerzo de equipo para asegurarse de que todo esté sincronizado.

rbento
fuente
2

Como han dicho otros, normalmente desea utilizar hg backouto git revert. Sin embargo, a veces realmente desea deshacerse de una confirmación.

Primero, querrá ir a la configuración de su repositorio. Haga clic en el Strip commitsenlace.

Strip confirma el enlace en la configuración de bitbucket

Ingrese el ID del conjunto de cambios para el conjunto de cambios que desea destruir y haga clic en Preview strip. Eso le permitirá ver qué tipo de daño está a punto de hacer antes de hacerlo. Luego, simplemente haga clic Confirmy su confirmación ya no será un historial. Asegúrese de decirles a todos sus colaboradores lo que ha hecho, para que no rechacen accidentalmente el compromiso ofensivo.

nmichaels
fuente
¿Qué versión es esa y qué permisos se requieren? Se ve diferente en la v6.4.3 que estoy viendo, y este elemento no está allí. Yo soy administrador de repositorio.
Raphael
1

Una vez que se hayan confirmado los cambios, no se podrán eliminar. porque la naturaleza básica de commit es no borrar.

Lo que puede hacer (método fácil y seguro),

Rebase interactiva:

1) git rebase -i HEAD~2 # mostrará tus 2 confirmaciones recientes

2) Su confirmación aparecerá como, Reciente aparecerá en la parte inferior de la página LILO (último en Último en salir)

ingrese la descripción de la imagen aquí

Eliminar la última fila de confirmación por completo

3) guárdalo por ctrl+XoESC:wq

ahora tu rama se actualizará sin tu última confirmación.

Mohideen bin Mohammed
fuente
1

Puede escribir el comando también para Bitbucket como lo menciona Dustin :

git push -f origin HEAD^:master

Nota: en lugar de master puedes usar cualquier rama. Y elimina simplemente presione Bitbucket.

Para eliminar la última confirmación localmente en git use:

git reset --hard HEAD~1
invzbl3
fuente
0

Por ahora, la nube bitbucket (no estoy seguro de qué versión) permite revertir una confirmación del sistema de archivos de la siguiente manera (no veo cómo revertir desde la interfaz de Bitbucket en el navegador Chrome).

-Haga una copia de seguridad de todo su directorio para proteger los cambios que cometió inadvertidamente

-seleccionar directorio extraído

-botón derecho del ratón: menú de tortuga git

-repo-browser (la opción de menú 'revertir' solo deshace los cambios no confirmados)

-presiona el botón HEAD

-selecciona la línea superior (la última confirmación)

-botón derecho del mouse: revertir el cambio mediante esta confirmación

-después de deshacer los cambios en el sistema de archivos, presione confirmar

-esto actualiza GIT con un mensaje 'Revertir (su mensaje anterior). Esto revierte el compromiso de fulano de tal '

-seleccione 'confirmar y empujar'.

smriti
fuente