1834 votes

• Formulaire T2091(IND)

Quand il est recommandé d’utiliser vs ?

Dois-je toujours fusionner après un rebasage réussie ?

1292voto

Rob Di Marco Points 18048

Version Courte

  • Fusion prend tous les changements dans une branche et de les fusionner dans une autre branche dans un commit.
  • Cela dit je veux le point sur lequel j'ai bifurqué vers un nouveau point de départ

Alors, quand pensez-vous utiliser?

Fusion

  • Disons que vous avez créé une branche pour le développement d'une fonctionnalité unique. Lorsque vous souhaitez apporter ces changements maître, vous voulez probablement de fusion (vous n'avez pas de soins sur le maintien de tous les intermédiaires s'engage).

Rebase

  • Un deuxième scénario serait si vous avez commencé à faire quelques aménagements et puis un autre développeur a aucun changement. Vous voulez probablement à tirer et puis rebase à la base de vos modifications de la version actuelle de la prise en pension.

461voto

J'ai expérimenté avec un dépôt de test et j'ai finalement je l'ai eu :) :)!

C'est simple, avec rebase vous dites d'utiliser une autre branche que la nouvelle base pour votre travail...

Si vous avez par exemple une branche master et de créer une branche pour mettre en œuvre une nouvelle fonctionnalité, dites que vous nommez cool-fonction, bien sûr, la branche master est la base de votre nouvelle fonctionnalité.

Maintenant à un certain point, vous voulez ajouter la nouvelle fonctionnalité vous mis en œuvre dans le maître de la branche. Vous pouvez simplement passer à maîtriser et à fusionner les frais de fonctionnalité de la branche:

$git checkout master
$git merge cool-feature

mais de cette façon, un nouveau mannequin commettre est ajouté, si vous voulez éviter de spaghetti-histoire et bien sûr être plus sexy vous pouvez rebase:

$git checkout master
$git rebase cool-feature

Sinon, si vous voulez résoudre les conflits dans votre thème branche comme VonC suggéré, vous pouvez rebase vous branche de cette façon:

$git checkout cool-feature
$git rebase master

et puis les fusionner en master:

$git checkout master
$git merge cool-feature

Cette fois, car le sujet de la branche a la même commet de master plus les commits avec la nouvelle fonctionnalité, la fusion sera juste une avance rapide ;)

Maintenant, la question est...est-ce correct? Est rebase juste un plus intelligente de fusion? Ai-je comprends bien la ou je rêve? Il est difficile de trouver de la bonne documentation sur rebase. J'espère que cela va aider et c'est correct.

280voto

VonC Points 414372

Pour compléter mon propre réponse mentionné par TSamper,

  • un rebase est souvent une bonne idée de le faire avant une opération de fusion, parce que l'idée est que vous intégrez dans votre succursale Y le travail de la direction générale B sur lesquels vous vous engagez.
    Mais encore une fois, avant la fusion, vous résoudre tout conflit dans votre branche (c'est à dire: "rebase", comme dans "la relecture de mon travail dans ma branche à partir d'un récent point de la branche B)
    Si fait correctement, la suite de la fusion à partir de votre branche à l' B peut être rapide-vers l'avant.

  • une fusion impact directement l'agence de destination B, ce qui signifie que les fusions mieux d'être trivial, sinon que la branche B peut être long à revenir à un état stable (le temps pour vous de résoudre tous les conflits)


le point de fusion après un rebase?

Dans le cas que je décris, je rebase B sur ma branche, juste pour avoir l'occasion de relire mon travail à partir d'un plus récent point de B, mais tout en restant dans ma branche.
Dans ce cas, une fusion est toujours nécessaire d'apporter mon "rejoué" travail sur B.

