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 alguna manera de copiar los commits de ayer de wss a v2.1?
Tengo dos ramas de mi maestro:
¿Hay alguna manera de copiar los commits de ayer de wss a v2.1?
Respuestas:
Realmente debería tener un flujo de trabajo que le permita hacer todo esto fusionando:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
Entonces todo lo que tienes que hacer es git checkout v2.1
y git merge wss
. Si por alguna razón realmente no puede hacer esto, y no puede usar git rebase para mover su rama wss al lugar correcto, el comando para tomar un solo commit desde algún lugar y aplicarlo en otro lugar es git cherry-pick . Simplemente revise la rama en la que desea aplicarlo y ejecútelo git cherry-pick <SHA of commit to cherry-pick>
.
Algunas de las formas en que rebase pueden salvarte:
Si su historial 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 el que pueda fusionarse, aún 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 un poco de trabajo adicional para hacer esto es porque está creando confirmaciones duplicadas en su repositorio. Esto no es realmente algo bueno: el objetivo de una fácil ramificación y fusión es poder hacer todo haciendo commit (s) en un lugar y fusionándolos en donde sea necesario. Las confirmaciones duplicadas significan una intención de nunca fusionar esas dos ramas (si decides que quieres hacerlo más adelante, obtendrás conflictos).
git-svn-id
referencias incorrectas antes dcommit
de volver a comenzar . Aunque probablemente podría haber omitido el paso de selección de cereza y simplemente haber usado un rebase por sí mismo.
Utilizar
git cherry-pick <commit>
para aplicar <commit>
a su sucursal actual .
Yo mismo probablemente haría una verificación cruzada de los commits que selecciono gitk
y los selecciono con un clic derecho en la entrada de commit allí.
Si desea ir más automático (con todos sus peligros) y asumir todos los commits desde que sucedió ayer en wss, puede generar la lista de commits usando git log
(con la --pretty
sugerencia de 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ás en problemas ya que esto funciona en el pago en vivo, así que haz selecciones manuales o usa rebase como lo sugiere Jefromi.
git rebase
en mi respuesta es más robusto. En particular, usando un bucle for como este, si una de las selecciones de cereza falla, aún intentará hacer el resto. Esto es ... muy muy malo, digamos.
git
respuesta que es simple y directa a la solución, en lugar de serpentear a través de las complejidades de git para demostrar cuán bien lo sabe el respondedor.
git cherry-pick
: Aplique los cambios introducidos por algunos commits existentes
Supongamos que tenemos una rama A con confirmaciones (X, Y, Z). Tenemos que añadir estos compromete a la rama B . Vamos a usar las cherry-pick
operaciones.
Cuando usamos cherry-pick
, hay que añadir compromete en la rama B en el mismo orden cronológico que las confirmaciones aparecen en la rama Una .
cherry-pick admite una variedad de commits, pero si tiene commits de fusión 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 opciones
-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 confirmación nombrada en su árbol de trabajo y el índice, sin realizar ninguna confirmación. Además, cuando se utiliza 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 artículo interesante sobre cherry-pick
.
Puede crear un parche a partir de las confirmaciones que desea copiar y aplicar el parche a la rama de destino.
git format-patch <revision range>
y git am *.patch
.
checkout
a otra rama.
O si eres un poco menos del lado del evangelista, puedes hacer una forma fea que estoy usando. En deploy_template hay confirmaciones que quiero copiar en mi maestro como implementación de sucursal
git branch deploy deploy_template
git checkout deploy
git rebase master
Esto creará una nueva implementación de sucursal (uso -f para sobrescribir la rama de implementación existente) en deploy_template, luego volverá a crear esta nueva rama en la maestra, dejando intacta deploy_template.
El comando cherry-pick puede leer la lista de confirmaciones de la entrada estándar.
El siguiente comando cherry-picks se compromete escrito por el usuario John que existe en la rama "desarrollo" pero no en la rama "lanzamiento", y lo hace en orden cronológico.
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin