Respuestas:
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.
git backout <REV>
? O: hg backout <REV>
?
Si está no trabajar con otros (o está feliz de hacer que la molestia significativa) , entonces es posible eliminar confirmaciones de las ramas Bitbucket.
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
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 .
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-pick
los 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.
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.
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
git revert
es 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.
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.
Como han dicho otros, normalmente desea utilizar hg backout
o 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 commits
enlace.
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 Confirm
y 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.
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)
Eliminar la última fila de confirmación por completo
3) guárdalo por ctrl+X
oESC:wq
ahora tu rama se actualizará sin tu última confirmación.
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
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'.