2009-04-30 11 views
5

Tengo un repositorio de git local con el que me he comprometido recientemente, y luego lo he enviado a un repositorio compartido. Solo después de que lo empujé al repositorio compartido me di cuenta de que cometí un feo error. I modificado localmente ningún problema después me fijo mi fuente con:Modificación de un commit de Git en un repositorio compartido

git commit -C HEAD -a --amend 

Después de eso, he intentado otra git push origin y me sale el siguiente error:

! [rejected]  mybranch -> mybranch (non-fast forward) 

¿Cuál es la mejor manera de corregir esta ¿situación?

Respuesta

7

git no (de forma predeterminada) le permite empujar a una rama cualquier cosa que "rebobine" la punta de la rama. En otras palabras, si la cabecera de bifurcación actual no es un padre directo o antecesor de la sugerencia de bifurcación, se rechazará la inserción.

Puede intentar presionar de todos modos utilizando la opción -f en git push o usando un refspec con un '+' inicial, p. git push origin +mybranch:mybranch.

Por lo general, los repositorios remotos seguirán sin permitir que esto suceda, ya que corre el riesgo de perder confirmaciones si diferentes personas pueden insertar indiscriminadamente sugerencias de sucursales que no incluyen confirmaciones que no tienen localmente.

Puede anular este comportamiento cambiando el parámetro de configuración receive.denyNonFastForwards en el repositorio remoto (suponiendo que tiene el acceso appropraite al repositorio remoto).

Si no tiene dicho acceso, puede ser capaz de lograr esto al eliminar la rama remota y volver a crearla.

p. Ej.

git push origin :mybranch 
git push origin mybranch 

Tenga en cuenta que las versiones más recientes de Git incluyen un parámetro de configuración receive.denyDeletes que, si se establece, evitar que esto potencialmente peligroso solución de trabajo.

+0

Agradable, no sabía acerca de denyNonFastForwards: Supuse que necesitabas un gancho para hacer cumplir eso. – araqnid

5

Si quiere forzar el empuje, puede ... ehm ... pasar --force al push.

Sin embargo, generalmente se considera una mala forma para reescribir el historial en un repositorio público.

0

Suponiendo tu repositorio compartido permite, tal como prefijo del nombre de la sucursal con un signo más para forzar el empuje no avance rápido:

git push origin +mybranch 
2

En este caso es probablemente lo mejor sólo para hacer una segunda comprometerse con el fijar. Como ya ha alterado la primera confirmación original en su repositorio local, probablemente desee extraerla del repositorio compartido y mover HEAD para que la confirmación alterada pueda ser recolectada.

Cuestiones relacionadas