-
1. Ξεκινώντας με το Git
-
2. Τα θεμελιώδη στοιχεία του Git
-
3. Διακλαδώσεις στο Git
-
4. Το Git στον διακομιστή
- 4.1 Τα πρωτόκολλα
- 4.2 Εγκατάσταση του Git σε διακομιστή
- 4.3 Δημιουργία δημόσιου κλειδιού SSH
- 4.4 Στήσιμο του διακομιστή
- 4.5 Δαίμονες του Git
- 4.6 Έξυπνο HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Επιλογές φιλοξενίας από τρίτους
- 4.10 Ανακεφαλαίωση
-
5. Κατανεμημένο Git
-
6. GitHub
-
7. Εργαλεία του Git
- 7.1 Επιλογή αναθεώρησης
- 7.2 Διαδραστική εργασία με το στάδιο καταχώρισης
- 7.3 stash και clean
- 7.4 Υπογραφή της δουλειάς μας
- 7.5 Αναζήτηση
- 7.6 Η ιστορία ξαναγράφεται
- 7.7 Απομυθοποίηση της reset
- 7.8 Συγχωνεύσεις για προχωρημένους
- 7.9 Rerere
- 7.10 Αποσφαλμάτωση με το Git
- 7.11 Λειτουργικές υπομονάδες
- 7.12 Δεμάτιασμα δεδομένων
- 7.13 Replace
- 7.14 Αποθήκευση διαπιστευτηρίων
- 7.15 Ανακεφαλαίωση
-
8. Εξατομίκευση του Git
-
9. Το Git και άλλα συστήματα
- 9.1 Το Git ως πελάτης
- 9.2 Μετανάστευση στο Git
- 9.3 Ανακεφαλαίωση
-
10. Εσωτερική λειτουργία του Git
- 10.1 Διοχετεύσεις και πορσελάνες
- 10.2 Αντικείμενα του Git
- 10.3 Αναφορές του Git
- 10.4 Πακετάρισμα αρχείων
- 10.5 Τα refspec
- 10.6 Πρωτόκολλα μεταφοράς
- 10.7 Διατήρηση και ανάκτηση δεδομένων
- 10.8 Μεταβλητές περιβάλλοντος
- 10.9 Ανακεφαλαίωση
-
A1. Appendix A: Το Git σε άλλα περιβάλλοντα
- A1.1 Γραφικές διεπαφές
- A1.2 Το Git στο Visual Studio
- A1.3 Git στο Eclipse
- A1.4 Το Git στο Bash
- A1.5 Το Git στο Zsh
- A1.6 Το Git στο Powershell
- A1.7 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Εντολές Git
- A3.1 Ρύθμιση και διαμόρφωση
- A3.2 Λήψη και δημιουργία έργων
- A3.3 Βασική λήψη στιγμιοτύπων
- A3.4 Διακλάδωση και συγχώνευση
- A3.5 Κοινή χρήση και ενημέρωση έργων
- A3.6 Επιθεώρηση και σύγκριση
- A3.7 Αποσφαλμάτωση
- A3.8 Επιθέματα
- A3.9 Ηλεκτρονικό ταχυδρομείο
- A3.10 Εξωτερικά Συστήματα
- A3.11 Διοίκηση
- A3.12 Εντολές διοχέτευσης
3.4 Διακλαδώσεις στο Git - Ροές εργασίας με διακλαδώσεις
Ροές εργασίας με διακλαδώσεις
Τώρα που γνωρίζουμε τα βασικά των διαδικασιών διακλάδωσης και συγχώνευσης, το ερώτημα που τίθεται είναι τι μπορούμε ή τι θα έπρεπε να κάνουμε με αυτά; Σε αυτήν την ενότητα θα καλύψουμε μερικές συνήθεις ροές εργασιών που καθίστανται δυνατές χάρη σε αυτού του είδους την ελαφριά διαδικασία διακλάδωσης, ώστε να αποφασίσουμε αν θέλουμε να τις ενσωματώσουμε στον δικό μας κύκλο ανάπτυξης ενός έργου.
Μακρόβιοι κλάδοι
Επειδή το Git χρησιμοποιεί μία απλή τριμερή συγχώνευση, η συγχώνευση ενός κλάδου με κάποιον άλλο πολλές φορές κατά τη διάρκεια μία μακράς περιόδου είναι γενικά εύκολη. Αυτό σημαίνει ότι είναι δυνατό να έχουμε πολλούς κλάδους που είναι συνεχώς ανοιχτοί και τους οποίους χρησιμοποιούμε σε διαφορετικά στάδια του κύκλου ανάπτυξης του έργου· μπορούμε να συγχωνεύουμε συχνά κάποιους από αυτούς σε άλλους.
Πολλοί προγραμματιστές που χρησιμοποιούν το Git έχουν μία ροή εργασιών που ταιριάζει με αυτήν την προσέγγιση. Για παράδειγμα στον κλάδο master
έχουν αποκλειστικά κώδικα που είναι απολύτως σταθερός (stable) —πιθανότατα μόνον κώδικα που έχει εκδοθεί ή θα εκδοθεί.
Έχουν έναν άλλο παράλληλο κλάδο που τον ονομάζουν develop
ή next
στον οποίο δουλεύουν ή στον οποίο ελέγχουν την ευστάθεια —αυτός δεν είναι απαραίτητα σταθερός, αλλά όποτε καθίσταται σταθερός ενδεχομένως συγχωνεύεται με τον κλάδο master
.
Ο κλάδος αυτός χρησιμοποιείται για να ενσωματώνει θεματικούς κλάδους (βραχύβιους κλάδους, όπως ο κλάδος iss53
που είδαμε προηγουμένως) όταν αυτοί είναι έτοιμοι ώστε να επιβεβαιώσουν ότι περνούν όλες τις δοκιμασίες και δεν εισάγουν σφάλματα (bugs).
Στην πραγματικότητα, μιλάμε για δείκτες που προχωρούν στη γραμμή των υποβολών που κάνουμε. Οι σταθεροί κλάδοι βρίσκονται πολύ πίσω στο ιστορικό υποβολών και οι πειραματικοί, καινοτόμοι κλάδοι βρίσκονται πολύ μπροστά στο ιστορικό.

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

