-
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 Εντολές διοχέτευσης
1.1 Ξεκινώντας με το Git - Σχετικά με τον έλεγχο εκδόσεων
Το κεφάλαιο αυτό ασχολείται με το πώς να ξεκινήσουμε με το Git. Θα ξεκινήσουμε αναφέροντας μερικά πράγματα για την ιστορία των εργαλείων ελέγχου εκδόσεων, έπειτα θα προχωρήσουμε στο πώς μπορεί κάποιος να εγκαταστήσει το Git στον υπολογιστή του και τελικά πώς να το ρυθμίσει, ώστε να μπορεί να ξεκινήσει να το δουλεύει.
Σχετικά με τον έλεγχο εκδόσεων
Τι είναι ο έλεγχος εκδόσεων και γιατί πρέπει να μας απασχολεί; Ο έλεγχος εκδόσεων είναι ένα σύστημα το οποίο καταγράφει αλλαγές σε ένα αρχείο ή σε ένα σύνολο αρχείων έτσι ώστε να μπορούμε να ανακαλέσουμε συγκεκριμένες εκδόσεις. Στα παραδείγματα του βιβλίου, τα αρχεία που θα χρησιμοποιήσουμε για έλεγχο εκδόσεων θα είναι αρχεία πηγαίου κώδικα λογισμικού αν και στην πραγματικότητα, θα μπορούσαμε να χρησιμοποιήσουμε αρχεία οποιουδήποτε τύπου.
Αν είμαστε γραφίστες ή σχεδιαστές ιστοσελίδων και θέλουμε να κρατήσουμε κάθε έκδοση μιας εικόνας ή μιας διάταξης (κάτι το οποίο είναι πολύ πιθανό) τότε ένα Σύστημα Ελέγχου Εκδόσεων (Version Control System --VCS) είναι μια πολύ σοφή επιλογή. Ένα τέτοιο σύστημα μάς επιτρέπει να επαναφέρουμε συγκεκριμένα αρχεία σε κάποια προγενέστερη κατάσταση, να επαναφέρουμε ακόμα και ολόκληρο έργο (project) σε προγενέστερη κατάσταση, να συγκρίνουμε αλλαγές με την πάροδο του χρόνου, να δούμε ποιος τροποποίησε τελευταίος κάτι που ενδεχομένως δημιουργεί κάποιο πρόβλημα, ποιος έθεσε ένα ζήτημα και άλλα πολλά. Η χρήση ενός συστήματος ελέγχου εκδόσεων σημαίνει επίσης ότι αν τα κάνουμε θάλασσα ή χάσουμε αρχεία, είναι εύκολο να τα ανακτήσουμε. Επιπλέον, όλες αυτές οι δυνατότητες προσφέρονται με πολύ μικρή επιβάρυνση.
Τοπικά συστήματα ελέγχου εκδόσεων
Η μέθοδος που επιλέγουν πολλοί για έλεγχο εκδόσεων αρχείων είναι να αντιγράφουν τα αρχεία σε ένα άλλο κατάλογο (πιθανότατα ένα χρονολογημένο κατάλογο αν είναι έξυπνοι). Αυτή η προσέγγιση είναι πολύ κοινή επειδή είναι τόσο απλή, συγχρόνως όμως είναι και πολύ επιρρεπής σε λάθη. Είναι εύκολο να ξεχάσει κανείς σε ποιον κατάλογο βρίσκεται και να γράψει στο λάθος αρχείο ή να αντιγράψει σε αρχεία που δεν ήθελε.
Για να μεταχειριστούν το συγκεκριμένο ζήτημα οι προγραμματιστές ανέπτυξαν από παλιά τοπικά συστήματα ελέγχου εκδόσεων. Τα συστήματα αυτά διέθεταν μια απλή βάση δεδομένων που κρατούσε όλες τις αλλαγές στα αρχεία σε έλεγχο εκδόσεων.

