Hace poco blogged sobre este tema:
¿Cómo podemos mantener esta rama de la característica hasta la fecha? Es fácil fusionar los nuevos commits ascendentes, pero se debe evitar crear un commit de fusión, ya que no se apreciará cuando se empuje hacia arriba: entonces se vuelven a comprometer efectivamente los cambios ascendentes, y esos commit upstream obtendrán un nuevo hash (a medida que obtienen un nuevo padre). Esto es especialmente importante, ya que esas confirmaciones fusionadas se reflejarían en su solicitud de extracción de Github cuando inserte esas actualizaciones en su rama personal de github (incluso si lo hace después de emitir la solicitud de extracción)
Es por eso que necesitamos a rebasar en lugar de combinar:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
Tanto la opción de rebase y rebase comando para git mantendrá su árbol limpio, y evitar tener fusionar confirmaciones. Pero tenga en cuenta que esos son sus primeros commits (con quienes emitió su primera solicitud de extracción) que están siendo actualizados, y que ahora tienen un nuevo hash commit, que es diferente de los hashes originales que aún están en su rama github repo remota .
Ahora, las actualizaciones de esa rama personal de Github fallarán aquí, ya que ambas ramas difieren: el árbol de la rama local y el árbol de la sucursal remota están "fuera de sincronización" debido a los diferentes hashes de confirmación. Git te dirá que primero tengas que recuperar --rebase, y luego volver a presionar, pero esto no será un simple avance rápido, ya que tu historia se reescribió. ¡No hagas eso!
El problema aquí es que volvería a recuperar sus primeras confirmaciones modificadas como estaban originalmente, y esas se fusionarán en la parte superior de su sucursal local. Debido al estado fuera de sincronización, este tirón no se aplica limpiamente. Obtendrás un historial de b0rken donde tus confirmaciones aparecen dos veces. Cuando insertas todo esto en tu rama de características de github, esos cambios se reflejarán en la solicitud de extracción original, que se volverá muy, muy fea.
AFAIK, en realidad no hay una solución totalmente limpia para esto.La mejor solución que he encontrado es para obligar a empujar a su sucursal local para su sucursal github (en realidad forzando una actualización no rápido orward):
Según git-push (1):
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
Así que no 't tirar, simplemente fuerza de empuje de esta manera:
git push svg +user-non-unique
o:
git push svg user-non-unique --force
esto va claramente overwrit e su sucursal remota, con todo en su sucursal local. Los commits que están en la secuencia remota (y causaron la falla) permanecerán allí, pero estarán colgando commit, que eventualmente serán eliminados por git-gc (1). No es gran cosa.
Como dije, esta es AFAICS la solución más limpia. La desventaja de esto es que su PR se actualizará con las confirmaciones más recientes, lo que tendrá una fecha posterior y podría no estar sincronizado en el historial de comentarios de la RP. No es un gran problema, pero podría ser confuso.
Algunos de los que vienen aquí pueden encontrar que esto encaja mejor en su escenario: http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS
También encontré esta versión de la pregunta/respuesta más clara: http://stackoverflow.com/questions/7947322/preferred-github-workflow-for-updating-a-pull-request-after-code-review?rq=1 –