-
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 Εντολές διοχέτευσης
1.1 Ξεκινώντας με το Git - Σχετικά με τον έλεγχο εκδόσεων
Στο κεφάλαιο αυτό ασχολείται με το πώς θα ξεκινήσετε με το Git. Θα ξεκινήσουμε αναφέροντας μερικά πράγματα για την ιστορία των εργαλείων ελέγχου εκδόσεων (version control), έπειτα θα προχωρήσουμε στο πώς μπορεί κάποιος να εγκαταστήσει το Git στον υπολογιστή του και τελικά πώς να το ρυθμίσει, ώστε να μπορεί να ξεκινήσει να το χρησιμοποιεί. Στο τέλος αυτού του κεφαλαίου θα πρέπει να έχουμε καταλάβει γιατί υπάρχει το Git, γιατί πρέπει να το χρησιμοποιούμε θα είμαστε σε θέση να το ρυθμίσουμε.
Σχετικά με τον έλεγχο εκδόσεων
Τι είναι ο “έλεγχος εκδόσεων” και γιατί πρέπει να μας απασχολεί; Ο έλεγχος εκδόσεων είναι ένα σύστημα το οποίο καταγράφει αλλαγές σε ένα αρχείο ή σε ένα σύνολο αρχείων έτσι ώστε να μπορούμε να ανακαλέσουμε συγκεκριμένες εκδόσεις τους αργότερα. Στα παραδείγματα του βιβλίου, τα αρχεία που θα χρησιμοποιήσουμε για έλεγχο εκδόσεων θα είναι αρχεία πηγαίου κώδικα λογισμικού αν και στην πραγματικότητα, θα μπορούσαμε να χρησιμοποιήσουμε αρχεία οποιουδήποτε τύπου.
Αν είμαστε γραφίστες ή σχεδιαστές ιστοσελίδων και θέλουμε να κρατήσουμε κάθε έκδοση κάποιας εικόνας ή κάποιας σελιδοποίησης (κάτι το οποίο είναι εξαιρετικά πιθανό) τότε ένα Σύστημα Ελέγχου Εκδόσεων (Version Control System, VCS) είναι μια πολύ σοφή επιλογή. Ένα τέτοιο σύστημα μας επιτρέπει να επαναφέρουμε συγκεκριμένα αρχεία, ακόμα και ολόκληρο έργο (project) σε προγενέστερη κατάσταση, να συγκρίνουμε αλλαγές που έχουν γίνει με την πάροδο του χρόνου, να δούμε ποιος τροποποίησε τελευταίος κάτι που ενδεχομένως δημιουργεί κάποιο πρόβλημα, ποιος δημιούργησε κάποιο πρόβλημα και άλλα πολλά. Η χρήση ενός συστήματος ελέγχου εκδόσεων σημαίνει επίσης ότι αν τα κάνουμε θάλασσα ή χάσουμε αρχεία, είναι εύκολο να τα ανακτήσουμε. Επιπλέον, όλες αυτές οι δυνατότητες προσφέρονται με πολύ μικρή επιβάρυνση.
Τοπικά συστήματα ελέγχου εκδόσεων
Η προτιμώμενη από πολλούς μέθοδος για έλεγχο εκδόσεων είναι να αντιγράφουν τα αρχεία σε ένα άλλο φάκελο (πιθανότατα ένα χρονολογημένο κατάλογο αν είναι έξυπνοι). Αυτή η προσέγγιση είναι πολύ κοινή επειδή είναι τόσο απλή, συγχρόνως όμως είναι και πολύ επιρρεπής σε σφάλματα. Είναι εύκολο να ξεχάσουμε σε ποιον φάκελο βρίσκομαστε και να επεξεργαστουμε λάθος αρχείο ή να διαγράψουμε λάθος αρχεία.
Για να αντιμετωπίσουν αυτό το πρόβλημα οι προγραμματιστές ανέπτυξαν από παλιά τοπικά VCS που είχαν απλή βάση δεδομένων που κρατούσε όλες τις αλλαγές των αρχείων κάτω από έλεγχο εκδόσεων.
Ένα από τα πιο δημοφιλή VCS ήταν το σύστημα RCS το οποίο διανέμεται ακόμα σε πολλούς υπολογιστές. Το RCS δουλεύει χρησιμοποιώντας συλλογές από επιθέματα (patches) (που είναι οι διαφορές μεταξύ αρχείων) σε μια συγκεκριμένη μορφή στον δίσκο. Έπειτα, μπορεί να ξαναδημιουργήσει κάθε αρχείο όπως ήταν σε οποιοδήποτε χρονικό σημείο εφαρμόζοντας όλα τα επιθέματα.
Συγκεντρωτικά συστήματα ελέγχου εκδόσεων
Το επόμενο σημαντικό πρόβλημα που αντιμετώπισαν οι προγραμματιστές ήταν η ανάγκη για συνεργασία με προγραμματιστές άλλων συστημάτων. Για την αντιμετώπιση του συγκεκριμένου προβλήματος, αναπτύχθηκαν τα συγκεντρωτικά συστήματα ελέγχου εκδόσεων (Centralized Version Control Systems, CVCSs). Τα συστήματα αυτά (όπως το CVS, το Subversion και το Perforce) έχουν έναν διακομιστή (server), ο οποίος περιέχει όλα τα αρχεία και κάποιους πελάτες (clients) οι οποίοι ενημερώνουν (check out) τα αρχεία τους από αυτή την κεντρική τοποθεσία. Για πολλά χρόνια, αυτό ήταν και το καθιερωμένο πρότυπο για τα συστήματα ελέγχου εκδόσεων.
Αυτή η μέθοδος προσφέρει πολλά πλεονεκτήματα, ειδικά σε σχέση με τα τοπικά VCSs. Για παράδειγμα, ο καθένας γνωρίζει σε κάποιο βαθμό με τι ασχολούνται όλοι οι υπόλοιποι σε ένα έργο. Οι διαχειριστές ελέγχουν σε μεγάλο βαθμό τι επιτρέπεται να κάνει ο καθένας και επιπλέον η διαχείριση ενός συγκεντρωτικού συστήματος ελέγχου εκδόσεων είναι πολύ ευκολότερη από τη διαχείριση τοπικών βάσεων δεδομένων σε κάθε πελάτη.
Η συγκεκριμένη μέθοδος έχει όμως και σημαντικά μειονεκτήματα. Το πιο προφανές είναι το γεγονός ότι μια βλάβη στον κεντρικό διακομιστή προκαλεί την αποτυχία όλου του συστήματος. Αν ο διακομιστής πέσει για μία ώρα, τότε κατά τη διάρκεια αυτής της ώρας κανείς δεν μπορεί να συνεργαστεί με το VCS ή να αποθηκεύσει αλλαγές σε αυτό. Αν για παράδειγμα ο σκληρός δίσκος στον οποίο βρίσκεται η κεντρική βάση δεδομένων καταστραφεί και δεν έχουν κρατηθεί τα απαραίτητα αντίγραφα ασφαλείας τότε χάνονται τα πάντα — ολόκληρο το ιστορικό του έργου χάνεται εκτός από στιγμιότυπα (snapshots) του έργου που μπορεί να έχουν κρατήσει στους υπολογιστές τους κάποιοι προγραμματιστές. Τα τοπικά VCS πάσχουν από το ίδιο πρόβλημα — όταν το ιστορικό ενός έργου βρίσκεται σε ένα και μοναδικό μέρος τότε υπάρχει ο κίνδυνος να χαθούν τα πάντα.
Κατανεμημένα συστήματα ελέγχου εκδόσεων
Στο σημείο αυτό έρχονται τα κατανεμημένα (Distributed) DVCS. Σε ένα κατανεμημένο σύστημα (όπως το Git, το Mercurial ή το Darcs) οι πελάτες δεν ανακτούν μόνο το τελευταίο στιγμιότυπο των αρχείων τους, αλλά ολόκληρο το αποθετήριο (repository), συμπεριλαμβανομένης και ολόκληρου του ιστορικού. Συνεπώς, στην περίπτωση που ο διακομιστής πεθάνει, τα τοπικά αποθετήρια που έχουν οι πελάτες μπορούν να χρησιμοποιηθούν ώστε να επαναφέρουν τα δεδομένα του. Κάθε κλώνος είναι ένα πλήρες αντίγραφο ασφαλείας όλων των δεδομένων.
Επιπλέον, πολλά από αυτά τα συστήματα μπορούν να συνεργάζονται με πολλά απομακρυσμένα αποθετήρια, έτσι ώστε να μπορούμε να συνεργαστούμε με πολλές ομάδες και με διαφορετικούς τρόπους ταυτόχρονα στο ίδιο έργο. Αυτό μας επιτρέπει να δημιουργούμε διάφορους τύπους ροής εργασιών (workflows) όπως ιεραρχικά μοντέλα, που είναι αδύνατο να δημιουργήσουμε σε συγκεντρωτικά συστήματα.