github: agregar confirmaciones a una solicitud de extracción existente

88

Abrí una solicitud de extracción para el repositorio de rieles en github usando el botón Fork & Edit this file file.

Ahora, después de recibir comentarios sobre mi PR, quería agregar más confirmaciones. así que esto es 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 me equivoque, algo anda mal aquí?

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

Mente curiosa
fuente
4
Algunos que vengan aquí pueden encontrar que esto se ajusta mejor a su escenario: stackoverflow.com/questions/9790448/…
AaronLS
4
También encontré esta versión de la pregunta / respuesta más clara: stackoverflow.com/questions/7947322/…
Ben Wheeler

Respuestas:

62

Como está utilizando las herramientas de GitHub y solo está cambiando un archivo, también puede buscar el archivo en GitHub, seleccionar la rama adecuada en la esquina superior izquierda debajo del menú desplegable "árbol:" ( patch-3en su caso), y ahora elegir "Editar Este archivo". Ahora sus cambios se confirmarán en esta rama y aparecerán en su solicitud de extracción

Abe Voelker
fuente
10

Recientemente escribí en un blog sobre este tema:

¿Cómo mantenemos actualizada esta rama de funciones? Fusionar las confirmaciones ascendentes más recientes es fácil, pero desea evitar la creación de una confirmación de fusión, ya que eso no se apreciará cuando se empuje a las versiones ascendentes: entonces está re-confirmando efectivamente los cambios ascendentes, y esas confirmaciones ascendentes obtendrán un nuevo hash ( cuando tengan un nuevo padre). Esto es especialmente importante, ya que esas confirmaciones fusionadas se reflejarían en su solicitud de extracción de GitHub cuando envíe esas actualizaciones a su rama de funciones personal de GitHub (incluso si lo hace después de emitir la solicitud de extracción).

Es por eso que necesitamos reajustar en lugar de fusionar:

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 como el comando de rebase de git mantendrán tu árbol limpio y evitarán que se combinen confirmaciones. Pero tenga en cuenta que esas son sus primeras confirmaciones (con las que emitió su primera solicitud de extracción) que se están volviendo a basar y que ahora tienen un nuevo hash de confirmación, que es diferente de los hash originales que todavía están en su rama remota de repositorio de github. .

Ahora, enviar esas actualizaciones a su rama de características de GitHub personal fallará aquí, ya que ambas ramas difieren: el árbol de la rama local y el árbol de la rama remota están "desincronizados", debido a esos diferentes hashes de confirmación. Git te dirá que lo hagas primero git pull --rebase, luego presiona nuevamente, pero esto no será un simple avance rápido, ya que tu historial fue reescrito. ¡No hagas eso!

El problema aquí es que volvería a buscar sus primeras confirmaciones modificadas como estaban originalmente, y esas se fusionarán en la parte superior de su rama local. Debido al estado de desincronización, esta extracción no se aplica limpiamente. Obtendrá un historial roto donde sus confirmaciones aparecen dos veces. Cuando empuja todo esto a su 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 encontré es forzar el empuje de su sucursal local a su sucursal de GitHub (en realidad, forzando una actualización que no sea de avance rápido):

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 tire, simplemente empuje con fuerza así:

git push svg +user-non-unique

o:

git push svg user-non-unique --force

Esto en realidad sobrescribirá claramente su sucursal remota, con todo en su sucursal local. Las confirmaciones que están en la secuencia remota (y causaron la falla) permanecerán allí, pero serán confirmaciones colgantes, que eventualmente serán eliminadas 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 RP se actualizará con las confirmaciones más recientes, que tendrán una fecha posterior y podrían aparecer desincronizadas en el historial de comentarios del RP. No es un gran problema, pero podría resultar confuso.

Serge van Ginderachter
fuente
5

También puede crear una nueva solicitud de extracción que esté vinculada en masterlugar de una abc1234revisión específica .

De esa manera, cualquier nueva confirmación / envío a su repositorio se agregará a la solicitud de extracción.

cfedermann
fuente
3

Sí, estás haciendo mucho más trabajo del necesario. Simplemente haga una confirmación adicional y luego fuerce la presión. Verá la confirmación original y luego una nueva cuando actualice github en su navegador.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Para descanso
fuente
esta es la forma más fácil y directa, no estoy seguro de por qué no es la mejor respuesta
Banjo Obayomi