Git
Chapters ▾ 2nd Edition

3.4 Διακλαδώσεις στο Git - Ροές εργασίας με διακλαδώσεις

Ροές εργασίας με διακλαδώσεις

Τώρα που γνωρίζουμε τα βασικά των διαδικασιών διακλάδωσης και συγχώνευσης, το ερώτημα που τίθεται είναι τι μπορούμε ή τι θα έπρεπε να κάνουμε με αυτά; Σε αυτήν την ενότητα θα καλύψουμε μερικές συνήθεις ροές εργασιών που καθίστανται δυνατές χάρη σε αυτού του είδους την ελαφριά διαδικασία διακλάδωσης, ώστε να αποφασίσουμε αν θέλουμε να τις ενσωματώσουμε στον δικό μας κύκλο ανάπτυξης ενός έργου.

Μακρόβιοι κλάδοι

Επειδή το Git χρησιμοποιεί μία απλή τριμερή συγχώνευση, η συγχώνευση ενός κλάδου με κάποιον άλλο πολλές φορές κατά τη διάρκεια μία μακράς περιόδου είναι γενικά εύκολη. Αυτό σημαίνει ότι είναι δυνατό να έχουμε πολλούς κλάδους που είναι συνεχώς ανοιχτοί και τους οποίους χρησιμοποιούμε σε διαφορετικά στάδια του κύκλου ανάπτυξης του έργου· μπορούμε να συγχωνεύουμε συχνά κάποιους από αυτούς σε άλλους.

Πολλοί προγραμματιστές που χρησιμοποιούν το Git έχουν μία ροή εργασιών που ταιριάζει με αυτήν την προσέγγιση. Για παράδειγμα στον κλάδο master έχουν αποκλειστικά κώδικα που είναι απολύτως σταθερός (stable) —πιθανότατα μόνον κώδικα που έχει εκδοθεί ή θα εκδοθεί. Έχουν έναν άλλο παράλληλο κλάδο που τον ονομάζουν develop ή next στον οποίο δουλεύουν ή στον οποίο ελέγχουν την ευστάθεια —αυτός δεν είναι απαραίτητα σταθερός, αλλά όποτε καθίσταται σταθερός ενδεχομένως συγχωνεύεται με τον κλάδο master. Ο κλάδος αυτός χρησιμοποιείται για να ενσωματώνει θεματικούς κλάδους (βραχύβιους κλάδους, όπως ο κλάδος iss53 που είδαμε προηγουμένως) όταν αυτοί είναι έτοιμοι ώστε να επιβεβαιώσουν ότι περνούν όλες τις δοκιμασίες και δεν εισάγουν σφάλματα (bugs).

Στην πραγματικότητα, μιλάμε για δείκτες που προχωρούν στη γραμμή των υποβολών που κάνουμε. Οι σταθεροί κλάδοι βρίσκονται πολύ πίσω στο ιστορικό υποβολών και οι πειραματικοί, καινοτόμοι κλάδοι βρίσκονται πολύ μπροστά στο ιστορικό.

Κλάδοι γραμμικά μεταβαλλόμενης ευστάθειας
Figure 26. Κλάδοι γραμμικά μεταβαλλόμενης ευστάθειας.

Γενικά είναι ευκολότερο να τους σκεφτόμαστε σαν σιλό (silo)[2] εργασίας, από τα οποία κάθε τόσο κάποιες υποβολές που έχουν δοκιμαστεί πλήρως προκρίνονται σε άλλα, σταθερότερα σιλό.

Απομονωμένοι κλάδοι γραμμικά μεταβαλλόμενης ευστάθειας (κλάδοι σιλό).
Figure 27. Απομονωμένοι κλάδοι γραμμικά μεταβαλλόμενης ευστάθειας (κλάδοι σιλό).

Μπορούμε να συνεχίζουμε να κάνουμε κάτι τέτοιο για πολλά επίπεδα ευστάθειας. Κάποια μεγαλύτερα έργα έχουν επίσης έναν κλάδο proposed ή pu (proposed updates) που έχει ενσωματωμένους κλάδους, οι οποίοι ενδεχομένως δεν είναι έτοιμοι να εισαχθούν στον κλάδο next ή τον κλάδο master. Η λογική είναι ότι οι κλάδοι βρίσκονται σε διαφορετικά επίπεδα ευστάθειας· όταν φτάσουν σε ένα πιο σταθερό επίπεδο, συγχωνεύονται με τον κλάδο που βίσκεται από πάνω τους. Επαναλαμβάνουμε ότι το να έχουμε πολλούς μακρόβιους κλάδους δεν είναι απαραίτητο, αλλά συχνά είναι χρήσιμο, ειδικά όταν έχουμε πολύ μεγάλα ή περίπλοκα έργα.

