Siento que esta pregunta se ha hecho muchas veces, pero la solución suele ser "Eliminé el directorio y volví a hacer mi trabajo con una nueva compra". Hice una confirmación y empuje, pero me di cuenta de que me refería al número de ticket incorrecto en el mensaje de confirmación. Así que busqué en SO una solución rápida y terminé escribiendo lo siguiente en la terminal:
$ git reset --soft HEAD^
$ git commit -m "... correct message ..."
El único problema es que recibo el siguiente mensaje de error:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Estoy usando el modelo git-flow y estoy trabajando en la rama de desarrollo. ¿Cómo puedo volver a fusionar las cosas para hacer feliz a git de nuevo?
git
version-control
rynmrtn
fuente
fuente
Respuestas:
Fuerza
git push
:fuente
receive.denyNonFastForwards
en la respuesta de Brian Campbell :+
o--force
puede que no sea lo suficientemente contundente, dependiendo de cómo ellos, sean quienes sean, han configurado su repositorio de Git.Si se presiona una confirmación al servidor, y luego volver a escribir que se comprometen a nivel local (con
git reset
,git rebase
,git filter-branch
, o cualquier otra manipulación de la historia), y luego empujados que reescrita cometen una copia de seguridad en el servidor, se le arruinar cualquier otra persona que se había detenido. He aquí un ejemplo; digamos que ha comprometido A y lo ha enviado al servidor.Ahora decides reescribir A, de la forma que mencionaste, reiniciando y volviendo a confirmar. Tenga en cuenta que esto deja una confirmación pendiente, A, que eventualmente será recolectada como basura ya que no es accesible.
Si alguien más, digamos Fred, se retira
master
del servidor mientras haces esto, tendrá una referencia a A, desde la cual podría comenzar a trabajar:Ahora bien, si pudiera empujar su A 'al origen / maestro, lo que crearía un avance no rápido, no tendría A en su historial. Entonces, si Fred intentara tirar nuevamente, de repente tendría que fusionarse y volvería a presentar el compromiso A:
Si Fred se da cuenta de esto, entonces podría hacer un cambio de base, lo que evitaría que la confirmación A reapareciera nuevamente. Pero tendría que darse cuenta de esto y recordar hacer esto; y si tiene más de una persona que derribó A, todos tendrían que volver a basarse para evitar que el compromiso A adicional en el árbol.
Por lo tanto, generalmente no es una buena idea cambiar el historial en un repositorio del que otras personas obtienen. Sin embargo, si sabe que nadie más está extrayendo de ese repositorio (por ejemplo, es su propio repositorio privado, o solo tiene otro desarrollador trabajando en el proyecto con el que puede coordinarse fácilmente), entonces puede forzarlo actualizar ejecutando:
o
Ambos ignorarán la verificación de un empuje que no es de avance rápido y actualizarán lo que hay en el servidor a su nueva revisión A ', abandonando la revisión A para que eventualmente se recolecte basura.
Es posible que los empujes forzados estén completamente deshabilitados con la
receive.denyNonFastForwards
opción de configuración. Esta opción está habilitada de forma predeterminada en los repositorios compartidos. En ese caso, si realmente desea forzar un envío, la mejor opción es eliminar la rama y volver a crearla congit push origin :master; git push origin master:master
. Sin embargo, ladenyNonFastForwards
opción está habilitada por un motivo, que se describe anteriormente; en un repositorio compartido, significa que ahora todos los que lo utilizan deben asegurarse de volver a basarse en el nuevo historial.En un repositorio compartido, generalmente es mejor colocar nuevas confirmaciones en la parte superior que solucionen cualquier problema que tenga; puede usar
git revert
para generar confirmaciones que deshacerán los cambios de confirmaciones anteriores.fuente
+develop
su comando, por lo que el cheque es para él. Tienes una cantidad astronómica de puntos de todos modos: Pgit push --force
receive.denyNonFastForwards
opción de configuración. Esta opción está habilitada de forma predeterminada en los repositorios compartidos. En ese caso, si realmente desea forzar una inserción, la mejor opción es eliminar la rama y volver a crearla congit push origin :remote_A; git push origin local_A:remote_A
. Pero lea lo que escribí anteriormente sobre por qué es una mala idea hacer este tipo de flujo de trabajo en un repositorio compartido. Debe intentar hacer esto solo si tiene algo que cause problemas graves en la confirmación que está tratando de eliminar o reescribir.Es posible que tenga que hacer un
git pull
, que PUEDE fusionar automáticamente las cosas por usted. Entonces puedes comprometerte de nuevo. Si tiene conflictos, le pedirá que los resuelva.Tenga en cuenta que debe especificar de qué rama extraer si no ha actualizado su gitconfig para especificar ...
Por ejemplo:
fuente
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Estaba usando EGit y también enfrenté este problema. Intenté con
rebase
la rama actual y funcionó.fuente