2009-05-19 22 views
745

He bifurcado una rama de un repositorio en GitHub y he confirmado algo específico para mí. Ahora encontré que el repositorio original tenía una buena característica que estaba en HEAD.Cómo fusionar una confirmación específica en Git

Quiero fusionarlo solo sin compromisos previos. ¿Qué debería hacer? He conocido cómo combinar todos los envíos:

git branch -b a-good-feature 
git pull repository master 
git checkout master 
git merge a-good-feature 
git commit -a 
git push 
+0

Si está tratando para hacer esto en relación con github, este artículo lo guiará a través de él. http://markosullivan.ca/how-to-handle-a-pull-request-from-github/ – johndpope

Respuesta

910

'git cherry-pick' debe ser su respuesta aquí.

Aplicar el cambio introducido por una confirmación existente.

No se olvide de leer la respuesta bdonlan 's, de las consecuencias cherry picking en este post:
"Pull all commits from a branch, push specified commits to another", donde:

A-----B------C 
\ 
    \ 
    D 

se convierte en:

A-----B------C 
\ 
    \ 
    D-----C' 

El problema con este commits es que git considera commits para incluir todo el historial antes de ellos

Donde C 'tiene un ID de SHA-1 diferente.
Del mismo modo, seleccionar un compromiso de una rama a otra consiste básicamente en generar un parche y luego aplicarlo, perdiendo así también la historia.

Este cambio de identificaciones de compromiso rompe la funcionalidad de fusión de git entre otras cosas (aunque si se usa con moderación hay heurística que se va a imprimir sobre esto).
Más importante aún, ignora las dependencias funcionales; si C realmente usó una función definida en B, nunca sabrá.

+1

@ openid000: "ramas de grano más fino": que es exactamente lo que bdonlan sugirió en su respuesta. – VonC

+5

Nota: "git rebase" también cambia SHA-1. Ver también "git rebase vs. git merge (http://stackoverflow.com/questions/804115/git-rebase-vs-git-merge) y" git workflow "(http://stackoverflow.com/questions/457927/ git-workflow-and-rebase-vs-merge-questions) para casos donde "git rebase" es legítimo. – VonC

+1

Entre "ramas de grano fino", "cherry-pick" y "rebase", tendrás todas las posibilidades para código de gestión en sucursales con git – VonC

487

Puede usar git cherry-pick para aplicar una única confirmación por sí misma a su rama actual.

Ejemplo: git cherry-pick d42c389f

+47

+1 para su anterior publicación en cherry picking (http: // stackove) rflow.com/questions/880957/pull-all-commits-from-a-branch-push-specified-commits-to-another/881014#881014). Me tomé la libertad de copiar un extracto en mi propia respuesta anterior. – VonC

+1

Probablemente 'git cherry-pick d42c' o' git cherry-pick d42c3' funcionarán. Git es inteligente. ;) – guneysus

+2

sí, esto me ayudó! – Roboblob

9

Vamos a tratar de tomar un ejemplo y entender:

tengo una rama, por ejemplo maestro, señalando X < cometer-id>, y tengo un nuevo señalador rama a Y < sha1>.

Dónde Y < cometer-id> = < principal> rama compromete - pocas confirmaciones

Ahora decir para la rama Y tengo a distancia de cerca las confirmaciones entre la rama principal y la nueva sucursal. A continuación se muestra el procedimiento que podemos seguir:

Paso 1:

git checkout -b local origin/new 

donde local es el nombre de la sucursal. Cualquier nombre puede ser dado.

Paso 2:

git merge origin/master --no-ff --stat -v --log=300 

fusionar las confirmaciones de la rama principal a la nueva rama y también crea una combinación de cometer de mensaje de registro con las descripciones de una línea de como máximo < n> confirmaciones reales que se están fusionando

Para obtener más información acerca de la combinación y los parámetros de Git, consulte:

git merge --help 

Además, si necesita combinar una específica cometer, entonces usted puede utilizar:

git cherry-pick <commit-id> 
Cuestiones relacionadas