J'ai la situation suivante:
clone
(Y) à partir d'un référentiel principal (X), car il y avait beaucoup de gens qui travaillaient sur Y, nous n'avons pas fait de rebase
mais seulement merge
s. Lorsque nous voulons livrer (Push
) de Y à X, nous aimerions faire un rebase
afin d'avoir des choses agréables et propresLe problème est que lorsque vous effectuez rebase
, nous sommes invités à effectuer toutes les fusions que nous avons déjà effectuées dans les étapes merge
précédentes. Y a-t-il une solution à cela, à côté de celle qui signifie réellement refaire les fusions?
Je m'attendais à ce que ce soit assez simple puisque nous avons déjà résolu les fusions conflictuelles.
Le reclassement pour obtenir un historique "propre" est surfait. La meilleure façon si vous souhaitez conserver l'historique est simplement de faire la fusion au lieu d'un rebase. De cette façon, si vous avez besoin de revenir à une révision, c'est exactement le même que celui que vous avez testé pendant le développement. Cela résout également votre problème concernant les conflits de fusion précédemment résolus.
Si vous ne vous souciez pas de conserver l'historique, vous pouvez créer une nouvelle branche hors du maître, la vérifier, puis faire un git read-tree -u -m dev
pour mettre à jour votre arbre de travail afin qu'il corresponde à la branche dev
. Ensuite, vous pouvez tout valider en un seul gros commit et le fusionner dans master comme d'habitude.
git merge --squash
est maintenant ma façon préférée de rebaser après une grande quantité de travail et de nombreuses fusions ( voir cette réponse ). Si la branche sur laquelle vous travaillez s'appelle my-branch
et vous souhaitez rebaser à partir de master
, puis procédez comme suit:
git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit
Deux remarques:
git rerere
, ce qui est fait pour ce genre de situation.git rerere
.Vous pouvez prendre toutes les modifications dans votre branche et les placer dans un nouveau commit dans master
avec ce qui suit:
git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch
Ensuite, mettez en scène vos fichiers et validez.
En ce qui concerne la relecture des conflits de fusion, vous pouvez utiliser git rerere pour maintenir une base de données sur la façon dont les conflits de fusion ont déjà été résolus, de sorte que l'exécution d'un rebase qui entraîne les mêmes conflits aura automatiquement les parties laborieuses pour vous.
https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67
git config --global rerere.enabled true
La seule chose à surveiller est que si vous avez résolu quelque chose incorrectement , il sera automatiquement borked pour vous la prochaine fois aussi, et vous ne le réaliserez peut-être pas vraiment .
Documentation plus formelle ici: https://git-scm.com/docs/git-rerere