Rebase de la rama de características en otra rama de características

305

Tengo dos ramas de características (privadas) en las que estoy trabajando.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Después de trabajar un poco en estas ramas, descubrí que necesito los cambios de Branch2 en Branch1. Me gustaría volver a basar los cambios en Branch2 en Branch1. Me gustaría terminar con lo siguiente:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Estoy bastante seguro de que necesito volver a crear la segunda rama en la primera, pero no estoy completamente seguro de la sintaxis correcta y de la rama que debería haber verificado.

¿Producirá este comando el resultado deseado?

(Branch1)$ git rebase --onto Branch1 Branch2
Arjen
fuente
11
Para responder a su pregunta, crearía un repositorio de prueba, crearía la estructura de confirmación que mostró y probaría el comando que mostró. Pero creo que puedes hacerlo tú mismo, así que no voy a hacerlo :)
Daniel Hilgarth
3
Gracias. Estaba tan empeñado en hacerlo bien la primera vez que no se me ocurrió que podría probarlo fácilmente yo mismo :-)
Arjen
44
Pensé que sí, por eso publiqué ese comentario :) Cada vez que hago algo, no estoy seguro de que haga lo que creo que hace, creo un repositorio de pruebas y realizo mis pruebas allí. O, creo una copia de mi repositorio real y realizo las pruebas en la copia.
Daniel Hilgarth
Nota: Git 2.0 introducirá un acceso directo para este tipo de rebase: git rebase -. vea mi respuesta a continuación
VonC
55
Nota menor: Las respuestas aquí dan branch2 como resultado. El OP quería rama1. ¿O me perdí algo?
Josef.B

Respuestas:

353
  1. Cambiar a Branch2

    git checkout Branch2
    
  2. Aplique los cambios actuales (Branch2) sobre los cambios de Branch1, permaneciendo en Branch2:

    git rebase Branch1
    

Lo que te dejaría con el resultado deseado en Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Puedes eliminar Branch1.

sasikt
fuente
¡Gracias! Cuando borro la rama después de volver a crear un mensaje, recibo un mensaje de que la rama no está completamente fusionada. ¿Asumo que puedo ignorar este mensaje y forzar la eliminación?
Arjen
10
¿No quería tener todos los cambios en Branch1?
tomasz_kusmierczyk 23/03/18
66
Esto parece lo contrario de lo que él quería, ¿no?
1252748
1
De hecho, @tomasz_kusmierczyk y @ 1252748, y yo también me confundí. Pero luego me di cuenta de que actuar git rebasemientras permanecía en Branch1 reescribirá el historial de Branch1 para tener los cambios de Branch1 además de los copiados de Branch2. Que dará lugar a la siguiente cometer orden, a - b - f - g - c' - d' - e'.
anguila ghEEz
1
@tomasz_kusmierczyk y 1252748, esto no es lo contrario de lo que quiere, esto es EXACTAMENTE lo que quería. Los nombres de las ramas no importan, siempre puedes cambiarlos.
a3y3
56

Nota: si estaba encendido Branch1, con Git 2.0 (Q2 2014) podrá escribir:

git checkout Branch2
git rebase -

Ver commit 4f40740 por Brian Gesiakmodocache :

rebase: permitir " -" abreviatura para la rama anterior

Enseñe rebase la misma taquigrafía que checkouty mergepara nombrar la rama a rebasela rama actual en; es decir, que " -" significa "la rama en la que estábamos anteriormente".

VonC
fuente
26
agradable, pero también un poco peligroso. a veces la verbosidad gana. pero, de nuevo, también me gusta Java ... (-:
sthzg
3

Sé que pediste a Rebase, pero en su lugar elegiría Cherry los commits que quería mover de Branch2 a Branch1. De esa manera, no necesitaría preocuparme sobre qué rama se creó a partir del maestro, y tendría más control sobre la fusión.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Craigo
fuente