GIT fusiona master en una rama

49

He estado desarrollando una nueva función en una nueva sucursal y, por otro lado, he realizado bastantes cambios en mi sucursal maestra.

¿Es posible fusionar la rama maestra en mi nueva rama para mantenerla actualizada para que no tenga demasiados conflictos de fusión una vez que la nueva característica haya finalizado?

mnml
fuente
¿Has probado git-merge? Ayudar aquí .
karatedog

Respuestas:

56

Puede git merge mastero git rebase master, en este caso, preferiría git rebase .

Porque git rebasehace que los cambios en la rama de características se realicen además de los cambios en la rama maestra, lo que simplifica el gráfico de la versión.

Rebase

Tomando el ejemplo del manual de git rebase , git rebase masteren rama feature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

Sin embargo, git rebasesolo es adecuado cuando la rama no se ha distribuido, o habrá confusión y trabajo adicional en sentido descendente, porque los viejos compromisos A, B, C ahora se reemplazan por nuevos compromisos A ', B', C ', más F y G que no estaban allí antes.

El resultado real después git rebase masteren la rama featurees este:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

Los commits A, B, C cuelgan después del rebase, pero se puede acceder a ellos git reflog feature.

Unir

Si alguien ha tirado de su rama, o la ha empujado a alguna parte, debe fusionarse con ella para evitar confusiones y trabajo adicional en el otro extremo. Consulte Recuperación de rebase ascendente .

Este es el resultado de git merge masteren rama feature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

Alternativamente, si está git merge featureen la rama master, se vería así:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master
Christoffer Hammarström
fuente
Debe explicar por qué prefiere rebase y cuál es la diferencia. Rebase crea un historial lineal; esto podría no encajar en esta pregunta.
Andreas Rehm
Ok, si lo entiendo bien: ¿tengo que pagar la rama maestra si la nueva característica aún no está terminada y una nueva versión si está terminada?
mnml
No, con la rama de características desprotegida, haga git rebase master, y "cambiará" los cambios en la rama de características para que se "basen" en los cambios en la rama maestra. Si los cambios en la rama maestra entran en conflicto con los cambios en la rama característica, git le pedirá que los resuelva y continúe, los omita o cancele. Si no está seguro, puede verificar una rama de prueba para probarla git checkout -b test-feature feature(suponiendo que su rama de características se llame "característica").
Christoffer Hammarström
2
¿Qué quieres decir con "ya no puedo ver mi rama"? De todos modos, git rebasesolo se debe usar si la rama no se ha distribuido, lo que supuse que era el caso ya que dijiste que era una nueva rama, lo siento. Consulte Recuperación de rebase ascendente en los documentos a los que me vinculé . Tendrás que usar git mergeen su lugar. Y puede utilizarlo git reflogpara encontrar el encabezado de su rama de características anterior si desea recuperarlo.
Christoffer Hammarström
1
Nunca he visto una explicación más clara sobre las diferencias entre fusionar y rebase. Gracias.
Paulo Pedroso