git - procedimiento - que es picking in situ
Cómo hacer un picking múltiple de confirmaciones (9)
En realidad, la forma más sencilla de hacerlo podría ser
- guardar la base de combinación entre las dos ramas
MERGE_BASE=$(git merge-base branch-a branch-b)
- adelantar o cambiar de base la rama más antigua a la rama más nueva
vuelva a colocar la rama resultante sobre sí misma, comenzando en la base de fusión del paso 1, y elimine manualmente las confirmaciones que no desee:
git rebase ${SAVED_MERGE_BASE} -i
Alternativamente, si solo hay unos pocos confirmaciones nuevas, omita el paso 1 y simplemente use
git rebase HEAD^^^^^^^ -i
en el primer paso, usa suficiente
^
para moverte más allá de la base de fusión.
Verás algo como esto en la rebase interactiva:
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
Luego elimina las líneas b (y cualquier otra que quieras)
Tengo dos ramas. Commit a
es la cabeza de uno, mientras que el otro tiene b
, c
, d
, e
y f
encima de a
. Quiero mover c
, d
, e
y f
a la primera rama sin cometer b
. Usar la selección de la cereza es fácil: haga el checkout de la primera rama con una selección de una a una c
a f
vuelva a colocar la segunda rama en la primera. Pero, ¿hay alguna manera de elegir a todos c
- f
en una orden?
Aquí hay una descripción visual del escenario (gracias JJD ):
Git 1.7.2 introdujo la capacidad de realizar un rango de cometidos. De las notas de publicación :
git cherry-pick "aprendió a elegir un rango de confirmaciones (por ejemplo," cherry-pick A..B "y" cherry-pick --stdin "), también lo hizo" git revert "; estos no son compatibles con el mejor control de secuenciación" rebase [-i] "tiene, sin embargo.
Incluyendo comentarios importantes (créditos a los respectivos autores)
Nota 1: En la forma "cherry-pick A..B", A debe ser mayor que B. Si son incorrectas, el comando fallará silenciosamente. Damian
Nota 2: Además, esto no elegirá a A, sino a todo después de A hasta B incluido. - JB Rainsberger
Nota 3: Para incluir A, simplemente escriba git cherry-pick A ^ .. B - sschaef
La forma más sencilla de hacer esto es con la opción rebase
para rebase
. Supongamos que la rama en la que termina la corriente se llama mybranch y esta es la rama a la que desea mover c
- f
.
# checkout mybranch
git checkout mybranch
# reset it to f (currently includes a)
git reset --hard f
# rebase every commit after b and transplant it onto a
git rebase --onto a b
O el one-liner solicitado:
git rebase --onto a b f
Para aplicar los comentarios de JB Rainsberger y sschaef para responder específicamente a la pregunta ... Para usar un rango de selección de cerezas en este ejemplo:
git checkout a
git cherry-pick b..f
o
git checkout a
git cherry-pick c^..f
Puede utilizar una combinación en serie de git rebase
y git branch
para aplicar un grupo de confirmaciones en otra rama. Como ya fue publicado por wolfc, el primer comando en realidad copia las confirmaciones. Sin embargo, el cambio no es visible hasta que agregue un nombre de rama a la parte superior del grupo.
Por favor abre la imagen en una nueva pestaña ...
Para resumir los comandos en forma de texto:
- Abra gitk como un proceso independiente usando el comando:
gitk --all &
. - Ejecutar
git rebase --onto abf
. - Presione F5 en gitk . Nada cambia. Pero ninguna
HEAD
está marcada. - Ejecutar
git branch selection
- Presione F5 en gitk . Aparece la nueva rama con sus confirmaciones.
Esto debería aclarar las cosas:
- Commit
a
es el nuevo destino raíz del grupo. - Commit
b
es el commit antes del primer commit del grupo (exclusivo). - Commit
f
es el último commit del grupo (inclusive).
Luego, puede usar la git checkout feature && git reset --hard b
para eliminar las confirmaciones c
till f
de la rama de feature
.
Además de esta respuesta, escribí una publicación de blog que describe los comandos en otro escenario que debería ayudar a usarla en general.
Si tiene revisiones selectivas para fusionar, digamos A, C, F, J de A, B, C, D, E, F, G, H, I, J confirme, simplemente use el siguiente comando:
git cherry-pick ACFJ
git format-patch --full-index --binary --stdout range... | git am -3
git rev-list --reverse b..f | xargs -n 1 git cherry-pick