-
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 Αποθέματα και Καθαρισμός
- 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 στο Visual Studio Code
- A1.4 Git στο IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git στο Sublime Text
- A1.6 Το Git στο Bash
- A1.7 Το Git στο Zsh
- A1.8 Το Git στο Powershell
- A1.9 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
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) εργασίας, από τα οποία κάθε τόσο κάποιες υποβολές, που έχουν δοκιμαστεί πλήρως, προκρίνονται σε άλλα, σταθερότερα σιλό.
Μπορούμε να συνεχίζουμε να κάνουμε κάτι τέτοιο για πολλά επίπεδα ευστάθειας.
Κάποια μεγαλύτερα έργα έχουν επίσης έναν κλάδο proposed ή pu (proposed updates) που έχει ενσωματωμένους κλάδους, οι οποίοι ενδεχομένως δεν είναι έτοιμοι να εισαχθούν στον κλάδο next ή τον κλάδο master.
Η λογική είναι ότι οι κλάδοι βρίσκονται σε διαφορετικά επίπεδα ευστάθειας· όταν φτάσουν σε ένα πιο σταθερό επίπεδο, συγχωνεύονται με τον κλάδο που βίσκεται από πάνω τους.
Επαναλαμβάνουμε ότι το να υπάρχουν πολλοί μακρόβιοι κλάδοι δεν είναι απαραίτητο, αλλά συχνά είναι χρήσιμο, ειδικά όταν έχουμε πολύ μεγάλα ή περίπλοκα έργα.
Θεματικοί κλάδοι
Από την άλλη, οι θεματικοί κλάδοι είναι χρήσιμοι σε έργα οποιουδήποτε μεγέθους. Ένας θεματικός κλάδος είναι ένας βραχύβιος κλάδος, τον οποίο δημιουργούμε και χρησιμοποιούμε αποκλειστικά για μία συγκεκριμένη λειτουργικότητα (feature) ή κάποια σχετική με αυτή εργασία. Αυτό είναι κάτι που πιθανότατα δεν έχουμε κάνει ποτέ σε ένα VCS στο παρελθόν, διότι γενικά η διαδικασία δημιουργίας και συγχώνευσης κλάδων είναι μία ακριβή διαδικασία. Όμως στο Git είναι σύνηθες κάποιος να δημιουργεί κλάδους, να εργάζεται με αυτούς, να τους συγχωνεύει και να τους διαγράφει πολλές φορές κάθε μέρα.
Αυτό το είδαμε στην προηγούμενη ενότητα με τους κλάδους iss53 και hotfix που δημιουργήσαμε.
Κάναμε μερικές υποβολές και τους διαγράψαμε αμέσως αφού τους συγχωνεύσαμε με τον κύριο κλάδο.
Αυτή η τεχνική μας επιτρέπει να αλλάζουμε περιβάλλον γρήγορα και πλήρως — επειδή η εργασία μας είναι διαχωρισμένη σε κλάδους-σιλό στους οποίους όλες οι αλλαγές έχουν να κάνουν με αυτό θέμα, είναι ευκολότερο να δούμε τι ακριβώς έχει γίνει κατά την επανεξέταση του κώδικα (code review) ή κάποια άλλη σχετική διαδικασία.
Μπορούμε να διατηρήσουμε τις αλλαγές εκεί για λεπτά, μέρες ή μήνες, να τις συγχωνεύσουμε όταν είναι έτοιμες για συγχώνευση ανεξάρτητα από τη χρονική σειρά με την οποία έχουν γίνει ή έχουν δουλευτεί.
Για παράδειγμα ας υποθέσουμε ότι έχουμε κάνει κάποια δουλειά (στον κλάδο master), δημιουργήσαμε έναν κλάδο για ένα πρόβλημα (iss91), δουλέψαμε σε αυτό για λίγο, δημιουργήσαμε έναν άλλο κλάδο για να δοκιμάσουμε έναν άλλο τρόπο να επιλύσουμε το ίδιο πρόβλημα (iss91v2), επιστρέψαμε στον κλάδο master και δουλέψαμε εκεί για λίγο και από κει φτιάξαμε έναν άλλο κλάδο για να δουλέψουμε πάνω σε κάποια ιδέα για την οποία δεν είστε σίγουροι ότι είναι καλή ιδέα (κλάδος dumbidea).
Το ιστορικό υποβολών θα είναι περίπου σαν το παρακάτω:
Ας υποθέσουμε τώρα ότι αποφασίσαμε ότι μας άρεσε η δεύτερη λύση, δηλαδή η iss91v2, στο πρόβλημα· επιπλέον δείξαμε τον κλάδο dumbidea στους συναδέλφους μας και αποδείχθηκε ότι είναι ιδιοφυής.
Μπορούμε να πετάξουμε τον αρχικό κλάδο iss91 (χάνοντας τις υποβολές C5 και C6) και να συγχωνεύσουμε αυτούς τους δύο.
Το ιστορικό τότε θα μοιάζει με το παρακάτω:
dumbidea και iss91v2.θα δούμε με περισσότερες λεπτομέρειες διάφορες δυνατές ροές εργασίας για τα έργα μας στο Git στο κεφάλαιο Κατανεμημένο Git. Γι' αυτό καλό θα είναι να έχουμε διαβάσει αυτό το κεφάλαιο προτού αποφασίσουμε ποιο μοντέλο διακλαδώσεων θα χρησιμοποιήσουμε στο επόμενο έργο μας.
Όταν τα κάνουμε όλα αυτά είναι σημαντικό να θυμόμαστε ότι αυτοί οι κλάδοι είναι μόνο τοπικοί. Όταν δημιουργούμε ή συγχωνεύουμε διακλαδώσεις, τα πάντα συμβαίνουν στο τοπικό μας αποθετήριο Git — δεν υπάρχει καμία επικοινωνία με κανέναν διακομιστή.