Μπορούμε να συνεχίζουμε να κάνουμε κάτι τέτοιο για πολλά επίπεδα ευστάθειας.
Κάποια μεγαλύτερα έργα έχουν επίσης έναν κλάδο proposed
ή pu
(proposed updates) που έχει ενσωματωμένους κλάδους, οι οποίοι ενδεχομένως δεν είναι έτοιμοι να εισαχθούν στον κλάδο next
ή τον κλάδο master
.
Η λογική είναι ότι οι κλάδοι βρίσκονται σε διαφορετικά επίπεδα ευστάθειας· όταν φτάσουν σε ένα πιο σταθερό επίπεδο, συγχωνεύονται με τον κλάδο που βίσκεται από πάνω τους.
Επαναλαμβάνουμε ότι το να έχουμε πολλούς μακρόβιους κλάδους δεν είναι απαραίτητο, αλλά συχνά είναι χρήσιμο, ειδικά όταν έχουμε πολύ μεγάλα ή περίπλοκα έργα.
Θεματικοί κλάδοι
Από την άλλη, οι θεματικοί κλάδοι είναι χρήσιμοι σε έργα οποιουδήποτε μεγέθους. Ένας θεματικός κλάδος είναι ένας βραχύβιος κλάδος, τον οποίο δημιουργούμε και χρησιμοποιούμε αποκλειστικά για ένα συγκεκριμένο χαρακτηριστικό ή κάποια σχετική με αυτό εργασία. Αυτό είναι κάτι που πιθανότατα δεν έχουμε κάνει ποτέ σε ένα VCS στο παρελθόν, διότι γενικά η διαδικασία δημιουργίας και συγχώνευσης κλάδων είναι μία ακριβή διαδικασία. Όμως στο Git είναι σύνηθες να δημιουργούμε κλάδους, να εργαζόμαστε σε αυτούς, να τους συγχωνεύουμε και να τους διαγράφουμε πολλές φορές κάθε μέρα.
Αυτό το είδαμε στην προηγούμενη ενότητα με τους κλάδους iss53
και hotfix
που δημιουργήσαμε.
Κάναμε μερικές υποβολές και τους διαγράψαμε αμέσως αφού τους συγχωνεύσαμε με τον κύριο κλάδο.
Αυτή η τεχνική μας επιτρέπει να αλλάζουμε περιβάλλον γρήγορα και πλήρως —επειδή η εργασία μας είναι διαχωρισμένη σε κλάδους-σιλό στους οποίους όλες οι αλλαγές έχουν να κάνουν με αυτό θέμα, είναι ευκολότερο να να δούμε τι ακριβώς έχει γίνει κατά την επανεξέταση του κώδικα (code review) ή κάποια άλλη σχετική διαδικασία.
Μπορούμε να διατηρήσουμε τις αλλαγές εκεί για λεπτά, μέρες ή μήνες, να τις συγχωνεύσουμε όταν είναι έτοιμες για συγχώνευση ανεξάρτητα από τη χρονική σειρά με την οποία έχουν γίνει ή έχουν δουλευτεί.
Για παράδειγμα ας υποθέσουμε ότι έχουμε κάνει κάποια δουλειά (στον κλάδο master
), δημιουργήσαμε έναν κλάδο για ένα πρόβλημα (iss91
), δουλέψαμε σε αυτό για λίγο, δημιουργήσαμε έναν άλλο κλάδο για να δοκιμάσουμε έναν άλλο τρόπο να επιλύσουμε το ίδιο πρόβλημα (iss91v2
), επιστρέψαμε στον κλάδο master
και δουλέψαμε εκεί για λίγο και από κει φτιάξαμε έναν άλλο κλάδο για να δουλέψουμε πάνω σε κάποια ιδέα για την οποία δεν είμαστε σίγουροι ότι είναι καλή ιδέα (κλάδος dumbidea
).
Το ιστορικό υποβολών θα είναι περίπου σαν το παρακάτω:

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

dumbidea
και iss91v2
.θα δούμε με περισσότερες λεπτομέρειες τις διάφορες δυνατές ροές εργασίας για τα έργα μας στο Git στο κεφάλαιο [ch05-distributed-git], συνεπώς προτού αποφασίσουμε ποιο μοντέλο διακλαδώσεων θα χρησιμοποιήσούμε στο επόμενο έργο μας, καλό θα είναι να έχουμε διαβάσει αυτό το κεφάλαιο.
Όταν τα κάνουμε όλα αυτά είναι σημαντικό να θυμόμαστε ότι αυτοί οι κλάδοι είναι απολύτως τοπικοί. Όταν δημιουργούμε ή συγχωνεύουμε διακλαδώσεις, τα πάντα συμβαίνουν στο τοπικό μας αποθετήριο Git —δεν υπάρχει καμία επικοινωνία με κανέναν διακομιστή.