(!) Γενικά καλό θα ήταν τα frontend/cli αποκλειστικά να χρησιμοποιούν κώδικα του backend και να μην τον αλλάζουν το καθένα για τις ανάγκες του (κακό practice, μπλέκεις τα μπούτια σου). Επίσης θεωρώ δεδομένο πως έχεις διαφορετικά directories για backend/frontend/cli, ή είναι αρκετά οργανωμένα ώστε το καθένα να έχει τα δικά του αρχεία και να τα ξεχωρίζεις εύκολα ( :') )
Ας θεωρήσουμε πως έχεις 3 branch ( backend, frontend, cli)
Δεδομένου του παραπάνω, φαίνεται πως τα branches frontend/cli χρειάζονται κώδικα που συνεχώς αλλάζει στο backend, άρα εφόσον στο "ιστορικό" τους τα ίδια δεν αλλάζουν κώδικα του backend, είναι αρκετά απλό να προσθέσεις στο ιστορικό αυτό και το κομμάτι ιστορικού του backend branch που ενημερώνει τον κώδικα που χρησιμοποιείς:
(εντός του branch που θέλεις να προσθέσεις τις αλλαγές του backend)
git rebase backend
Αυτό βέβαια θα γίνει ανώδυνα όταν δεν υπάρχουν conflict, δηλαδή όταν το ένα branch δεν αλλάζει κώδικα του άλλου.
Επίσης μπορείς να παίξεις με αυτό για να καταλάβεις γραφικά τι συμβαίνει.
Όσον αφορά το να έχεις διαφορετικά branch για κάθε μέρος του stack νομίζω είναι ότι καλύτερο μπορείτε να κάνετε εφόσον σας δίνεται μόνο 1 repository.
Προσωπικά θα έφτιαχνα 4ο branch το οποίο θα ονόμαζα κάτι του στυλ app-library
το οποίο θα περιείχε αποκλειστικά κώδικα που μοιράζονται τα υπόλοιπα branch. Έτσι θα είχα μια πιο καθαρή τοπολογία του κώδικα και απλα θα έκανα ενα rebase όταν κάτι άλλαζε σε αυτό.
Τελος, θα ήθελα να σημειώσω πως το κάθε branch είναι μια σειριακή εφαρμογή αλλαγών, η οποία έχει αρχή και τέλος.
(Αν αυτό δεν σου είναι τελείως ξεκάθαρο μπορείς να ξαναδείς τα μαθήματα του @nickie
για git ή να ψάξεις ότι παραπάνω θες μόνος σου -- υπάρχουν ατελείωτα resources)
Καλό θα ήταν (για λόγους καλής χρήσης του git) οι αλλαγές σου σε κάθε branch να αφορούν τον λόγο που το branch δημιουργήθηκε. Το git σε επιβραβεύει για αυτό κάνοντας την ζωή σου πιο εύκολη :D