1.3 Ξεκινώντας με το Git - Τα βασικά του Git
Τα βασικά του Git
Τι είναι, λοιπόν, το Git με λίγα λόγια; Η συγκεκριμένη ενότητα είναι σημαντική επειδή αν καταλάβετε τι είναι το Git και πώς δουλεύει, θα είναι πιο εύκολο να το χρησιμοποιήσετε αποτελεσματικά. Καθώς μαθαίνετε το Git, προσπαθήστε να αδειάσετε το μυαλό σας από γνώσεις που μπορεί να έχετε για άλλα συστήματα ελέγχου έκδοσεων, όπως το Subversion και το Perforce. Με αυτό τον τρόπο θα αποφύγετε την όποια σύγχυση με τα υπόλοιπα συστήματα. Αν και η διεπαφή χρήστη του Git είναι παρόμοια με αυτές των άλλων VCS, το Git αποθηκεύει και αντιμετωπίζει τα δεδομένα με πολύ διαφορετικό τρόπο και η κατανόηση των διαφορών θα σας βοηθήσει να μην μπερδεύεστε όταν το χρησιμοποιείτε.
Στιγμιότυπα, όχι διαφορές
Η σημαντικότερη διαφορά ανάμεσα στο Git και τα άλλα συστήματα βρίσκεται στον τρόπο με τον οποίο το Git αντιλαμβάνεται τα δεδομένα. Τα περισσότερα συστήματα αποθηκεύουν τις πληροφορίες ως μια λίστα από αλλαγές σε αρχεία. Αυτά τα συστήματα (CVS, Subversion, Perforce, Bazaar και άλλα) αντιμετωπίζουν τις πληροφορίες που αποθηκεύουν ως ένα σύνολο αρχείων και αλλαγών που έχουν γίνει στα αρχεία με την πάροδο του χρόνου (αυτός ο τρόπος ονομάζεται συνήθως έλεγχος εκδόσεων βασισμένος στις διαφορές (delta-based).
Το Git δεν αντιλαμβάνεται ούτε αποθηκεύει δεδομένα με αυτό τον τρόπο. Αντίθετα, το Git αντιλαμβάνεται τα δεδομένα ως μια σειρά στιγμιοτύπων ενός μικροσκοπικού συστήματος αρχείων (file system). Κάθε φορά που δεσμεύετε (commit) ή αποθηκεύετε την κατάσταση του έργου σας, το Git παίρνει μια φωτογραφία της εικόνας των αρχείων σας εκείνη τη στιγμή και αποθηκεύει έναν δείκτη (reference) σε αυτό το στιγμιότυπο. Για να είναι πιο αποδοτικό, το Git δεν ξαναποθηκεύει ένα αρχείο, εφόσον αυτό δεν έχει τροποποιηθεί. Αντί γι' αυτό, αποθηκεύει έναν σύνδεσμο προς το προηγούμενο όμοιο αρχείο το οποίο έχει ήδη αποθηκευτεί. Το Git λοιπόν αντιλαμβάνεται τα δεδομένα περισσότερο σαν μία ροή από στιγμιότυπα.
Αυτή είναι μια πολύ σημαντική διαφορά μεταξύ του Git και σχεδόν όλων των υπόλοιπων συστημάτων ελέγχου εκδόσεων. Αναγκάζει το Git να αναθεωρήσει σχεδόν όλες τις πτυχές του ελέγχου εκδόσεων, που αντέγραψαν τα υπόλοιπα συστήματα από την προηγούμενη γενιά. Αυτό κάνει το Git να φαντάζει σαν ένα μίνι σύστημα αρχείων με πολλά εργαλεία φτιαγμένα πάνω σε αυτό παρά σαν ένα απλό VCS. Θα διερευνήσουμε κάποια από τα οφέλη που κερδίζετε όταν χρησιμοποιείτε τα δεδομένα με αυτό τον τρόπο όταν καλύψουμε τις διακλαδώσεις (branches) του Git [ch03-git-branching].
Σχεδόν όλες οι λειτουργίες εκτελούνται τοπικά
Οι περισσότερες λειτουργίες στο Git χρειάζονται μόνο τοπικά αρχεία και πόρους για να εκτελεστούν. Γενικά, δεν χρειάζεται να μεταφερθεί καμία πληροφορία από κάποιον άλλο υπολογιστή του δικτύου σας. Αν είστε συνηθισμένοι σε ένα συγκεντρωτικό VCS, όπου οι περισσότερες λειτουργίες καθυστερούν εξαιτίας του χρόνου απόκρισης του δικτύου, τότε αυτή η πτυχή του Git θα σας κάνει να νομίζετε ότι οι θεοί της ταχύτητας ευλόγησαν το Git με υπερκόσμιες δυνάμεις. Οι περισσότερες λειτουργίες στο Git φαίνονται σχεδόν στιγμιαίες, κυρίως λόγω του ότι το πλήρες ιστορικό του έργου βρίσκεται στον τοπικό σας δίσκο.
Για παράδειγμα, για να δείτε στο ιστορικό του έργου σας, το Git δεν χρειάζεται να λάβει το ιστορικό από τον διακομιστή και να το εμφανίσει στον χρήστη — χρειάζεται απλά να το διαβάσει από την τοπική σας βάση δεδομένων. Αυτό σημαίνει ότι μπορείτε να δείτε το ιστορικό του έργου σας σχεδόν στιγμιαία. Αν θέλετε να δείτε τις αλλαγές που εισήχθησαν ανάμεσα στην τρέχουσα έκδοση ενός αρχείου και στην έκδοσή του πριν από ένα μήνα, το Git θα εντοπίσει το αρχείο όπως ήταν πριν από ένα μήνα και θα κάνει έναν τοπικό υπολογισμό των διαφορών, αντί να ζητήσει από τον διακομιστή να το κάνει ή να τραβήξει την παλιά έκδοση του αρχείου και να υπολογίσει τις διαφορές τοπικά.
Αυτό σημαίνει επιπλέον ότι είναι πολύ λίγες οι λειτουργίες που δεν μπορείτε να κάνετε όταν είστε εκτός δικτύου ή δεν είστε συνδεδεμένοι στο VPN. Αν βρίσκεστε σε ένα αεροπλάνο ή στο τρένο και θέλετε να εργαστείτε, μπορείτε να υποβάλλετε τις αλλαγές σας χωρίς πρόβλημα (στο τοπικό σας αντίγραφο) και να τις μεταφορτώσετε όταν ξανασυνδεθείτε στο δίκτυο. Αν βρίσκεστε στο σπίτι σας και το VPN client σας δεν δουλεύει καλά και δεν μπορείτε να συνδεθείτε, μπορείτε ακόμα να εργαστείτε. Σε πολλά άλλα συστήματα, αυτό είναι είτε αδύνατο είτε επίπονο. Για παράδειγμα, στο Perforce δεν μπορείτε να κάνετε πολλά πράγματα αν δεν είστει συνδεδεμένοι με τον διακομιστή. Στο Subversion και το CVS μπορείτε να επεξεργαστείτε αρχεία, αλλά δεν είναι δυνατό υποβάλετε τις αλλαγές στη βάση δεδομένων σας, διότι δεν είστε συνδεδεμένοι με αυτή. Τα παραπάνω μπορεί να μην φαίνονται πολύ σημαντικά, αλλά θα εκπλαγείτε με το πόσο μεγάλη διαφορά μπορεί να κάνουν.
To Git έχει ακεραιότητα
Οτιδήποτε υπάρχει στο Git περνά από έλεγχο αθροίσματος (checksum) πριν αποθηκευτεί και έπειτα μπορείτε να αναφέρεστε σε αυτό το άθροισμα ελέγχου. Αυτό σημαίνει ότι είναι αδύνατο κάποιος να αλλάξει το περιεχόμενο ενός αρχείου ή ενός καταλόγου χωρίς το Git να το γνωρίζει. Η λειτουργικότητα αυτή είναι ενσωματωμένη στο Git στα χαμηλότερα επίπεδα και είναι αναπόσπαστη από τη φιλοσοφία του. Είναι αδύνατο να χαθεί πληροφορία κατά τη μεταφορά της ή να παραφθαρεί κάποιο αρχείο χωρίς το Git να το πάρει χαμπάρι.
Ο μηχανισμός που χρησιμοποιεί το Git για τον αθροιστικό έλεγχο ονομάζεται κατακερματισμός SHA-1. Το SHA-1 είναι μια συμβολοσειρά 40 δεκαεξαδικών ψηφίων (0-9 και a-f) και υπολογίζεται με βάση τα περιεχόμενα μιας δομής αρχείου ή φακέλου στο Git. Μια συμβολοσειρά με κατακερματισμό SHA-1 έχει αυτή τη μορφή:
24b9da6552252987aa493b52f8696cd6d3b00373
Θα βλέπετε αυτές τις κατακερματισμένες τιμές παντού στο Git. Μάλιστα, το Git αποθηκεύει τα πάντα στη βάση δεδομένων του με βάση την κατακερματισμένη τιμή των περιεχομένων ενός αρχείου και όχι με βάση το όνομα του αρχείου.
Το Git γενικά μόνο προσθέτει δεδομένα
Όταν κάνετε κάτι στο Git, σχεδόν πάντα προσθέτετε δεδομενα στη βάση δεδομένων του Git. Είναι σχεδόν αδύνατο να αναγκάσετε το σύστημα να κάνει κάτι που δεν αναιρείται ή να διαγράψει δεδομένα. Όπως σε κάθε σύστημα διαχείρισης ελέγχου εκδόσεων είναι δυνατό να χάσετε ή να μπουρδουκλώσετε αλλαγές που δεν έχουν υποβληθεί ακόμα, αλλά από τη στιγμή που υποβάλετε ένα στιγμιότυπο στο Git είναι πολύ δύσκολο να χαθεί, ειδικά αν ωθείτε (push) την τοπική σας βάση δεδομένων τακτικά σε κάποιο άλλο αποθετήριο.
Αυτό καθιστά τη χρήση του Git ευχάριστη διότι γνωρίζουμε ότι μπορείτε να πειραματιστείτε χωρίς να φοβόμαστε ότι θα τα κάνουμε μαντάρα. Μια πιο διεξοδική ματιά στο πώς αποθηκεύει τα δεδομένα του το Git και πώς μπορείτε να ανακτήσετε δεδομένα που φαίνονται χαμένα, υπάρχει στην ενότητα [r_undoing].
Οι τρεις καταστάσεις
Και τώρα προσοχή. Το παρακάτω είναι το βασικό πράγμα που πρέπει να θυμάστε για το Git, αν θέλετε η υπόλοιπη διαδικασία μάθησής του κυλήσει ομαλά. Τα αρχεία στο Git μπορούν να βρίσκονται σε τρεις κύριες καταστάσεις: τροποποιημένο, επισημασμένο και δεσμευμένο.
-
Τροποποιημένο σημαίνει ότι το αρχείο έχει αλλάξει, αλλά δεν έχει ακόμα δεσμευτεί στη βάση δεδομένων.
-
Επισημασμένο (staged) σημαίνει ότι ένα τροποποιημένο αρχείο της τρέχουσας έκδοσης όταν έχει επισημανθεί για βρίσκεται στο επόμενο υποβεβλημένο στιγμιότυπο.
-
Δεσμευμένο (commited) είναι ένα αρχείο όταν τα δεδομένα του είναι αποθηκευμένα με ασφάλεια στην τοπική βάση δεδομένων.
Αυτό μας φέρνει στις τρεις βασικές περιοχές ενός έργου στο Git: το δέντρο εργασίας, τον προθάλαμο και τον κατάλογο του Git.
Το δέντρο εργασίας είναι το στιγμιότυπο μίας έκδοσης του έργου. Τα αρχεία ανασύρονται (pulled) από τη συμπιεσμένη βάση δεδομένων του καταλόγου του Git και τοποθετούνται στον τοπικό δίσκο ώστε να τα χρησιμοποιήσετε ή να τα τροποποιήσετε.
Ο προθάλαμος είναι ένα αρχείο το οποίο γενικά περιλαμβάνεται στον κατάλογο σας του Git, στο οποίο είναι αποθηκευμένες πληροφορίες σχετικά με το τι θα υποβληθεί στην επόμενη δέσμευση (commit).
Το τεχνικό όνομα του προθαλάμου στην ορολογία του Git είναι "index
" (ευρετήριο), αλλά το όνομα "staging area
" (προθάλαμος) είναι επίσης σύνηθες.
Ο κατάλογος του Git είναι το μέρος όπου το Git αποθηκεύει τα μεταδεδομένα (metadata) και τη βάση δεδομένων των αντικειμένων του έργου. Αυτό είναι το πιο σημαντικό τμήμα του Git και είναι αυτό που αντιγράφεται όταν δημιουργείτε έναν κλώνο ενός αποθετηρίου από έναν άλλο υπολογιστή.
Η βασική ροή εργασίας του Git είναι κάτι σαν το εξής:
-
Τροποποιείτε κάποια αρχεία στον δεντρο εργασίας σας.
-
Επιλέγετε ποιες αλλαγές θέλετε να υποβληθούν στην επόμενη υποβολή, τοποθετώντας αυτές μόνο τις αλλαγές στον προθάλαμο.
-
Πραγματοποιείτε μια υποβολή, η οποία παίρνει τα αρχεία όπως είναι στον προθάλαμο και αποθηκεύει αυτό το στιγμιότυπο μόνιμα στον κατάλογο του Git.
Αν μια συγκεκριμένη έκδοση ενός αρχείου βρίσκεται στον κατάλογο του Git, θεωρείται υποβεβλημένο (committed). Αν έχει τροποποιηθεί και έχει προστεθεί στον προθάλαμο, ονομάζεται επισημασμένο (staged). Τέλος, αν έχει τροποποιηθεί από τότε που ανακλήθηκε αλλά δεν έχει επισημανθεί, τότε λέμε ότι είναι τροποποιημένο. Στο κεφάλαιο [ch02-git-basics], θα μάθετε περισσότερα για αυτές τις καταστάσεις και για το πώς μπορείτε να τις εκμεταλευτείτε ή να παρακάμψετε εντελώς τον προθάλαμο.