746 votos

¿Cuándo se usa git rebase en lugar de git merge?

Cuándo se recomienda el uso git rebase vs. git merge?

¿Todavía necesito de mezcla después de una exitosa reajuste?

695voto

Rob Di Marco Puntos 18048

Versión Corta

  • Combinación de toma de todos los cambios en una rama y combinarlos en otra rama en un commit.
  • Reajuste dice quiero que el punto en el que me ramificada para pasar a un nuevo punto de partida

Así que cuando usted usar cualquiera de los dos?

Combinación

  • Digamos que usted ha creado una rama con la finalidad de desarrollar una sola característica. Cuando usted quiere traer a esos cambios maestro, usted probablemente querrá mezcla (no se preocupan por el mantenimiento de todos los provisionales de la cometa).

Reajuste de la

  • Un segundo escenario sería si usted empezó a hacer un poco de desarrollo y, a continuación, otro desarrollador ha realizado una relación de cambio. Usted probablemente querrá tirar y luego de reajuste a la base de los cambios de la versión actual de la repo.

202voto

VonC Puntos 414372

Para complementar mi respuesta mencionado por TSamper,

  • un rebase es muy a menudo una buena idea hacer antes de una fusión, porque la idea es que se integre en la sucursal Y la labor de la subdivisión B sobre la cual se mezcla.
    Pero de nuevo, antes de la fusión, de resolver cualquier conflicto en su rama (ej.: "reajuste", como en "replay de mi trabajo en mi rama a partir de un reciente desde el punto de sucursal B)
    Si se hace correctamente, la mezcla posteriores de su rama en rama B puede ser avanzar.

  • una combinación de impacto directamente el destino de la sucursal B, lo que significa que la funde mejor ser trivial, de lo contrario esa rama B puede ser mucho en volver a un estado estable (tiempo para resolver todos los conflictos)


el punto de fusión después de un reajuste?

En el caso que describo, me rebase B en mi rama, sólo para tener la oportunidad de repetir mi trabajo de una forma más reciente de punto de B, pero mientras estaba en mi rama.
En este caso, una combinación que aún es necesario traer a mi "reproducir" el trabajo en B.

El otro escenario (descrito en Git Listo , por ejemplo), es llevar su trabajo directamente en B a través de un rebase (que no conservan su bonito cometa, o incluso darle la oportunidad de re-ordenar a través de un sistema interactivo de reajuste).
En ese caso (cuando se rebase estando en la B, rama), usted tiene razón: no hay más mezcla que se necesita:

Un árbol git por defecto cuando no hemos fusionado ni rebasada

rebase1

llegamos por reajuste:

rebase3

El segundo escenario es todo acerca de: ¿cómo puedo obtener nueva característica en maestro.

Mi punto, describiendo el primer reajuste de la situación, es para recordar a todos que un rebase también puede ser utilizado como un paso preliminar para que (siendo "obtener nueva característica en master").
Usted puede utilizar rebase en primer lugar maestro "en" la nueva rama de la característica: el reajuste va a repetir de nuevo-característica de las confirmaciones de la HEAD master, pero todavía en la nueva rama de la característica, de manera efectiva, moviendo su rama punto de partida de un viejo maestro se comprometen a HEAD-master.
Que le permite resolver los conflictos en su rama (es decir, en el aislamiento, permitiendo maestro para continuar evolucionando en paralelo si la resolución de conflictos de la etapa de toma demasiado tiempo).
A continuación, puede cambiar a dominar y combinar new-feature (o rebase new-feature a master si desea conservar compromete a cabo en su new-feature rama).

Así:

  • "reajuste vs. fusión" puede ser visto como dos formas de importar un trabajo, digamos, master.
  • Pero "reajuste, a continuación, combinar" puede ser una válida de flujo de trabajo para resolver el conflicto en forma aislada, luego de traer de vuelta a tu trabajo.

160voto

Experimenté con una prueba de repositorio y yo finalmente lo conseguí :) :)!

Es muy sencillo, con el reajuste que indica el uso de otra rama como la nueva base para su trabajo de manera...

Si usted tiene por ejemplo una rama master y crear una rama para implementar una nueva característica, digamos que el nombre de cool-característica, curso de la rama principal es la base para su nueva función.

Ahora en un cierto punto en el que desea añadir la nueva característica implementada en el máster de la rama. Usted puede simplemente cambiar a dominar y combinar el cool-característica rama:

$git checkout master
$git merge cool-feature

pero de esta manera un nuevo maniquí de confirmación se añade, si se desea evitar el spaghetti-historia y, por supuesto, ser más sexy que puede rebase:

$git checkout master
$git rebase cool-feature

Alternativamente, si quieres resolver conflictos en el tema de la sucursal como VonC sugirió puede reajuste de la rama de esta manera:

$git checkout cool-feature
$git rebase master

y, a continuación, combinar en el master:

$git checkout master
$git merge cool-feature

Esta vez, ya que el tema de la sucursal tiene la misma se compromete de master plus la compromete con la nueva característica, la mezcla va a ser sólo un avance rápido ;)

