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?
git
branching-and-merging
Bob Walsh
fuente
fuente
Respuestas:
Realmente debería tener un flujo de trabajo que le permita hacer todo esto fusionando:
Entonces todo lo que tienes que hacer es
git checkout v2.1
ygit 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útelogit cherry-pick <SHA of commit to cherry-pick>
.Algunas de las formas en que rebase pueden salvarte:
Si su historial se ve así:
Puede usar
git rebase --onto v2 v2-only wss
para mover wss directamente a v2:¡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:
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).
fuente
git-svn-id
referencias incorrectas antesdcommit
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
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)así que todo junto asumiendo que usas
bash
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.
fuente
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 existentesSupongamos 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
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
.fuente
Puede crear un parche a partir de las confirmaciones que desea copiar y aplicar el parche a la rama de destino.
fuente
git format-patch <revision range>
ygit 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
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.
fuente
Para el caso simple de copiar el último commit de la rama wss a v2.1, simplemente puede tomar el commit id (
git log --oneline | head -n 1
) y hacer:fuente
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.
fuente