reescribir el historial de origen con la historia de subida?

Estoy trabajando en un equipo grande, y el equipo aplasta regularmente los compromisos con el flujo ascendente. En este punto, la historia de mi origen es lo suficientemente diferente de las fonts ascendentes, que la única forma de "sincronizarlas" es restablecer a la stream ascendente y forzar la inserción al origen.

¿Hay alguna manera de "sincronizar" o reescribir el historial de mi origen con las streams ascendentes, para deshacerse de las confirmaciones "mini" en la mía y replacelas por las aplastadas de la stream ascendente?

Hay algunas maneras de hacer esto en git: intentaré explicar uno de ellos. Supongamos que estás trabajando en una twig local llamada bug_fix . Debería poder volver a sincronizarse con el flujo ascendente haciendo lo siguiente:

  1. Crea una nueva twig de bug_fix :

     git checkout -b temp_bug_fix 
  2. Regrese a la twig bug_fix original y restablezca HEAD en un punto donde su sucursal local estaba sincronizada con la stream ascendente. Suponiendo que sea hace 10 commits, los commands serían:

     git checkout bug_fix git reset --hard HEAD~10 
  3. Extraiga todos los cambios nuevos de la stream ascendente. Esto sincronizará bug_fix con origin

     git pull origin <upstream_branch> 
  4. Elige tus commits de la twig temp_bug_fix con los SHA apropiados

     git cherry-pick <you_commit_SHA> 
  5. Ahora que estás sincronizado, puedes presionar hacia arriba normalmente (sin usar -f )

     git push origin <upstream_branch> 

Esta respuesta supone que todos los cambios se han realizado después de todos los 'mini' commits realizados por otros.

Tengo curiosidad por comprender cómo su sucursal local entró en este estado en primer lugar. La práctica estándar es que los desarrolladores deben aplastar sus compromisos antes de empujar hacia el origen. Una vez que una sucursal local se ha fusionado río arriba, nadie debería cambiar el historial con un impulso de fuerza; eso es solo una receta para problemas.