Acabo de aplastar algunos compromisos git rebase
e hice un git push --force
(que es malo, lo sé).
Ahora los otros ingenieros de software tienen una historia diferente y cuando lo hacen git pull
, Git se fusionará. ¿Hay alguna manera de arreglar esto, excepto hacer un rm my-repo; git clone [email protected]:my-repo.git
?
Necesito algo como lo contrario de git push --force
, pero git pull --force
no dio los resultados previstos.
git checkout master && git branch -D test && git checkout -b test origin/test
Respuestas:
Para recibir los nuevos commits
Reiniciar
Puede restablecer el commit para una sucursal local usando
git reset
.Para cambiar la confirmación de una sucursal local:
Sin embargo, tenga cuidado, como dice la documentación:
Si realmente desea conservar los cambios que tiene localmente,
--soft
reinicie en su lugar. Lo cual actualizará el historial de confirmación de la rama, pero no cambiará ningún archivo en el directorio de trabajo (y luego puede confirmarlo).Rebase
Puede reproducir sus confirmaciones locales sobre cualquier otra confirmación / ramificación utilizando
git rebase
:Esto invocará rebase en modo interactivo donde puede elegir cómo aplicar cada confirmación individual que no está en el historial sobre el que está rebase.
Si las confirmaciones que eliminó (con
git push -f
) ya se han incluido en el historial local, aparecerán como confirmaciones que se volverán a aplicar; tendrían que eliminarse como parte del rebase o simplemente se volverán a incluir en el historial para la sucursal y reaparecer en el historial remoto en el siguiente impulso.Use la ayuda
git command --help
para obtener más detalles y ejemplos sobre cualquiera de los comandos anteriores (u otros).fuente
git reset origin/otherbranch --hard
reset --hard
, o Opción 2:reset --soft
+rebase
, ¿verdad?git reset --soft origin/master
cambiará el historial de confirmación para que coincida con el control remoto y las diferencias de etapa con el control remoto que luego se confirmará . No habría necesidad de rebase en ese escenario (y se le impediría hacerlo debido a los cambios no confirmados) porque no hay diferencia en el historial de confirmación. Las dos opciones son restablecer o rebase, no una combinación de ambas. Haga una pregunta si su escenario es diferente al que he respondido aquí.Esto no solucionará las ramas que ya tienen el código que no desea en ellas (consulte a continuación para saber cómo hacerlo), pero si habían extraído alguna rama y ahora quieren que esté limpia (y no "por delante" de origen / alguna rama) entonces simplemente:
Nota: Puede combinar todos estos poniendo && entre ellos
Nota 2: Florian mencionó esto en un comentario, pero ¿quién lee los comentarios cuando busca respuestas?
Nota 3: Si tiene ramas contaminadas, puede crear otras nuevas a partir de la nueva "rama tonta" y simplemente se compromete.
Ex:
¡Ahora la nueva característica es su rama sin los compromisos adicionales (posiblemente malos)!
fuente
git checkout -b base-branch origin/base-branch
congit checkout --track origin/base-branch
Tire con rebase
Un pull regular es fetch + merge, pero lo que quieres es fetch + rebase. Esta es una opción con el
pull
comando:fuente