Ένα από τα πιο δημοφιλή συστήματα ελέγχου εκδόσεων ήταν το σύστημα RCS το οποίο διανέμεται ακόμα σε πολλούς υπολογιστές. Ακόμα και το δημοφιλές λειτουργικό Mac OS X περιλαμβάνει την εντολή rcs
όταν εγκαθίστανται τα Developer Tools.
Το RCS δουλεύει χρησιμοποιώντας συλλογές από επιθέματα (patches, ή διαφορές μεταξύ αρχείων) σε μια συγκεκριμένη μορφή στον δίσκο. Έπειτα, μπορεί να ξαναδημιουργήσει κάθε αρχείο όπως ήταν σε οποιοδήποτε χρονικό σημείο προσθέτοντας όλα τα επιθέματα.
Συγκεντρωτικά συστήματα ελέγχου εκδόσεων
Το επόμενο σημαντικό ζήτημα που αντιμετώπισαν οι προγραμματιστές ήταν η ανάγκη για συνεργασία με προγραμματιστές σε άλλα συστήματα. Για να ασχοληθούν με το συγκεκριμένο πρόβλημα, αναπτύχθηκαν τα συγκεντρωτικά συστήματα ελέγχου εκδόσεων (Centralized Version Control Systems, CVCS). Τα συστήματα αυτά, όπως τo CVS, το Subversion και το Perforce έχουν έναν διακομιστή (server) ο οποίος περιέχει όλα τα αρχεία και έναν αριθμό από πελάτες (clients) οι οποίοι ενημερώνουν τα αρχεία τους από αυτό το κεντρικό μέρος. Για πολλά χρόνια, αυτή η μέθοδος ήταν το πρότυπο για τα συστήματα ελέγχου εκδόσεων.

Η εγκατάσταση αυτή προσφέρει πολλά πλεονεκτήματα, ειδικά σε σχέση με τα τοπικά συστήματα ελέγχου εκδόσεων. Για παράδειγμα, όλοι γνωρίζουν σε ένα βαθμό με τι ασχολούνται οι υπόλοιποι σε ένα έργο. Οι διαχειριστές έχουν έλεγχο πάνω στο τι μπορεί και επιτρέπεται να κάνει ο καθένας. Επίσης, είναι πιο εύκολο να διαχειριστεί κανείς ένα συγκεντρωτικό σύστημα ελέγχου εκδόσεων από το να διαχειρίζεται τοπικές βάσεις δεδομένων σε κάθε πελάτη.
Παρόλα αυτά, η συγκεκριμένη εγκατάσταση έχει κάποια σημαντικά μειονεκτήματα. Το πιο προφανές είναι το γεγονός ότι μια βλάβη στον κεντρικό διακομιστή προκαλεί την αποτυχία όλου του συστήματος. Αν ο διακομιστής πέσει για μία ώρα, τότε κατά τη διάρκεια αυτής της ώρας κανείς δεν μπορεί να συνεργαστεί ή να αποθηκεύσει αλλαγές στο σύστημα ελέγχου εκδόσεων. Αν για παράδειγμα ο σκληρός δίσκος πάνω στον οποίο βρίσκεται η κεντρική βάση δεδομένων καταστραφεί και δεν έχουν κρατηθεί τα απαραίτητα αντίγραφα ασφαλείας τότε χάνονται τα πάντα. Ολόκληρο το ιστορικό του έργου χάνεται εκτός από στιγμιότυπα του έργου που μπορεί να έχουν κρατήσει στους υπολογιστές τους κάποιοι προγραμματιστές. Τα τοπικά συστήματα ελέγχου εκδόσεων πάσχουν από το ίδιο πρόβλημα —όταν το ιστορικό ενός έργου βρίσκεται σε ένα και μοναδικό μέρος τότε υπάρχει ο κίνδυνος να χαθούν τα πάντα.
Κατανεμημένα συστήματα ελέγχου εκδόσεων
Στο σημείο αυτό έρχονται τα κατανεμημένα συστήματα ελέγχου εκδόσεων. Σε ένα κατανεμημένο σύστημα (όπως το Git, το Mercurial, το Bazaar ή το Darcs) οι πελάτες δεν ενημερώνουν μόνο το τελευταίο στιγμιότυπο των αρχείων τους: αναπαράγουν εξ ολοκλήρου το αποθετήριο. Συνεπώς, στην περίπτωση που ο διακομιστής πέσει, τα τοπικά αποθετήρια που έχουν οι πελάτες μπορούν να χρησιμοποιηθούν ώστε να τον επαναφέρουν. Κάθε κλώνος είναι ένα πλήρες αντίγραφο όλων των δεδομένων.

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