L'autre scénario (décrit dans Git Prêt par exemple), est de faire votre travail directement en B par le biais d'un rebase (qui ne conserver tous vos gentils s'engage, ou même vous donner la possibilité de re-commander par l'intermédiaire d'un rebase interactif).
Dans ce cas (où vous rebase tout en étant dans le B direction de), vous avez raison: aucune autre opération de fusion est nécessaire:

Un arbre git à défaut lorsque nous n'avons pas fusionné ni indexé

rebase1

nous obtenons par la relocalisation:

rebase3

Ce deuxième scénario est tout au sujet: comment puis-je obtenir de nouvelles fonctionnalité de retour en maître.

Mon point de vue, en décrivant la première rebase scénario, est de rappeler à tous qu'un rebase peut également être utilisé comme une étape préliminaire à celui (celle d'être "get new-fonction retour en maître").
Vous pouvez utiliser git rebase pour premier maître "dans" la nouvelle-branche: le rebase sera replay nouvelle fonctionnalité s'engage à partir de l' HEAD master, mais encore dans la nouvelle-branche, à faire passer à votre succursale de point de départ à partir d'un vieux maître s'engager à HEAD-master.
Qui vous permet de résoudre tous les conflits dans votre branche (ce qui signifie, dans l'isolement, tout en permettant la maîtrise de continuer à évoluer en parallèle, si votre résolution de conflits scène prend trop de temps).
Ensuite, vous pouvez passer en master et fusionner new-feature (ou rebase new-feature sur master si vous souhaitez conserver commet fait dans votre new-feature de la branche).

Donc:

  • "rebase vs fusion" peut être considéré comme deux manières d'importer une travailler sur, par exemple, master.
  • Mais "rebase puis fusionner" peut être un flux de travail pour résoudre les conflits dans l'isolement, puis faire revenir votre travail.

210voto

Andrew Arnott Points 35346

Beaucoup de réponses ici de dire que la fusion se transforme tous vos commits en un seul, et suggère donc d'utiliser rebase pour préserver vos commits. Ce qui est faux, si vous avez poussé votre s'engage déjà.

Fusion et ne pas effacer vos commits. Fusion préserve l'histoire! (il suffit de regarder gitk) Rebase réécrit l'histoire, ce qui est une Mauvaise Chose après que vous avez poussé .

L'utilisation de fusion -- pas rebase chaque fois que vous l'avez déjà poussé.

Voici Linus' (auteur de git) de prendre sur elle. C'est une très bonne lecture. Ou vous pouvez lire ma propre version de la même idée ci-dessous.

La relocalisation d'une branche master:

  • fournit une mauvaise idée de comment s'engage ont été créés
  • pollue maître avec un tas d'intermédiaires s'engage à ce que peut ne pas avoir été bien testé
  • pourrait en fait introduire construire des pauses sur ces intermédiaires s'engage en raison des modifications qui ont été apportées à maître entre le moment où le sujet initial de branche a été créée et quand il a été relocalisée.
  • permet de trouver de bons endroits en maître à la caisse difficile.
  • Les Causes de la date et l'heure sur s'engage à ne pas s'aligner avec leur ordre chronologique dans l'arbre. Donc, vous voyez que commettre Un précède commettre B en maître, mais n'engagent B a été écrit en premier. (Quoi?!)
  • Qui produit le plus de conflits parce que l'individu s'engage dans la rubrique branche peut impliquer des conflits de fusion qui doit être résolu individuellement (Encore couché dans l'histoire à propos de ce qui s'est passé dans chaque commit).
  • est une réécriture de l'histoire. Si la branche n'est relocalisée a été poussé n'importe où (partagé avec personne d'autre que vous-même), alors vous avez foiré tout le monde qui a cette branche depuis que vous avez réécrit l'histoire.

En revanche, la fusion d'un sujet de branche en master:

  • préserve l'histoire des lieux où sujet branches ont été créés, y compris d'éventuelles fusions de maître au sujet de la branche de l'aide à tenir à jour. Vous obtenez vraiment une idée précise de ce code que le développeur a été de travailler avec quand ils ont été la construction.
  • master est une branche de la plupart des fusions, et chacun de ces fusionner les commits sont généralement des "bons points" de l'histoire qui sont sûrs de vérifier parce que c'est là le sujet de la succursale a été prêt à être intégré.
  • tous les commits de la rubrique de la branche sont conservés, y compris le fait qu'ils étaient dans une rubrique de la branche, afin d'isoler ces changements est naturel et vous pouvez percer dans les cas nécessaires.
  • fusionner les conflits doivent être résolus une fois (au moment de la fusion), de sorte intermédiaire valider les modifications apportées dans la rubrique de la branche n'ont pas à être résolu de façon indépendante.
  • peut être fait à de multiples reprises en douceur. Si vous intégrez votre sujet branche de maître périodiquement, les gens peuvent continuer à construire sur le thème de la branche et elle peut continuer à être fusionnés de façon indépendante.

85voto

C.. Points 10739

La fusion signifie: Créer un nouveau commit qui fusionne mes changements dans la destination.

