Git
Chapters ▾ 2nd Edition

1.1 Ξεκινώντας - Σχετικά με τον έλεγχο έκδοσης

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

Σχετικά με τον έλεγχο έκδοσης

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

Αν είστε γραφίστας ή σχεδιαστής ιστοσελίδων και θέλετε να κρατήσετε κάθε έκδοση μια εικόνας ή μιας διάταξης (κάτι το οποίο είναι πολύ πιθανό) τότε ένα σύστημα ελέγχου έκδοσης (Version Control System - VCS) είναι μια πολύ σοφή επιλογή. Το σύστημα αυτό σας επιτρέπει να επαναφέρετε αρχεία σε προηγούμενη τους κατάσταση, να επαναφέρετε ολόκληρο έργο (project) σε προηγούμενη κατάσταση, να συγκρίνετε αλλαγές με την πάροδο του χρόνου, να δείτε ποιος τροποποίησε τελευταίος κάτι που μπορεί να δημιουργεί πρόβλημα, ποιος εισήγαγε ένα ζήτημα και άλλα πολλά. Η χρησιμοποίηση ενός συστήματος ελέγχου έκδοσης σημαίνει επίσης ότι αν τα θαλασσώσετε ή χάσετε αρχεία, είναι εύκολο να τα ανακτήσετε. Επιπλέον, όλες αυτές οι δυνατότητες προσφέρονται για πολύ μικρό κόστος.

Τοπικά συστήματα ελέγχου έκδοσης

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

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

Local version control diagram
Figure 1. Local version control.

Ένα από τα πιο δημοφιλή συστήματα ελέγχου έκδοσης ήταν το σύστημα RCS το οποίο διανέμεται ακόμα σε πολλούς υπολογιστές. Ακόμα και το δημοφιλές λειτουργικό Mac OS X περιλαμβάνει την εντολή rcs όταν εγκαθιστάτε τα Developer Tools. Το RCS δουλεύει χρησιμοποιώντας συλλογές από επιδιορθώσεις λογισμικού (patches, οι διαφορές μεταξύ αρχείων) σε μια συγκεκριμένη μορφή στον δίσκο. Έπειτα, μπορεί να ξαναδημιουργήσει κάθε αρχείο όπως ήταν σε οποιοδήποτε χρονικό σημείο προσθέτοντας όλα τις επιδιορθώσεις λογισμικού.

Συγκεντρωτικά συστήματα ελέγχου έκδοσης

Το επόμενο σημαντικό ζήτημα που αντιμετώπισαν ήταν η ανάγκη για συνεργασία με προγραμματιστές σε άλλα συστήματα. Για να ασχοληθούν με το συγκεκριμένο πρόβλημα, αναπτύχθηκαν τα συγκεντρωτικά συστήματα ελέγχου έκδοσης (Centralized Version Control Systems, CVCs). Τα συστήματα αυτά, όπως τo CVS, Subversion και το Perforce έχουν έναν διακομιστή (server) ο οποίος περιέχει όλα τα αρχεία και έναν αριθμό από πελάτες (clients) οι οποίοι ενημερώνουν τα αρχεία τους από αυτό το κεντρικό μέρος. Για πολλά χρόνια, αυτή η μέθοδος ήταν το πρότυπο για συστήματα ελέγχου έκδοσης.

Centralized version control diagram
Figure 2. Centralized version control.

Η εγκατάσταση αυτή προσφέρει πολλά πλεονεκτήματα, ειδικά σε σχέση με τα τοπικά συστήματα ελέγχου έκδοσης. Για παράδειγμα, όλοι γνωρίζουν σε ένα βαθμό με τι ασχολούνται οι υπόλοιποι σε ένα έργο. Οι διαχειριστές έχουν έλεγχο πάνω στο τι μπορεί και επιτρέπεται να κάνει ο καθένας. Επίσης, είναι πιο εύκολο να διαχειριστείς ένα συγκεντρωτικό σύστημα ελέγχου έκδοσης σε σχέση με το να διαχειρίζεσαι τοπικές βάσεις δεδομένων σε κάθε πελάτη.

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

Κατανεμημένα συστήματα ελέγχου έκδοσης

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

Distributed version control diagram
Figure 3. Distributed version control.

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