J'ai un monolithe d'une branche de fonctionnalité. Au lieu d'un PR massif en master, je voudrais le diviser en 3 prs.
Idéalement, je veux extraire du code autonome de la branche de fonctionnalité dans un PR par lui-même. Ce code est dans un nouveau répertoire et n'est pas encore appelé, ce serait donc un PR relativement sûr. Cependant, au lieu de simplement copier le répertoire et de créer un seul commit et PR, je voudrais conserver tout l'historique des commit des changements pour le nouveau PR.
Est-ce possible avec Git? J'ai examiné la branche de filtre, mais il semble que ce soit pour diviser un dépôt en deux, pas pour diviser un diff de changements en deux (si cela a du sens).
existe-t-il un moyen d'extraire des fichiers d'une branche, y compris leur historique de validation, dans une nouvelle branche?
Vous tirez un commit , ce qui signifie un dépôt entier dans une branche, pas seulement quelques fichiers.
Une bonne option serait alors de réinitialiser les fichiers dont vous ne voulez pas dans leur pré-branche de contenu
--x--x--x (master)
\
y--y--y (branch B1 with mixed work)
\
z (new branch B2, but with some files reset to master)
B2
commence à partir de B1
et incluez les fichiers souhaités, avec leur historique.
Mais B2
inclut également d'autres fichiers de B1
que vous aimeriez être en tant que master
.
Vous pouvez faire (dans B2
) une git reset --soft master
: une git status
vous indiquerait toutes les modifications que vous devez effectuer pour que votre index reflète le maître. N'ajoutez simplement pas de modifications impliquant les fichiers que vous souhaitez conserver.
Et ne vous engagez pas. Vous voulez simplement replacer les modifications sur master
pour certains fichiers .
(Voir aussi " tilisations pratiques de git reset --soft
? ")
Une fois cela fait, un git reset --soft B2
déplace HEAD retour à B2
(mais avec un index enregistrant toutes les modifications et suppressions nécessaires pour refléter le maître pour les bons fichiers).
Vous pouvez maintenant valider, avec les autres fichiers revenus à master
et les fichiers que vous voulez intacts, identiques à B1
, avec leur histoire intacte.
Les requêtes pull Github concernent toujours une branche. Si vous souhaitez "fractionner une demande d'extraction", assurez-vous qu'elle est suffisamment bien divisée en validations, puis créez une branche pour chaque demande d'extraction que vous souhaitez effectuer et assurez-vous que chaque branche de fonctionnalité possède toutes les validations pertinentes.
Cela peut sembler une bonne stratégie pour vous de créer 3 branches à côté de votre branche principale, de sélectionner les validations pertinentes pour chaque branche, de les supprimer sur la principale et de fusionner la principale avec chacune des trois branches. Ensuite, vous pouvez également avoir un PR pour chaque branche et un historique partagé.
C'est ma solution préférée, mais dans ce cas, vous perdrez votre historique git. Si vous voulez vraiment le conserver, vous pouvez simplement le copier-coller dans le message de validation de chaque PR individuel.
Je passe normalement par la liste des fichiers modifiés et crée un fichier .patch pour chaque ensemble de modifications qui appartiennent à un PR distinct. Dans ce cas, ce serait un moyen très simple de séparer les modifications par répertoire.
Par exemple, ce qui suit mettrait les modifications apportées aux fichiers README.md et users_controllers.rb et à tous les fichiers du répertoire views dans un fichier de correspondance, qui pourrait ensuite être appliqué à la nouvelle branche. Ensuite, un nouveau PR peut être effectué.
Vérifiez d'abord la succursale avec le trop gros PR, puis
git diff master head -- README.md app/controller/users_controller.rb app/views > first_group_of_changes.patch