Cuando estoy trabajando en una rama de características, tiendo a querer limpiar los commits en la rama usando un rebase interactivo antes de que mi trabajo sea revisado e integrado en la rama principal.
Durante el desarrollo de la función, quiero llevar mi trabajo intermedio al repositorio remoto como una medida de respaldo. Es decir, cuando mi disco duro falla, no quiero que se pierda toda la rama de funciones.
Sin embargo, esto lleva al hecho de que a menudo tengo que hacerle una consulta git push --force
al repositorio remoto después de un rebase, una acción que generalmente está mal vista. O como dice la página de github vinculada:
Debido a que cambiar su historial de confirmación puede dificultar las cosas para todos los que usan el repositorio, se considera una mala práctica cambiar las confirmaciones cuando ya se ha presionado a un repositorio.
¿Existe una política (generalmente aceptada) que resuelva este conflicto?
¿Por qué esto no es un duplicado de Es tan esencial la git "Regla de Oro de Rebasar"?
Mi pregunta aquí pide una política para resolver el conflicto entre querer hacer una copia de seguridad de su trabajo en el repositorio remoto y cambiar su trabajo , mientras que la otra pregunta trata de negar que haya un conflicto y pregunta por qué algunas personas piensan que el conflicto existe. y por lo tanto pregunta por qué "es esencial" no impulsar rebases de fuerza?
Respuestas:
La pregunta clave que debe hacerse:
Si elimina su rama de funciones remotas después de fusionarse con master, ya está perdiendo el historial. Suponiendo que aplaste / rebase la rama antes de hacer su fusión / PR, perderá este historial. Todo lo que está haciendo su fuerza en este caso es permitirle usar github como respaldo.
La situación en la que desea mantener el historial y no forzar el empuje es si su rama remota persiste después de fusionarse y no solo existe por un período de tiempo temporal.
Parece que tienes varias personas empujando a esa rama simultáneamente. Esto significa que te importa el historial de la sucursal.
Lo que podría hacer en su lugar para su trabajo intermedio es crear una bifurcación de esa rama. Puede presionar para esto y luego volver a basar todas sus confirmaciones en una sola confirmación antes de fusionarlas, por lo que cuando las combina en su rama característica, solo tiene 1 confirmación (con el historial modificado de toda su rama).
fuente
featurebranch-local
) y luego hacer un desarrollo activo en esa rama, con tantos commits como desee. Una vez que desee fusionar, aplastar esas confirmaciones y luego fusionarlas en la función. Básicamente solo haciendo dev en una rama temporal real y luego aplastando / fusionando en su función.develop-feature
rama "privada" . Por supuesto, la privacidad es puramente por convención y no se aplica por nada, pero puede hacerse parte de una política, especialmente si se introducen ciertas convenciones de denominación de sucursales. (Tal vez estoy demasiado ansioso en este momento, tal vez no :) La combinación con--force-with-lease
no puede doler, aunque no se debe confiar, como se señaló en mi otra publicación.Aquí enumero algunas posibilidades que se me pasan por la cabeza.
Rebasar siempre en una nueva sucursal
Cuando tenga una rama desordenada
some-feature
, vuelva a crear una nueva rama. P.ejLuego han
some-feature-rebase
revisado e integrado.Problema: un gran inconveniente aquí es que, estrictamente hablando, necesita una nueva rama para cada rebase. (Podría tener múltiples rebases si realiza cambios después de una revisión de código, por ejemplo)
Utilizar
git push --force-with-lease
Acabo de enterarme de la
git push --force-with-lease
alternativa agit push --force
, queProblema : Esto parece mejorar directamente en la situación en la que usamos solo
--force
, pero todavía tiene algunas advertencias, sobre todo cuando hago un engit fetch
lugar de ungit pull
, que actualiza nuestras ramas locales aguas arriba, engañando--force-with-lease
para pensar que no se realizaron cambios no fusionados en el control remoto rama.fuente