Non vedo il problema qui.
Lo hai già fatto ogni volta con il tuo masterramo, che continua a cambiare mentre le funzionalità vengono sviluppate e poi unite.
Quindi, nel tuo esempio concreto, devi prima creare il feature_xxx_backendramo e sviluppare le modifiche al back-end. Al termine, il ramo deve essere riesaminato e verrà unito in masteruna volta completata la revisione.
Quindi, è sufficiente avviare un altro ramo, feature_yyy_frontend. Probabilmente vorrai diramare direttamente feature_xxx_backend, in modo da avere quelle modifiche già nel tuo branc. quindi semplicemente sviluppare la funzionalità di frontend come fosse il ramo master.
Quando il feature_xxx_backendramo cambia, ad esempio perché durante la revisione ci sono cose che devono essere affrontate, è sufficiente apportare queste modifiche e unirle nel feature_yyy_frontendramo. Quindi continua sul ramo frontend.
Una volta completata la revisione del ramo back-end, viene unita master. A questo punto, sarebbe saggio rifare il feature_yyy_frontendramo su master, in modo che i revisori debbano solo rivedere le nuove modifiche a cui contribuisce questo ramo mastere non è necessario rivedere le modifiche apportate per il back-end (che sono già state approvate ).
Questo può essere fatto anche quando hai due, tre o più rami dipendenti. Se hai due rami di funzionalità su cui contare, crea semplicemente un ramo derivato in cui entrambe le funzioni sono state unite. Ramo da lì, sviluppa la terza funzione, unisci entrambi i rami di funzionalità lungo la strada quando ognuno di essi cambia. Quando entrambe le funzionalità sono terminate e vengono unite nel ramo derivato, si rifanno su quello o se si uniscono nel master, si rifanno al master.
Il rebasing (come suggerito sopra) è davvero potente e aiuta a tenere un registro pulito delle modifiche, rendendo le recensioni molto più facili.