Quand il est recommandé d’utiliser vs
?
Dois-je toujours fusionner après un rebasage réussie ?
Quand il est recommandé d’utiliser vs
?
Dois-je toujours fusionner après un rebasage réussie ?
Alors, quand pensez-vous utiliser?
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.
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é
nous obtenons par la relocalisation:
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:
master
. 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:
En revanche, la fusion d'un sujet de branche en master:
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 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.