Ahora la pregunta es...¿es correcto? Es rebase sólo de una forma más inteligente combinación? Comprendí bien o estaba soñando? Es difícil encontrar buena documentación sobre reajuste. Espero que esto ayude y sea correcta.

49voto

C.. Puntos 10739

Combinación de medios: Crear un nuevo commit que combina mis cambios en el destino.

Reajuste significa: Crear toda una nueva serie de confirmaciones, usando mi actual conjunto de confirmaciones como las indirectas. En otras palabras, calcular lo que mis cambios han mirado como si yo había comenzado a hacer de ellos desde el punto estoy de reajuste. Tras el reajuste, por lo tanto, es posible que necesite la repetición de la prueba los cambios, y durante el reajuste, que posiblemente tienen un par de conflictos.

Teniendo en cuenta esto, ¿por qué habrían de reajuste? Sólo para mantener el desarrollo de la historia claro. Digamos que usted está trabajando en función de X y cuando haya terminado, usted combinar los cambios. El destino ahora tendrá una única confirmación que iba a decir algo en la línea de", Añadió la característica X". Ahora, en lugar de la fusión, si se reajusta y luego se fusionaron, el destino, el desarrollo de la historia contendría todo el individuo se compromete en una sola progresión lógica. Esto hace que la revisión de los cambios posteriores a la mucho más fácil. Imaginar lo difícil que iba a encontrar a revisar la historia del desarrollo si el 50 desarrolladores fueron la fusión de varias características todo el tiempo.

Dicho esto, si usted ya ha empujado a la rama en la que estamos trabajando en la parte alta, usted no debe de reajuste, pero en lugar de mezcla. Para las ramas que no han sido empujados aguas arriba, de reajuste, de prueba y de mezcla.

En otro momento quizás desee rebase es cuando usted quiere deshacerse de las confirmaciones de su rama antes de empujar a los desarrolladores. Por ejemplo: Confirma que introducir algún código de depuración desde el principio y otros compromete aún más en la limpieza de ese código. La única manera de hacer esto es mediante la realización de un sistema interactivo de reajuste: git rebase -i <branch/commit/tag>

ACTUALIZACIÓN: también desea utilizar de reajuste cuando usted está usando Git a la interfaz de un sistema de control de versión que no es compatible con no-lineal de la historia (subversion, por ejemplo). Cuando se utiliza el git-svn puente, es muy importante que los cambios se mezcla de nuevo en la subversión son una lista secuencial de cambios en la parte superior de la mayoría de los cambios recientes en el tronco. Sólo hay dos maneras de hacerlo: (1) volver a crear Manualmente los cambios y (2) Mediante el reajuste de comandos, que es mucho más rápido.

UPDATE2 : Una manera de pensar en un reajuste es que permite una especie de mapeo de su estilo de desarrollo al estilo aceptado en el repositorio que se está comprometiendo. Digamos que le gusta comprometerse en pequeños pedazos minúsculos. Usted tiene un commit para corregir un error tipográfico, un commit para deshacerse de código no utilizado y así sucesivamente. Por el momento he terminado lo que tiene que hacer, tiene una larga serie de confirmaciones. Ahora digamos que el repositorio que se está comprometiendo a anima a gran cometa, así que por el trabajo que estás haciendo, sería de esperar uno o tal vez dos comete. ¿Cómo se toma la cadena de confirmaciones y comprimirlos a lo que se espera? Usted podría utilizar un sistema interactivo de reajuste y de squash de su diminuta comete en menos trozos más grandes. El mismo es verdad si el contrario era necesario - si su estilo era un par de grandes comete, pero el repo exigió largas cadenas de pequeño cometa. Usted podría usar un reajuste a hacerlo así. Si usted se habían fusionado en su lugar, ahora se han injertado con su confirmación de estilo en el repositorio principal. Si hay una gran cantidad de desarrolladores, se puede imaginar lo difícil que sería seguir una historia con diferentes cometer los estilos después de algún tiempo.

UPDATE3: Does one still need to merge after a successful rebase? Sí. La razón es que un reajuste implica esencialmente un "cambio" de cometa. Como he dicho anteriormente, estos comete calculado, pero si tenía 14 comete desde el punto de ramificación, a continuación, suponiendo que nada va mal con su reajuste, que será de 14 comete por delante (el punto en el que está reajuste a) después de que el reajuste se hace. Había una rama antes de un reajuste. Tendrás una sucursal de la misma longitud después. Usted todavía necesita la fusión antes de publicar los cambios. En otras palabras, el reajuste de la tantas veces como desee (de nuevo, sólo si no han hecho los cambios de aguas arriba). Combinar sólo después de reajuste.

41voto

guybrush Puntos 799

antes de fusionar/reajuste:

A <- B <- C    [master]
^
 \
  D <- E       [branch]

después git merge master:

A <- B <- C
^         ^
 \         \
  D <- E <- F

después git rebase master:

A <- B <- C <- D' <- E'

(A, B, C, D, E y F se compromete)

este ejemplo y mucho más ilustrado información acerca de git se puede encontrar aquí: http://excess.org/article/2008/07/ogre-git-tutorial/

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X