Il y aurait eu un moyen simple de séparer votre nouveau développement de la branche principale sans vous placer dans cette situation regrettable: toute modification du coffre aurait dû être fusionnée quotidiennement dans votre branche de développement . (Votre client était-il vraiment si myope qu'il ne pouvait pas anticiper le besoin de réintégrer votre agence dans la ligne principale un jour?)
Quoi qu'il en soit, la meilleure approche est IMHO en essayant de refaire ce qui aurait dû se passer de première main:
- identifier la sémantique des modifications sur la ligne principale pour le jour 1 suivant la création de la branche. Appliquez-les à votre base de code actuelle aussi bien que vous le pouvez. Si c'était un "changement local", cela devrait être simple, s'il s'agissait d'un "refactoring transversal" comme le changement de nom d'une classe largement utilisée, appliquez-la de manière sémantique à votre base de code actuelle. Espérons qu'au cours de cette année aucun changement transversal contradictoire dans la base de code n'a été effectué sur "votre" branche, sinon cela pourrait devenir un véritable casse-tête.
- tester le résultat (ai-je mentionné que vous aviez besoin d'une bonne suite de tests pour cette tâche)? Corrige tous les bugs révélés par le test
- Répétez maintenant cette procédure pour les modifications apportées à la ligne principale pour le jour 2, puis le jour 3, etc.
Cela peut fonctionner lorsque les équipes se conforment strictement aux règles classiques du contrôle de version ("ne commettre que des états compilables et testés" et "se connecter tôt et souvent").
Après 365 répétitions (ou 250 si vous avez de la chance et que vous pouvez regrouper le travail pour les modifications du week-end), vous aurez presque terminé (presque, car vous devez ajouter le nombre de modifications apportées à la ligne principale pendant la période d'intégration. ). La dernière étape consistera à fusionner à nouveau la branche de développement mise à jour dans le coffre (afin de ne pas perdre l'historique de ce dernier). Cela devrait être facile, car techniquement, cela ne devrait remplacer que les fichiers affectés.
Et oui, je suis sérieux, il n’ya probablement pas de raccourci pour cela. Il se peut que les "portions quotidiennes" soient parfois trop petites, mais je ne m'attendrais pas à cela. Je suppose qu'il est plus probable que les portions quotidiennes deviennent trop grosses. J'espère que votre client vous paye vraiment bien pour cela, et que cela lui coûte tellement cher qu'il va apprendre de son échec.
Je devrais ajouter que vous pouvez également essayer ceci avec des côtés inversés - en réintégrant les modifications de votre branche par petites portions jusqu'à la ligne principale. Cela est peut-être plus simple lorsque sur votre branche dev, le nombre de modifications est beaucoup moins important que sur le tronc ou que la plupart des modifications ont eu lieu dans de nouveaux fichiers source qui ne font actuellement pas partie du tronc. On peut voir cela comme un "portage" d'une fonctionnalité d'un produit A (la branche dev) vers un produit quelque peu différent (état actuel du tronc). Mais si la majorité des refactorisations transversales ont été effectuées sur la ligne principale et qu'elles affectent votre nouveau code (les collisions de fusion 6500 semblent en être une preuve), il serait peut-être plus facile de le décrire en premier.