Cela signifie: Créer une toute nouvelle série de commits, à l'aide de mon ensemble actuel de commits que des conseils. En d'autres termes, le calcul de ce que mes modifications auraient regardé comme si j'avais commencé à faire depuis le moment je suis en année de référence. Après cela, par conséquent, vous pourriez avoir besoin de re-tester vos modifications et pendant le rebase, vous peut-être avoir un peu de conflits.

Compte tenu de cela, pourquoi feriez-vous cela? Juste pour garder l'histoire du développement claire. Disons que vous travaillez sur la caractéristique X et lorsque vous avez terminé, vous fusionner vos modifications. La destination de disposer désormais d'un commit unique qui permettrait de dire quelque chose le long des lignes de "Ajout de la fonction X". Maintenant, au lieu de les fusionner, si vous relocalisée et ensuite fusionné, le développement de la destination de l'histoire contient toutes l'individu s'engage dans une seule logique de la progression. Cela rend l'examen de change par la suite beaucoup plus facile. Imaginer combien il est difficile que vous pouvez trouver en revue l'histoire du développement si 50 développeurs ont été la fusion de diverses fonctions de tous les temps.

Cela dit, si vous avez déjà poussé la direction, vous travaillez en amont, vous ne devriez pas cela, mais au lieu de fusion. Pour les branches qui n'ont pas été poussé en amont, rebase, de test et de fusion.

Une autre fois, vous pourriez souhaiter pour rebase est quand vous voulez pour se débarrasser de commits de votre branche avant de le pousser en amont. Par exemple: s'Engage à ce que d'introduire un peu de débogage de code dès le début, et d'autres s'engage plus loin que la propreté du code. La seule façon de le faire est par la réalisation d'une rebase interactif: git rebase -i <branch/commit/tag>

Mise à JOUR: Vous souhaitez également utiliser rebase lorsque vous utilisez Git pour l'interface d'un système de contrôle de version ne prend pas en charge non-linéaire de l'histoire (la subversion par exemple). Lors de l'utilisation de git-svn pont, il est très important que les modifications que vous réinsèrent dans la subversion sont une liste séquentielle de changements sur le dessus des modifications les plus récentes dans le coffre. Il y a seulement deux façons de le faire: (1) recréer Manuellement les modifications et (2) à l'Aide de la commande rebase, qui est beaucoup plus rapide.

UPDATE2 : Une autre façon de penser à un rebase est qu'il permet une sorte de cartographie de développement de style pour le style acceptée dans le référentiel que vous avez commis. Disons que vous aimez à s'engager dans de tous petits morceaux. Vous avez un commit pour corriger une faute de frappe, un commit à se débarrasser de code inutilisé et ainsi de suite. Par le temps que vous avez terminé ce que vous devez faire, vous avez une longue série de commits. Maintenant, disons le dépôt que vous avez commis encourage les grands s'engage, donc pour le travail que vous faites, on pourrait s'attendre à l'une ou peut-être deux commits. Comment prenez-vous votre chaîne de livraisons et de les compresser à ce qui est prévu? Vous devez utiliser un rebase interactif et des courges, votre petit s'engage dans moins de plus gros morceaux. Le même est vrai si l'inverse était nécessaire - si votre style est un peu gros s'engage, mais l'opération a exigé de longues chaînes de petits commits. Vous pouvez utiliser un rebase d'en faire autant. Si vous avait fusionné au lieu de cela, vous avez maintenant greffé votre livraison de style sur le dépôt principal. Si il y a beaucoup de développeurs, vous pouvez imaginer combien il serait de suivre une histoire avec plusieurs commettre des styles après un certain temps.

UPDATE3: Does one still need to merge after a successful rebase? Oui, vous le faites. La raison en est que cela implique essentiellement un "décalage" de commits. Comme je l'ai dit ci-dessus, ces révisions sont calculés, mais si vous aviez 14 s'engage à partir du point de branchement, puis en supposant que rien ne va mal avec votre rebase, vous serez 14 s'engage à l'avance (le point vous êtes à la relocalisation sur) après le rebase est fait. Vous avez eu une branche avant de un rebase. Vous aurez une branche de la même longueur après. Vous avez encore le besoin de fusionner avant de publier vos modifications. En d'autres termes, cela autant de fois que vous le souhaitez (encore une fois, seulement si vous n'avez pas poussé vos modifications en amont). Fusionner seulement après que vous rebase.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X