2012-04-13 13 views
67

Abrí una solicitud de extracción a rails repo en github usando Tenedor & Editar este archivo botón de archivo.github: Agregar confirmaciones a la solicitud de extracción existente

Ahora, Después de recibir comentarios sobre mi PR, quería agregar algunas confirmaciones más. entonces aquí está lo que terminé haciendo

$ git clone [email protected]:gaurish/rails.git #my forked repo 
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened 
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR 
$ git commit -am "Changes done as per feedback" 
$ git push origin patch-3 

Esto funcionó bien, pero parece un flujo de trabajo bastante complejo. Quizás estoy equivocado, ¿hay algo mal aquí?

mi pregunta es: ¿Estoy haciendo esto de la manera correcta? si no, ¿cuál es la forma correcta de hacer esto?

+3

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

+3

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 –

Respuesta

45

Dado que está utilizando herramientas de GitHub y sólo cambiar un archivo, usted podría también browse to the file en GitHub, seleccione la rama adecuada desde la esquina superior izquierda bajo el "árbol:" desplegable (patch-3 en su caso), y ahora elegir "Editar este archivo". Ahora los cambios se han comprometido a esta rama, y ​​se mostrarán en su solicitud de extracción

+0

impresionante, gracias. – Magne

4

También puede crear una nueva solicitud de extracción que se limite a master en lugar de una revisión abc1234 específica.

De esta forma, cualquier nuevo compromiso/inserción en su repositorio se agregará a la solicitud de extracción.

7

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.

Cuestiones relacionadas