Git
Chapters ▾ 2nd Edition

1.3 Ξεκινώντας - Οι βασικές γνώσεις για το Git

Οι βασικές γνώσεις για το Git

Με λίγα λόγια λοιπόν, τι είναι το Git? Το συγκεκριμένο κεφάλαιο είναι σημαντικό επειδή αν καταλάβεις τι είναι το Git και το πως δουλεύει, τότε θα είναι πιο εύκολο να το χρησιμοποιήσεις αποτελεσματικά. Καθώς μαθαίνεις το Git, προσπάθησε να αδειάσεις το μυαλό σου από γνώσεις που μπορεί να έχεις από άλλα συστήματα ελέγχου έκδοσης, όπως το Subversion και το Perforce. Με τον τρόπο αυτό θα σποφύγεις την όποια σύγχυση με τα υπόλοιπα συστήματα. Το Git αποθηκεύει και χρησιμοποιεί την πληροφορία με πολύ διαφορετικό τρόπο σε σχέση με τα υπόλοιπα συστήματα. Αν και η διεπαφή με τον χρήστη (user interface) είναι αρκετά παρόμοια, το να καταλάβεις τις διαφορές τους θα σε βοηθήσει ώστε να μην συγχέεις τα συστήματα μεταξύ τους.

Στιγμιότυπα, όχι διαφορές

Η βασικά διαφορά μεταξύ του Git και άλλων συστημάτων βρίσκεται στον τρόπο με τον οποίο το Git αντιλαμβάνεται τα δεδομένα. Τα υπόλοιπα συστήματα, εννοιολογικά, αποθηκεύουν την πληροφορία ως μια λίστα από αλλαγές σε αρχεία. Τα συστήματα αυτά (CVS, Subversion, Perforce, Bazaar και άλλα) αποθηκεύουν την πληροφορία ως μια σειρά από αρχεία και τις αλλαγές που έχουν γίνει στο κάθε αρχείο με την πάροδο του χρόνου.

Storing data as changes to a base version of each file.
Figure 4. Storing data as changes to a base version of each file.

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

Git stores data as snapshots of the project over time.
Figure 5. Storing data as snapshots of the project over time.

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

Σχεδόν κάθε λειτουργία εκτελείτε τοπικά

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

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

Αυτό επίσης σημαίνει ότι είναι πολύ λίγες οι λειτουργίες που δεν μπορείτε να κάνετε αν είστε εκτός σύνδεσης. Αν βρίσκεστε σε ένα αεροπλάνο ή στο τρένο και θέλετε να εργαστείτε, μπορείτε να υποβάλλετε τις αλλαγές σας χωρίς πρόβλημα, και να τις μεταφορτώσετε όταν επανέλθει η σύνδεση δικτύου. Αν πάτε σπίτι και δεν μπορείτε να συνδεθείτε μέσω του πελάτη (client) του εικονικού τοπικού σας δικτύου (Virtual Private Network, VPN), μπορείτε ακόμα να εργαστείτε. Σε πολλά άλλα συστήματα, οι παραπάνω λειτουργίες είναι είτε αδύνατες είτε επίπονες. Στο Perforce, για παράδειγμα, δεν μπορείς να πραγματοποιήσεις πολλές λειτουργίες αν δεν είσαι συνδεδεμένος στον διακομιστή. Στο Subversion και στο CVS μπορείς να επεξεργαστείς αρχεία αλλά δεν μπορείς να ύποβάλλεις τις αλλαγές στην βάση δεδομένων σου (επειδή βρίσκεται εκτός σύνδεσης). Τo παραπάνω μπορεί να μην φαίνεται μεγάλο ζήτημα, αλλά πιθανώς να εντυπωσιαστείτε από το πόσο μεγάλη διαφορά μπορεί να πραγματοποιήσει.

To Git έχει ακεραιότητα

Οτιδήποτε στο Git ελέγχεται αθροιστικά (check-summed) πριν αποθηκευτεί και έπειτα αναφέρεται με αυτό το άθροισμα ελέγχου. Αυτό σημαίνει ότι είναι αδύνατο κάποιος να αλλάξει το περιεχόμενο ενός αρχείου ή ενός καταλόγου χωρίς το Git να γνωρίζει για αυτό. Η λειτουργικότητα αυτή είναι ενσωματωμένη στο Git στα πιο χαμηλά του επίπεδα και είναι αναπόσπαστη της φιλοσοφίας του. Δεν μπορείς να χάσεις πληροφορία κατά τη μεταφορά ή να φθαρεί κάποιο αρχείο χωρίς το Git να μην το ανιχνεύσει.

Ο μηχανισμός που χρησιμοποιεί το Git για αυτόν τον αθροιστικό έλεγχο ονομάζεται κατακερματισμός SHA-1. Το SHA-1 είναι μια συμβολοσειρά 40 χαρακτήρων συγκροτημένη από δεκαεξαδικούς χαρακτήρες (0-9 και a-f) και υπολογίζεται με βάση τα περιεχόμενα ενός αρχείου ή μιας δομής καταλόγου στο Git. Μια συμβολοσειρά με κατακερματισμό SHA-1 φαίνεται κάπως έτσι:

24b9da6552252987aa493b52f8696cd6d3b00373

Θα παρατηρήσετε ότι αυτές οι κατακερματισμένες τιμές βρίσκονται παντού στο Git. Στην πραγματικότητα, το Git αποθηκεύει τα πάντα στην βάση δεδομένων του με βάση την κατακερματισμένη τιμή των περιεχομένων ενός αρχείου και όχι με βάση το όνομα του αρχίου.

Το Git γενικά μόνο προσθέτει δεδομένα

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

Αυτό κάνει την χρήση του Git πιο εύκολη καθώς μπορούμε να πειραματιστούμε χωρίς τον κίνδυνο να τα θαλασσώσουμε. Για μια πιο διεξοδική ματιά στο πως αποθηκεύει τα δεδομένα του το Git και πως μπορείτε να ανακτήσετε δεδομένα που φαίνονται χαμένα, δείτε το κεφάλαιο Αναιρώντας κάτι.

Οι τρεις καταστάσεις

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

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

Αυτό μας οδηγεί στις 3 βασικές κατηγορίες ενός έργου στο Git: ο κατάλογος του Git, ο κατάλογος εργασίας και η περιοχή καταχώρησης.

Working directory, staging area, and Git directory.
Figure 6. Working directory, staging area, and Git directory.

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

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

Η περιοχή καταχώρησης είναι ένα αρχείο το οποίο γενικά περιλαμβάνεται στον κατάλογο του Git. Στην περιοχή αυτή αποθηκεύονται πληροφορίες οι οποίες θα ενσωματωθούν και θα σταλούν στην επόμενη υποβολή του χρήστη. Κάποιες φορές η περιοχή αυτή ονομάζεται και ως το “ευρετήριο” αλλά είναι σύνηθες να αναφέρεσαι σε αυτήν και ως περιοχή καταχώρησης.

Η βασική ροή εργασίας του Git είναι κάπως έτσι:

  1. Τροποποιείς κάποια αρχεία στον κατάλογο εργασίας σου.

  2. Καταχωρείς τα αρχεία, προσθέτωντας στιγμιότυπα από αυτά στην περιοχή καταχώρησης.

  3. Πραγματοποιείς μιας υποβολή, η οποία θα πάρει τα αρχεία που βρίσκονται στην περιοχή καταχώρησης και αποθηκεύει αυτό το στιγμιότυπο μόνιμα στον κατάλογο του Git.

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