Pregunta Cómo seleccionar varias confirmaciones


Tengo dos ramas. Cometer a es la cabeza de uno, mientras que el otro tiene b, c, d, e y f encima de a. quiero moverme c, d, e y f a la primera rama sin comprometer b. El uso de la selección de cereza es fácil: compra la primera selección de cerezas, una por una c a f y rebase la segunda rama en la primera. Pero, ¿hay alguna manera de seleccionar todos c-f en un comando?

Aquí hay una descripción visual del escenario (gracias JJD)

enter image description here


560
2017-11-04 00:07


origen


Respuestas:


Git 1.7.2 introdujo la capacidad de seleccionar una gama de commits. Desde el Notas de lanzamiento:

git cherry-pick "aprendió a elegir un rango de commits   (por ejemplo, "cherry-pick A..B" y "cherry-pick --stdin"), también lo hizo "git   revertir "; estos no son compatibles con el control de secuenciación más agradable" rebase   [-i] "tiene, sin embargo.


Incluyendo comentarios importantes (créditos a los autores respectivos)

Nota 1: En el formulario "cherry-pick A..B", A debe ser anterior a B. Si son del orden incorrecto, el comando fallará en silencio. - Damian

Nota 2: Además, esto no elegirá a A, sino más bien todo después de A hasta B. inclusive. - J. B. Rainsberger

Nota 3: Para incluir A simplemente escriba git cherry-pick A ^ .. B - sschaef


817
2017-10-14 13:08



La forma más sencilla de hacerlo es con el onto opción de rebase. Supongamos que la rama cuya corriente termina en a se llama mybranch y esta es la rama que quieres mover c-f sobre.

# 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

84
2017-11-04 08:13



O el one-liner solicitado:

git rebase --onto a b f

70
2018-05-25 15:12



Puedes usar una combinación serial de git rebase y git branch para aplicar un grupo de commits en otra rama. Como ahora publicado por wolfc el primer comando realmente copia los commits. Sin embargo, el cambio no es visible hasta que agregue un nombre de rama a la confirmación más alta del grupo.

Abra la imagen en una nueva pestaña ...

Workflow

Para resumir los comandos en forma de texto:

  1. Abierto gitk como un proceso independiente usando el comando: gitk --all &.
  2. correr git rebase --onto a b f.
  3. prensa F5 en gitk. Nada cambia. Pero no HEAD está marcado.
  4. correr git branch selection
  5. prensa F5 en gitk. Aparece la nueva rama con sus commits.

Esto debería aclarar cosas:

  • Cometer a es el nuevo destino raíz del grupo.
  • Cometer b es la confirmación antes del primer compromiso del grupo (exclusivo).
  • Cometer f es el último compromiso del grupo (inclusive).

Después, podrías usar git checkout feature && git reset --hard b para eliminar los commits c hasta f desde el feature rama.

Además de esta respuesta, escribí un entrada en el blog que describe los comandos en otro escenario que debería ayudar a usarlo en general.


49
2017-09-28 20:30



Para aplicar los comentarios de J. B. Rainsberger y sschaef para responder específicamente la pregunta ... Para usar un rango de selección de cereza en este ejemplo:

git checkout a
git cherry-pick b..f

o

git checkout a
git cherry-pick c^..f

19
2017-07-26 18:25



git rev-list --reverse b..f | xargs -n 1 git cherry-pick

18
2017-11-04 03:59



git format-patch --full-index --binary --stdout range... | git am -3

4
2017-11-04 01:08