git - tag - ¿Cómo copiar las confirmaciones de una rama a otra?
para que sirven las ramas git (6)
O si estás un poco menos del lado del evangelista, puedes hacer un poco feo de lo que estoy usando. En deploy_template hay confirmaciones que quiero copiar en mi maestro como despliegue de sucursal
git branch deploy deploy_template
git checkout deploy
git rebase master
Esto creará una nueva implementación de sucursal (yo uso -f para sobrescribir la rama de implementación existente) en deploy_template, y luego volveré a escribir esta nueva rama en el maestro, sin tener que desplegar deploy_template.
Tengo dos ramas de mi maestro:
- v2.1 : (versión 2) He estado trabajando durante varios meses
- wss : que creé ayer para agregar una característica específica a mi maestro (en producción)
¿Hay una manera de copiar los compromisos de ayer de wss a v2.1?
Para el simple caso de simplemente copiar la última confirmación de la rama wss a v2.1, simplemente puede capturar el ID de confirmación ( git log --oneline | head -n 1
) y hacer:
git checkout v2.1
git merge <commit>
Puede crear un parche a partir de las confirmaciones que desea copiar y aplicar el parche a la rama de destino.
Realmente deberías tener un flujo de trabajo que te permita hacer todo esto combinando:
- x - x - x (v2) - x - x - x (v2.1)
/
x - x - x (wss)
Así que todo lo que tienes que hacer es git checkout v2.1
y git merge wss
. Si por alguna razón realmente no puedes hacer esto, y no puedes usar git rebase para mover tu rama wss al lugar correcto, el comando para tomar un solo commit de algún lugar y aplicarlo en otro lugar es git cherry-pick . Simplemente revise la rama en la que desea aplicarlo y ejecute git cherry-pick <SHA of commit to cherry-pick>
.
Algunas de las maneras en que rebase podría salvarte:
Si tu historia se ve así:
- x - x - x (v2) - x - x - x (v2.1)
/
x - x - x (v2-only) - x - x - x (wss)
Puede usar git rebase --onto v2 v2-only wss
para mover wss directamente a v2:
- x - x - x (v2) - x - x - x (v2.1)
|/
| x - x - x (v2-only)
/
x - x - x (wss)
¡Entonces puedes unirte! Si realmente, realmente, realmente no puede llegar al punto en que puede fusionarse, todavía puede usar rebase para hacer efectivamente varias selecciones de cereza a la vez:
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
Nota: la razón por la que se necesita algo de trabajo adicional para hacer esto es que está creando confirmaciones duplicadas en su repositorio. Esto no es realmente algo bueno, el objetivo de la fácil ramificación y fusión es poder hacer todo al hacer de los compromisos un lugar y fusionarlos en donde sea necesario. Las confirmaciones duplicadas significan una intención de nunca fusionar esas dos ramas (si decide que desea hacerlo más adelante, obtendrá conflictos).
Utilizar
git cherry-pick <commit>
para aplicar <commit>
a tu rama actual .
Probablemente yo mismo verificaría las confirmaciones que selecciono en gitk
y las seleccioné con un clic derecho en la entrada de confirmación.
Si desea ir de forma más automática (con todos sus peligros) y suponiendo que todas las confirmaciones desde ayer ocurrieron en wss, podría generar la lista de confirmaciones usando el git log
con (- --pretty
sugerido por Jefromi)
git log --reverse --since=yesterday --pretty=%H
así que todo junto asumiendo que usas bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
Si algo sale mal aquí (hay un gran potencial), está en problemas, ya que esto funciona en el checkout en vivo, por lo que puede hacer selecciones automáticas o usar rebase como lo sugiere Jefromi.
git cherry-pick
: aplique los cambios introducidos por algunas confirmaciones existentes
Supongamos que tenemos la rama A con (X, Y, Z) confirmaciones. Necesitamos agregar estos compromisos a la rama B. Vamos a utilizar las operaciones de cherry-pick
.
Cuando usamos cherry-pick
, deberíamos agregar confirmaciones en la rama B en el mismo orden cronológico que las confirmaciones aparecen en la Sucursal A.
cherry-pick admite un rango de confirmaciones, pero si tiene unir combinaciones en ese rango, se vuelve realmente complicado
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
Ejemplo de flujo de trabajo:
Podemos usar cherry-pick
con options
-e o --edit : Con esta opción, git cherry-pick le permitirá editar el mensaje de confirmación antes de confirmar.
-n o --no-commit : Por lo general, el comando crea automáticamente una secuencia de confirmaciones. Este indicador aplica los cambios necesarios para seleccionar cada compromiso con nombre en su árbol de trabajo y en el índice, sin realizar ningún compromiso. Además, cuando se usa esta opción, su índice no tiene que coincidir con la confirmación HEAD. La selección de cereza se realiza contra el estado inicial de su índice.
Aquí un article interesante sobre cherry-pick
.