Aunque mi respuesta está más allá de lo que están pidiendo, Creo que en realidad es lo que pretendes hacer.
Has utilizado git reset --soft HEAD^
para deshacer el compromiso que has realizado. Esto devuelve la copia de trabajo al estado anterior a su compromiso (ya HEAD
puntos a sus cometer actual, y HEAD^
puntos a la anterior (suponiendo que no hay más que uno de los padres).
Pero ahora cuando git push
le dicen algo como:
! [rejected] <branch> -> <branch>e (non-fast-forward)
error: failed to push some refs to 'ssh://<remote server>/<remote path>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Esto es decir que las confirmaciones no se alinean y es allí para evitar que se cometa un error El mensaje de error es un poco engañoso y no quiere hacer lo que sugiere. (un tirón para sincronizar su rama). Solo puede saber NO hacer esto debido a sus intenciones.
Simplemente puede evitar esto con un --force
(o -f
) (*):
git push --force
Es posible que necesite ajustar la corriente arriba de nuevo:
git push --force --set-upstream origin <branch>
Tenga en cuenta que esto tendrá consecuencias si otros ya han retirado su trabajo, ya que habrá diferentes compromisos que harán los mismos cambios (posiblemente). Ver https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history.
Para evitar cualquier problema, sólo alguna vez hacerlo empuja a sus ramas (no una rama común - por ejemplo, la rama development
los desarrolladores se fusionan todas sus ramas de característica en los) y asegúrese de tener una comunicación abierta en su equipo.
Un desarrollador podría normalmente utilizar este modelo para lo que llamo viernes por la tarde se compromete en la que desea guardar su trabajo antes del fin de semana en caso de fallo de hardware (pero volver a la pre-commit estado el lunes) .
*Friday*
git add --all # To add all files whether they are tracked or not
git commit -m "Friday afternoon commit"
git --set-upstream push # --set-upstream is for if the branch doesn't exist on the remote server
*Monday*
git reset --soft HEAD^
git push -f --set-upstream origin <branch>
La ventaja de hacerlo de esta manera, en comparación con un git revert
discutido en otra respuesta, es evitar confirmaciones adicionales. El restablecimiento tendrá 2 commits y de esta manera no tendrá ninguno (no hay más). La ventaja de git reset
es que NO reescribirá el historial, por lo que es mucho más seguro, especialmente si no está seguro de lo que está haciendo.
(*) Normalmente, los repositorios están configurados para NO permitirte hacer esto para dominar: arregla una rama y crea una solicitud de extracción. Si ha leído el enlace anterior, reescribir el historial en el maestro tendrá consecuencias GRAVES (a menos que sea la única persona que haya clonado ese código).
Gracias, eso tiene sentido, aunque esto probablemente hubiera sido mejor como comentario ya que realmente no soluciona mi problema. Gracias sin embargo. –