Θεματικοί κλάδοι

Από την άλλη, οι θεματικοί κλάδοι είναι χρήσιμοι σε έργα οποιουδήποτε μεγέθους. Ένας θεματικός κλάδος είναι ένας βραχύβιος κλάδος, τον οποίο δημιουργούμε και χρησιμοποιούμε αποκλειστικά για ένα συγκεκριμένο χαρακτηριστικό ή κάποια σχετική με αυτό εργασία. Αυτό είναι κάτι που πιθανότατα δεν έχουμε κάνει ποτέ σε ένα VCS στο παρελθόν, διότι γενικά η διαδικασία δημιουργίας και συγχώνευσης κλάδων είναι μία ακριβή διαδικασία. Όμως στο Git είναι σύνηθες να δημιουργούμε κλάδους, να εργαζόμαστε σε αυτούς, να τους συγχωνεύουμε και να τους διαγράφουμε πολλές φορές κάθε μέρα.

Αυτό το είδαμε στην προηγούμενη ενότητα με τους κλάδους iss53 και hotfix που δημιουργήσαμε. Κάναμε μερικές υποβολές και τους διαγράψαμε αμέσως αφού τους συγχωνεύσαμε με τον κύριο κλάδο. Αυτή η τεχνική μας επιτρέπει να αλλάζουμε περιβάλλον γρήγορα και πλήρως —επειδή η εργασία μας είναι διαχωρισμένη σε κλάδους-σιλό στους οποίους όλες οι αλλαγές έχουν να κάνουν με αυτό θέμα, είναι ευκολότερο να να δούμε τι ακριβώς έχει γίνει κατά την επανεξέταση του κώδικα (code review) ή κάποια άλλη σχετική διαδικασία. Μπορούμε να διατηρήσουμε τις αλλαγές εκεί για λεπτά, μέρες ή μήνες, να τις συγχωνεύσουμε όταν είναι έτοιμες για συγχώνευση ανεξάρτητα από τη χρονική σειρά με την οποία έχουν γίνει ή έχουν δουλευτεί.

Για παράδειγμα ας υποθέσουμε ότι έχουμε κάνει κάποια δουλειά (στον κλάδο master), δημιουργήσαμε έναν κλάδο για ένα πρόβλημα (iss91), δουλέψαμε σε αυτό για λίγο, δημιουργήσαμε έναν άλλο κλάδο για να δοκιμάσουμε έναν άλλο τρόπο να επιλύσουμε το ίδιο πρόβλημα (iss91v2), επιστρέψαμε στον κλάδο master και δουλέψαμε εκεί για λίγο και από κει φτιάξαμε έναν άλλο κλάδο για να δουλέψουμε πάνω σε κάποια ιδέα για την οποία δεν είμαστε σίγουροι ότι είναι καλή ιδέα (κλάδος dumbidea). Το ιστορικό υποβολών θα είναι περίπου σαν το παρακάτω:

Πολλαπλοί θεματικοί κλάδοι.
Figure 28. Πολλαπλοί θεματικοί κλάδοι.

Ας υποθέσουμε τώρα ότι αποφασίσαμε ότι μας άρεσε η δεύτερη λύση, δηλαδή η iss91v2, στο πρόβλημα· επιπλέον δείξαμε τον κλάδο dumbidea στους συναδέλφους μας και αποδείχθηκε ότι είναι ιδιοφυής. Μπορούμε να πετάξουμε τον αρχικό κλάδο iss91 (χάνοντας τις υποβολές C5 και C6) και να συγχωνεύσουμε αυτούς τους δύο. Το ιστορικό τότε θα μοιάζει με το παρακάτω:

Ιστορικό μετά τη συγχώνευση των κλάδων `dumbidea` και `iss91v2`.
Figure 29. Ιστορικό μετά τη συγχώνευση των κλάδων dumbidea και iss91v2.

θα δούμε με περισσότερες λεπτομέρειες τις διάφορες δυνατές ροές εργασίας για τα έργα μας στο Git στο κεφάλαιο Κατανεμημένο Git, συνεπώς προτού αποφασίσουμε ποιο μοντέλο διακλαδώσεων θα χρησιμοποιήσούμε στο επόμενο έργο μας, καλό θα είναι να έχουμε διαβάσει αυτό το κεφάλαιο.

Όταν τα κάνουμε όλα αυτά είναι σημαντικό να θυμόμαστε ότι αυτοί οι κλάδοι είναι απολύτως τοπικοί. Όταν δημιουργούμε ή συγχωνεύουμε διακλαδώσεις, τα πάντα συμβαίνουν στο τοπικό μας αποθετήριο Git —δεν υπάρχει καμία επικοινωνία με κανέναν διακομιστή.