Tengo dos ramas Commit a
es la cabeza de uno, mientras que el otro tiene b
, c
, d
, e
y f
en la parte superior de a
. Quiero mover c
, d
, e
y f
hasta la primera rama sin comprometerse b
. Usar Cherry Pick es fácil: verifique la primera rama Cherry-Pick una por una y vuelva c
a f
colocar la segunda rama en la primera. Pero, ¿hay alguna manera de elegir todo c
, f
con un solo comando?
Aquí hay una descripción visual del escenario (gracias JJD ):
b
basarsef
más adelante, pero eso no tiene nada que ver con la recolección de cerezas).Respuestas:
Git 1.7.2 introdujo la capacidad de elegir una variedad de confirmaciones. De las notas de la versión :
Para seleccionar todos los commits de commit
A
a commitB
(dondeA
es anterior aB
), ejecute:Si quieres ignorar A, ejecuta:
(El crédito es para Damian, JB Rainsberger y sschaef en los comentarios)
fuente
git cherry-pick A^..B
git cherry-pick f~3
,git cherry-pick f~2
etc., hastagit cherry-pick f
(presionar la flecha hacia arriba obtiene el comando anterior para que pueda cambiar rápidamente el número y ejecutar debería ser similar en la mayoría de las consolas).git cherry-pick master..somebranch
elegirá todos los commits en somebranch desde master (suponiendo que ya se haya basado en master), y los aplicará a su rama actual.La forma más sencilla de hacerlo es con la
onto
opción derebase
. Supongamos que la rama que acaba actuales ena
que se llama MyBranch y esta es la rama que desea moverc
-f
a.fuente
git checkout secondbranch && git rebase mybranch
para una respuesta completarebase
el modo interactivo. Gracias, @Charles!--interactive
para eliminar algunos commits de la secuencia o reordenarlos antes de la "selección de cereza". +1b
en este ejemplo) pero sí, esto me ha funcionado.O el one-liner solicitado:
fuente
Puede usar una combinación en serie de
git rebase
ygit branch
para aplicar un grupo de confirmaciones en otra rama. Como ya lo publicó wolfc, el primer comando copia los commits. Sin embargo, el cambio no es visible hasta que agregue un nombre de rama a la parte superior del grupo.Abra la imagen en una nueva pestaña ...
Para resumir los comandos en forma de texto:
gitk --all &
.git rebase --onto a b f
.HEAD
está marcado.git branch selection
Esto debería aclarar las cosas:
a
es el nuevo destino raíz del grupo.b
es el commit antes del primer commit del grupo (exclusivo).f
es el último commit del grupo (inclusive).Luego, puede usar
git checkout feature && git reset --hard b
para eliminar las confirmacionesc
hastaf
de lafeature
rama.Además de esta respuesta, escribí una publicación de blog que describe los comandos en otro escenario que debería ayudar a usarlo en general.
fuente
git rebase --onto a b mybranch
y por cierto, ¿qué programa hacen esas ingeniosas imágenes git?Para aplicar los comentarios de JB Rainsberger y sschaef para responder específicamente a la pregunta ... Para usar un rango de selección de cereza en este ejemplo:
o
fuente
git 2.7.0.windows.1
y noté que cuando trato de elegir el rango de confirmaciones, todo está bien, pero git no te dice en ningún lado lo que tienes que hacergit cherry-pick --continue | --abort | --quit
antes de intentar comprometer / seleccionar de nuevo. Entonces, si elige un rango de confirmaciones, deberá ejecutargit cherry-pick --continue
cada vez que esté listo (resolviendo conflictos o similares) con una confirmación del rango dado.^
después de la c en realidad significa "el commit antes de c" que es b en este caso. Por esoc^..f
es sinónimo deb..f
. Intenta hacerlogit log c^..f
y deberías ver los commits de c a f, exactamente igual que si lo hicierasgit log b..f
Si tiene revisiones selectivas para fusionar, diga A, C, F, J de A, B, C, D, E, F, G, H, I, J commits, simplemente use el siguiente comando:
fuente
fuente
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Para elegir desde una identificación de confirmación hasta la punta de la rama, puede usar:
git cherry-pick commit_id^..branch_name
fuente
Otra variante que vale la pena mencionar es que si desea las últimas
n
confirmaciones de una rama, la~
sintaxis puede ser útil:En este caso, el comando anterior seleccionaría los últimos 4 commits de una rama llamada
some-branch
(aunque también podría usar un hash de commit en lugar del nombre de una rama)fuente
En realidad, la forma más sencilla de hacerlo podría ser:
MERGE_BASE=$(git merge-base branch-a branch-b)
vuelva a basar la rama resultante en sí misma, comenzando en la base de fusión del paso 1, y elimine manualmente las confirmaciones que no desea:
Alternativamente, si solo hay unas pocas confirmaciones nuevas, omita el paso 1 y simplemente use
en el primer paso, usar lo suficiente
^
para pasar la base de fusión.Verá algo como esto en el rebase interactivo:
Luego elimine las líneas b (y cualquier otra que desee)
fuente
fuente
Aquí hay una secuencia de comandos que le permitirá seleccionar varias confirmaciones en una fila simplemente diciéndole a la secuencia de comandos qué ramas de origen y destino para las selecciones de cereza y el número de confirmaciones:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Para seleccionar de la rama a la maestra (usa la rama actual como fuente):
Para elegir los últimos 5 commits de tu rama 6.19.x para masterizar:
fuente