2011-03-10 10 views
242

Hice un proyecto en github y estoy haciendo cambios con éxito en mi maestro local y presionando al origen en github. Deseo enviar una solicitud de extracción, pero solo quiero incluir la última confirmación. La interfaz de usuario de solicitud de extracción en github.com muestra los últimos 9 commits y no sé cómo filtrarlo.Enviar una solicitud de extracción en GitHub para la confirmación más reciente

Estaba tratando de entender si debería crear una nueva sucursal local, verificar eso y de alguna manera restablecer o volver a establecer la base en la cadena ascendente? Luego, aplico mi última confirmación de mi maestro por ID a la nueva sucursal local y la utilizo para la solicitud de extracción.

Estoy tratando de entender bien los conceptos y encontrar las líneas de comando correctas para hacer lo que necesito.

+0

¿Y qué sucede si haces una solicitud de extracción con todas las otras confirmaciones? Pensé que Git es lo suficientemente inteligente como para ignorar (o pasar) las confirmaciones que ya había realizado. – jayarjo

+2

Presumiblemente, el upstream no ha aceptado aún, o no quiere, los commits intermedios. –

+0

@jayarjo Por ejemplo, realicé otros cambios que no deseo enviar en sentido ascendente. Los cambios en git ignoran que el repositorio principal no necesitará, por ejemplo. Nada fácil con git. – Martin

Respuesta

264

Es necesario crear una nueva rama básicamente & cherry-pick las confirmaciones que desee añadir a la misma.

Nota: es posible que necesite estos antes de la caja/cherry-pick comandos

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master 

git cherry-pick <SHA hash of commit> 

git push origin <new-branch-name> 

Posteriormente, verá <new-branch-name> rama en github , cambie a él y puede enviar la solicitud de extracción con los cambios que quieres

+0

¡Gran solución, muchas gracias! – Max

+0

Gracias, esta solución también me ayudó. Aquí hay un enlace que explica cómo funciona la recolección de cerezas en git: http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches (desplácese hacia abajo e ignore los mensajes de error de PHP)) – dubbaluga

+29

También necesito '' 'git remote add upstream ' '' y '' 'git remote update''' antes de ejecutar git checkout -b upstream upstream/master. – plainjimbo

51

Crear una nueva rama a partir de la última cometer, que también se encuentra en el repositorio de origen:

git branch new-branch origin/master 
git checkout new-branch 

A continuación, utilice git cherry-pick para obtener la única confirmación desea que la solicitud de extracción para. Si la rama con este compromiso se llama feature y al cometer lo que queremos es la última cometen en esta rama, esto será

git cherry-pick feature 

Asumiendo este parche se aplica sin conflicto, lo tienes ahora una rama para la que usted puede hacer su solicitud de extracción.

En un segundo paso, ahora necesita decidir qué hacer con su rama feature. Si aún no ha publicado sus cambios en esta rama, el mejor procedimiento probablemente sea cambiar el rumbo de esta rama en new-branch (y eliminar la última confirmación, si no se hace automáticamente por git rebase).

+0

Recibo este mensaje después del cherry-pick. no se agregó nada a la confirmación, pero sí a los archivos sin seguimiento (use "git add" para rastrear). Todo está en mi maestro, pero necesito hacer que mi rama vaya desde la parte superior. –

+5

Si la 'característica 'ya está confirmada en' origin/master', no ocurre nada durante 'cherry-pick'. La nueva rama debe ser de 'upstream/master' (es decir, la respuesta de Kevin Hakanson) – ohho

25

Terminé en una situación en la que había bifurcado un tenedor y quería enviar una solicitud de extracción al proyecto original.

que tenía:

  • orignal_project
  • forked_project (creado a partir del proyecto original a SHA: 9685770)
  • my_fork (creado a partir de proyectos en forma de horquilla en el SHA: 207e29b)
  • una confirmación en mi tenedor (SHA: b67627b) que quería enviar al proyecto original

Para hacer esto, I:

  1. creado una nueva rama de la SHA donde el proyecto original se bifurcó
  2. sacó todo desde el proyecto original
  3. cereza escogió el comprometo quería presentar como una solicitud de extracción
  4. empujado todo para arriba a github

Los comandos git eran algo así como:

  1. rama git mi-función de solicitud 9685770
  2. git checkout mi-función-solicitud
  3. git pull https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. origen git push my-función-solicitud

Luego elegí my-feature-request como la rama de mi solicitud de extracción para el proyecto original.

+0

Tal vez haya una manera más fácil, pero eso funcionó para mí. –

+3

Estas instrucciones fueron las más completas y fáciles de seguir. Funcionó una delicia para mí. Gracias. –

5

Esta casi funcionó para mí:

git checkout -b upstream upstream/master 

git cherry-pick <SHA hash of commit> 

git push origin upstream 

La única diferencia era la siguiente:

git push origin upstream:upstream 

necesitaba cambiar esa última línea para que git push haría que la rama aguas arriba en mi repo GitHub para poder hacer relaciones públicas a partir de eso.

1

La solución para crear una nueva rama (temporal), seleccionar y crear la solicitud de extracción para esa rama no me satisfizo. Yo no quiero cambiar mi repositorio para hacer un conjunto de confirmaciones disponibles, por lo que me ocurrió con la siguiente alternativa:

En primer lugar crear archivos de revisión para todas las confirmaciones de interés:

git format-patch -1 <sha> 

Si la confirmación de el interés pasa a ser el último que puede usar HEAD en su lugar <sha>.

Ahora, puede enviar los parches al mantenedor del repositorio fuente, que puede aplicarlos:

git branch new-branch <master or some older commit where the fork diverged> 
git checkout new-branch 

git am < <the patch> 
... 

git checkout master 
git merge new-branch 

Finalmente esto se vera lo mismo que si una rama temporal se fusionó por una solicitud de extracción, pero sin tener esa rama adicional en el repositorio de horquillas.

3

Ya había hecho la confirmación que quería poder aislar como una solicitud de extracción en la rama actual.

lo que he comprobado a cabo una nueva rama

git checkout -b isolated-pull 

Y aquí es donde mi solución difiere de @ Kevin Hakanson de, ya que necesito para restablecer esta rama en el lugar en la historia que quiero Diferenciar del

git reset --hard [sha-to-diff-by] 

Y cereza recoger la confirmación de la que quiero crear una solicitud de extracción aislado

git cherry-pick [my-isolated-commit-sha] 

Por último empuje hacia arriba a la remota

git push origin isolated-pull 

y tire solicitud dat shi.

Cuestiones relacionadas