Git (λογισμικό)

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

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

## Ιστορικό

Η ανάπτυξη του Git ξεκίνησε αφού πολλοί προγραμματιστές του πυρήνα Linux σταμάτησαν την πρόσβαση στο BitKeeper, ένα ιδιοταγές (δηλαδή μη ανοικτού κώδικα) σύστημα ελέγχου εκδόσεων που χρησιμοποιόταν προηγουμένως για τη διατήρηση του έργου. Ο κάτοχος των πνευματικών δικαιωμάτων του BitKeeper, Larry McVoy, είχε αποσύρει την ελεύθερη χρήση του προϊόντος αφού ισχυρίστηκε ότι ο Andrew Tridgell είχε εφαρμόσει αντίστροφη μηχανική στα πρωτόκολλα του BitKeeper.

Ο Τόρβαλντς ήθελε ένα κατανεμημένο σύστημα που θα μπορούσε να χρησιμοποιηθεί σαν το BitKeeper, αλλά κανένα από τα διαθέσιμα ελεύθερα συστήματα δεν κάλυπτε τις ανάγκες του, ιδιαίτερα στην απόδοση. Ο Τόρβαλντς πήρε ένα παράδειγμα ενός συστήματος SCM που χρειαζότανε 30 δευτερόλεπτα για να εφαρμόσει μια διόρθωση και να ενημερώσει όλα τα συνδεδεμένα μεταδεδομένα και σημείωσε ότι αυτό δεν μπορούσε να ανταποκριθεί στις ανάγκες της ανάπτυξης του πυρήνα Linux, όπου ο συγχρονισμός με τους συνεργάτες του μπορούσε να απαιτήσει 250 τέτοιες ενέργειες τη φορά. Ήθελε η διόρθωση να κρατήσει 3 δευτερόλεπτα, και είχε αρκετά άλλα κριτήρια σχεδίασης κατά νου:

* να πάρει ταυτόχρονο σύστημα εκδόσεων (CVS) ως ένα παράδειγμα του τι να «μην» κάνει· αν υπήρχε αμφιβολία, να γίνει η ακριβώς αντίθετη απόφαση
* να υποστηρίξει μια διανεμόμενη, παρόμοια με το BitKeeper ροή εργασίας
* να έχει πολύ ισχυρές εγγυήσεις ενάντια σε αλλοίωση, είτε τυχαία είτε κακόβουλη.

Αυτά τα τρία κριτήρια απάλειψαν κάθε σύστημα ελέγχου εκδόσεων που υπήρχε τότε, εκτός από το Monotone. Εξετάζοντας την απόδοσή του, το απέρριψε και αυτό. Έτσι αμέσως μετά την έκδοση του πυρήνα Linux 2.6.12-rc2, ο Τόρβαλντς άρχισε να γράφει ένα δικό του.

Ο Τόρβαλντς δικαιολόγησε το όνομα **', που στην βρετανική αργκό σημαίνει κάτι σαν «ανεπιθύμητος», λέγοντας: «Είμαι ένα φαντασμένο άτομο και ονομάζω όλα τα έργα μου σύμφωνα με τον εαυτό μου. Πρώτα ήταν το [[Πυρήνας Linux|Λίνουξ]], τώρα το git». Άλλωστε και η σελίδα του εγχειριδίου ([[man page]]) περιγράφει το git ως «τον ηλίθιο εντοπιστή περιεχομένου».

Η ανάπτυξη του Git ξεκίνησε στις 3 Απριλίου 2005, ανακοινώθηκε στις 6  και έγινε [[self-hosting|αυτοφιλοξενούμενο]] (self-hosting) από τις 7 Απριλίου. Η πρώτη συγχώνευση των πολλαπλών κλάδων έγινε στις 18 Απριλίου. Ο Τόρβαλντς πέτυχε τους στόχους απόδοσης. Στις 29 Απριλίου, το νεότευκτο Git επιδόθηκε στην εφαρμογή διορθώσεων στο δέντρο του πυρήνα του Linux kernel με ένα ρυθμό 6.7 ανά δευτερόλεπτο. Στις 16 Ιουνίου το Git διαχειρίστηκε την έκδοση 2.6.12 του πυρήνα. Ο Τόρβαλντς παρέδωσε τη [[software maintenance|συντήρηση]] στις 26 Ιουλίου 2005 στον [[Junio Hamano]], έναν βασικό συνεργάτη του έργου. Ο Hamano ήταν υπεύθυνος για την έκδοση 1.0 στις 21 Δεκεμβρίου 2005 και από τότε παραμένει ο κύριος υπεύθυνος για την συντήρησή του.

== Σχεδίαση ==

Η σχεδίαση του Git εμπνεύστηκε από τα [[BitKeeper]] και [[Monotone (software)|Monotone]]. Το Git σχεδιάστηκε αρχικά ως μια μηχανή συστήματος ελέγχου σε έκδοση χαμηλού επιπέδου πάνω στην οποία άλλοι μπορούν να γράψουν προγράμματα προσκηνίου, όπως [[Cogito (software)|Cogito]] ή [[StGIT]]. Το έργο του πυρήνα του Git έχει γίνει από τότε μια πλήρης έκδοση συστήματος ελέγχου άμεσα χρησιμοποιήσιμη. Αν και επηρεάστηκε έντονα από το BitKeeper, ο Τόρβαλντς προσπάθησε εκούσια να αποφύγει συμβατικές προσεγγίσεις, που οδηγούν σε έναν μοναδικό σχεδιασμό.

=== Χαρακτηριστικά ===

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

;Ισχυρή υποστήριξη για μη γραμμική ανάπτυξη: Το Git υποστηρίζει γρήγορη κλωνοποίηση και συγχώνευση και περιλαμβάνει ειδικά εργαλεία οπτικοποίησης και περιήγησης του ιστορικού της μη γραμμικής ανάπτυξης. Μια βασική υπόθεση στο Git είναι ότι μια αλλαγή θα συγχωνεύεται πιο συχνά από ότι γράφεται, καθώς θα περνάει από διάφορες αναθεωρήσεις. Οι κλάδοι στο git είναι πολύ ελαφρείς: Ένας κλάδος στο git είναι απλά μια αναφορά σε μια απλή υποβολή. Με τις γονικές υποβολές, θα πρέπει να οικοδομείται μια πλήρης δομή του κλάδου.
;Διανεμόμενη ανάπτυξη: Όπως τα [[Darcs]], [[BitKeeper]], [[Mercurial]], [[SVK]], [[Bazaar (software)|Bazaar]] και [[Monotone (software)|Monotone]], το Git δίνει σε κάθε προγραμματιστή ένα τοπικό αντίγραφο του συνολικού ιστορικού της ανάπτυξης και οι αλλαγές αντιγράφονται από ένα τέτοιο αποθετήριο σε ένα άλλο αποθετήριο. Αυτές οι αλλαγές εισάγονται ως πρόσθετοι κλάδοι ανάπτυξης και μπορούν να συγχωνευθούν με τον ίδιο τρόπο όπως ένας τοπικά αναπτυσσόμενος κλάδος.
;Συμβατότητα με τα υπάρχοντα συστήματα/πρωτόκολλα: Τα αποθετήρια μπορούν να δημοσιευτούν μέσα από τα πρωτόκολλα [[Πρωτόκολλο Μεταφοράς Υπερκειμένου|HTTP]], [[File Transfer Protocol|FTP]], [[rsync]], ή Git μέσα από είτε μια απλή υποδοχή (plain socket), ή [[SSH]]. Το Git έχει επίσης μια προσομοίωση διακομιστή CVS, που ενεργοποιεί τη χρήση των υφιστάμενων πελατών CVS και των προσθέτων [[Ολοκληρωμένο περιβάλλον ανάπτυξης|IDE]] για να προσπελάσουν τα αποθετήρια Git. Τα αποθετήρια Subversion και svk μπορούν να χρησιμοποιηθούν άμεσα με git-svn.
;Αποτελεσματικό χειρισμό μεγάλων έργων:Ο Τόρβαλντς έχει περιγράψει το Git ότι είναι πολύ γρήγορο και κλιμακώσιμο. Οι δοκιμές απόδοσης που έγιναν από το [[Mozilla Firefox|Mozilla]] έδειξαν ότι είναι μια [[τάξη μεγέθους]] πιο γρήγορα από κάποια άλλα συστήματα ελέγχου έκδοσης και ότι η μεταφορά του ιστορικού της έκδοσης από ένα τοπικά αποθηκευμένο αποθετήριο μπορεί να είναι εκατό φορές πιο γρήγορο από την μεταφορά του από απομακρυσμένο διακομιστή.
;Κρυπτογραφική πιστοποίηση του ιστορικού:Το ιστορικό του Git αποθηκεύεται κατά τέτοιο τρόπο που το αναγνωριστικό μιας συγκεκριμένης έκδοσης (μιας ''υποβολής'' με όρους Git) εξαρτάται από το πλήρες ιστορικό ανάπτυξης που οδηγεί σε αυτήν την υποβολή. Μόλις δημοσιευτεί, δεν μπορεί να αλλαχθεί σε παλιότερες εκδόσεις χωρία αυτό να σημειωθεί. Η δομή είναι παρόμοια με ένα [[Δέντρο Merkle|δένδρο Merkle]], αλλά με πρόσθετα δεδομένα στους κόμβους καθώς και στα φύλλα. (Τα [[Mercurial]] και [[Monotone (software)|Monotone]] έχουν επίσης αυτήν την ιδιότητα.)
;Σχεδιασμός με βάση την εργαλειοθήκη: Το Git σχεδιάστηκε ως ένα σύνολο προγραμμάτων γραμμένων σε [[C (γλώσσα προγραμματισμού)|C]] και σε ένα αριθμό σεναρίων κελύφους που παρέχουν συσκευασίες για αυτά τα προγράμματα. Αν και τα περισσότερα από αυτά τα σενάρια έχουν από τότε ξαναγραφτεί σε C για καλύτερη ταχύτητα και φορητότητα, ο σχεδιασμός παραμένει και είναι εύκολο να δημιουργηθεί μια αλυσίδα των συστατικών μαζί.
;Προσθέσιμες στρατηγικές συγχώνευσης: Ως μέρος του σχεδιασμού της εργαλειοθήκης, το Git έχει ένα καλοσχεδιασμένο πρότυπο ατελούς συγχώνευσης και έχει πολλούς αλγόριθμους για συμπλήρωσή του, καταλήγοντας στην πληροφόρηση του χρήστη ότι δεν μπορεί να ολοκληρώσει τη συγχώνευση αυτόματα και απαιτείται χειροκίνητη επεξεργασία.
;Συσσωρεύει σκουπίδια (Garbage) εκτός και συλλεγούν αλλού: Η ματαίωση λειτουργιών ή η ανάκληση αλλαγών θα αφήσει άχρηστα αιωρούμενα αντικείμενα στη [[βάση δεδομένων]]. Αυτά είναι γενικά ένα μικρό κλάσμα του συνεχώς αυξανόμενου ιστορικού των επιθυμητών αντικειμένων. Το Git θα εκτελέσει αυτόματα τη [[Συλλογή απορριμάτων (υπολογιστές)|συλλογή σκουπιδιών]], όταν έχουν δημιουργηθεί αρκετά χαλαρά αντικείμενα στο αποθετήριο. Η συλλογή σκουπιδιών μπορεί να κληθεί ρητά  χρησιμοποιώντας το <code>git gc --prune</code>.
;Περιοδική ρητή συσκευασία αντικειμένων:Το Git αποθηκεύει κάθε νεοδημιουργούμενο αντικείμενο ως ξεχωριστό αρχείο. Αν και ατομικά συμπιεσμένο, αυτό παίρνει πολύ χώρο και είναι αναποτελεσματικό. Αυτό επιλύεται με τη χρήση ''συσκευασιών'' που αποθηκεύουν έναν μεγάλο αριθμό αντικειμένων σε ένα μοναδικό αρχείο (ή σε μια δικτυακή ροή ψηφιολέξεων) που λέγεται ''αρχείο συσκευασίας'' (packfile), συμπιεσμένο δέλτα μεταξύ τους. Οι συσκευασίες συμπιέζονται χρησιμοποιώντας την [[Ευρετικός αλγόριθμος|ευρετική]] (Heuristic) όπου αρχεία με το ίδιο όνομα είναι προφανώς παρόμοια, αλλά δεν εξαρτώνται από αυτό για την ορθότητα τους. Ένα αντίστοιχο αρχείο δεικτών δημιουργείται για κάθε αρχείο συσκευασίας, που λέει τη μετατόπιση κάθε αντικειμένου στο αρχείο συσκευασίας. Νεοδημιουργημένα αντικείμενα (νεοπροστιθέμενο ιστορικό) εξακολουθούν να αποθηκεύονται μοναδικά και η περιοδική επανασυσκευασία απαιτείται για να διατηρηθεί η αποτελεσματικότητα του χώρου. Η διαδικασία της συσκευασίας του αποθετηρίου μπορεί να είναι υπολογιστικά πολύ δαπανηρή. Επιτρέποντας στα αντικείμενα να υπάρχουν στο αποθετήριο σε χαλαρή, αλλά γρήγορα δημιουργούμενη μορφή, το git επιτρέπει τη δαπανηρή λειτουργία συσκευασίας να αναβληθεί μέχρι αργότερα όταν ο χρόνος δεν πειράζει (π.χ. στο τέλος της ημέρας εργασίας). Το Git επανασυσκευάζει περιοδικά και αυτόματα, αλλά η χειροκίνητη επανασυσκευασία είναι επίσης δυνατή με την εντολή <tt>git gc</tt>. Για την ακεραιότητα των στοιχείων, και το αρχείο της συσκευασίας και ο δείκτης του έχουν εσωτερικά ένα άθροισμα ελέγχου SHA-1 και το όνομα του αρχείου του αρχείου συσκευασίας περιέχει επίσης ένα άθροισμα ελέγχου SHA-1. Για τον έλεγχο της ακεραιότητας, εκτελέστε την εντολή <tt>git fsck</tt>.

Μια άλλη ιδιότητα του Git είναι ότι παίρνει στιγμιότυπα των δένδρων καταλόγου των αρχείων. Τα πρώιμα συστήματα εντοπισμού εκδόσεων του πηγαίου κώδικα, σύστημα ελέγχου πηγαίου κώδικα-SCCS (Source Code Control System) και σύστημα ελέγχου αναθεώρησης-RCS (Revision Control System), δούλευαν σε ατομικά αρχεία και τόνιζαν την απόκτηση εξοικονόμησης χώρου από τα παρεμβαλόμενα δέλτα (interleaved deltas) (SCCS) ή την κωδικοποίηση δέλτα (delta encoding) (RCS) των (κυρίως παρόμοιων) εκδόσεων. Τα μεταγενέστερα συστήματα ελέγχου έκδοσης διατήρησαν αυτήν την ιδέα  ενός αρχείου που έχει μια ταυτότητα μέσα από πολλές αναθεωρήσεις ενός έργου. Όμως, ο Τόρβαλντς απέρριψε αυτήν την ιδέα. Συνεπώς, το Git δεν καταγράφει ρητά τις σχέσεις αναθεώρησης του αρχείου σε οποιοδήποτε επίπεδο κάτω από δένδρο του πηγαίου κώδικα.

Οι έμμεσες σχέσεις αναθεώρησης έχουν κάποιες σημαντικές συνέπειες:

* Είναι ελαφρά πιο δαπανηρό στην εξέταση της αλλαγής του ιστορικού ενός μοναδικού αρχείου από όλο το έργο. Για να ληφθεί ένα ιστορικό αλλαγών που επηρεάζει ένα δοσμένο αρχείο, το Git πρέπει να διατρέξει το συνολικό ιστορικό και έπειτα να καθορίσει αν κάθε αλλαγή τροποποιεί αυτό το αρχείο. Αυτή η μέθοδος εξέτασης ιστορικού, όμως, επιτρέπει στο Git να παραγάγει εξίσου καλά ένα μοναδικό ιστορικό που εμφανίζει τις αλλαγές με ένα ελεύθερο σύνολο αρχείων. Για παράδειγμα, ένας υποκατάλογος του πηγαίου δένδρου συν ένα συνδεμένο γενικό αρχείο κεφαλίδας είναι μια πολύ συνηθισμένη περίπτωση.
* Οι μετονομασίες διαχειρίζονται έμμεσα αντί για άμεσα. Ένα συνηθισμένο παράπονο με το CVS (σύγχρονο σύστημα εκδόσεων) (''Concurrent Versions System'') είναι ότι χρησιμοποιεί το όνομα ενός αρχείου για να αναγνωρίσει το ιστορικό της αναθεώρησής του, έτσι η μετακίνηση ή η μετονομασία ενός αρχείου δεν είναι δυνατή χωρίς είτε διακοπή του ιστορικού του, είτε μετονομασία του ιστορικού και συνεπώς κάνει το ιστορικό ανακριβές. Τα περισσότερα μετα-CVS συστήματα ελέγχου αναθεωρήσεων επιλύουν αυτό το θέμα δίνοντας ένα αρχείο με ένα μοναδικό μακροχρόνιο όνομα (ένα είδος αριθμού κόμβου πληροφοριών) που επιβιώνει της μετονομασίας. Το Git δεν καταγράφει έναν τέτοιο αναγνωριστικό και αυτό αντιμετωπίζεται ως πλεονέκτημα. Τα αρχεία [[Πηγαίος κώδικας|πηγαίου κώδικα]] διαιρούνται ή συγχωνεύονται μερικές φορές ως απλές μετονομασίες, και η καταγραφή αυτού ως μιας απλής μετονομασίας θα πάγωνε μια ανακριβή περιγραφή του τι συνέβη στο (αμετάβλητο) ιστορικό. Το Git αντιμετωπίζει αυτό το θέμα εντοπίζοντας τις μετονομασίες ενώ περιηγείται το ιστορικό των στιγμιοτύπων αντί να το καταγράφει, όταν παίρνει το στιγμιότυπο. (Εν συντομία, με δεδομένο ένα αρχείο στην έκδοση ''N,'' ένα αρχείο με το ίδιο όνομα στην έκδοση ''N−1'' είναι ο προεπιλεγμένος του πρόγονος. Όμως, όταν δεν υπάρχει αρχείο με παρόμοιο όνομα στην έκδοση ''N−1,'' το Git αναζητά ένα αρχείο που υπήρχε μόνο στην αναθεώρηση ''N−1'' και είναι πολύ παρόμοιο με το νέο αρχείο.) Όμως, δεν απαιτεί περισσότερη εντατική επεξεργασία από την [[Κεντρική Μονάδα Επεξεργασίας]]) κάθε φορά που το ιστορικό αναθεωρείται και έναν αριθμό επιλογών για να προσαρμόσει την ευρετική. Αυτός ο μηχανισμός δεν δουλεύει πάντα· κάποιες φορές ένα αρχείο που μετονομάστηκε με αλλαγές στην ίδια υποβολή διαβάζεται ως μια διαγραφή του παλιού αρχείου και δημιουργία ενός νέου αρχείου. Οι προγραμματιστές μπορούν να παρακάμψουν αυτόν τον περιορισμό υποβάλλοντας τη μετονομασία και τις αλλαγές ξεχωριστά.

Το Git υλοποιεί πολλές στρατηγικές συγχώνευσης· μια μη προεπιλεγμένη μπορεί να επιλεγεί κατά τον χρόνο της συγχώνευσης:

* **επίλυση**: ο παραδοσιακός αλγόριθμος [[three-way merge|συγχώνευσης τριών δρόμων]].
* **αναδρομικά**: Αυτή είναι η προεπιλογή κατά την μετακίνηση ή συγχώνευση ενός κλάδου και είναι μια παραλλαγή του αλγόριθμου συγχώνευσης τριών δρόμων. 
* **octopus*': Αυτή είναι η προεπιλογή κατά τη συγχώνευση περισσότερων από δύο κεφαλίδες.

=== Δομές δεδομένων ===

Τα βασικά του Git δεν είναι εγγενώς ένα σύστημα [[Διαχείριση πηγαίου κώδικα|διαχείρισης πηγαίου κώδικα]] (SCM). Ο Τόρβαλντς εξηγεί,

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



Το Git έχει δύο [[Δομή δεδομένων|δομές δεδομένων]] (Structure data): έναν μεταβλητό *δείκτη* (index) (που λέγεται επίσης *καταχώριση* ή *κρύπτη* (stage ή cache) ) που αποθηκεύει πληροφορίες για τον κατάλογο εργασίας και την επόμενη έκδοση που θα υποβληθεί· και μία αμετάβλητη, μόνο για προσάρτηση *βάση δεδομένων αντικειμένων.*

Η βάση δεδομένων αντικειμένων περιέχει τέσσερις τύπους αντικειμένων:
* Ένα ([[δυαδικό μεγάλο αντικείμενο]]) *blob* είναι το περιεχόμενο ενός [[Αρχείο (υπολογιστές)|αρχείου]]. Τα Blobs δεν έχουν όνομα αρχείου, χρονοσημάνσεις ή άλλα μεταδεδομένα.
* Ένα αντικείμενο *δένδρου* είναι ισοδύναμο με έναν κατάλογο. Περιέχει έναν κατάλογο των ονομάτων αρχείων, που το καθένα έχει κάποιους τύπος δυαδικών ψηφίων και το όνομα ενός blob ή αντικειμένου δένδρου που είναι αυτό το αρχείο, συμβολικός σύνδεσμος, ή περιεχόμενα καταλόγου. Αυτό το αντικείμενο περιγράφει ένα στιγμιότυπο του πηγαίου δένδρου.
* Ένα αντικείμενο *υποβολής* συνδέει αντικείμενα δένδρου μαζί σε ένα ιστορικό. Περιέχει το όνομα ενός αντικειμένου δένδρου (του ανωτάτου επιπέδου πηγαίου καταλόγου), μια χρονοσήμανση, ένα μήνυμα ημερολογίου και τα ονόματα μηδέν ή περισσότερων γονικών αντικειμένων υποβολής.
* Ένα αντικείμενο *ετικέτας* είναι ένας περιέκτης που περιέχει παραπομπή σε ένα άλλο αντικείμενο και μπορεί να κρατήσει πρόσθετα μεταδεδομένα σχετικά με ένα άλλο αντικείμενο. Κατά κανόνα, χρησιμοποιείται για να αποθηκεύσει μια [[Ψηφιακή υπογραφή]] ενός αντικειμένου υποβολής που αντιστοιχεί σε μια συγκεκριμένη έκδοση των δεδομένων που εντοπίζονται από το Git.

Ο δείκτης εξυπηρετεί ως σημείο σύνδεσης μεταξύ της βάσης δεδομένων του αντικειμένου και του δένδρου εργασίας.

Κάθε αντικείμενο ταυτοποιείται από έναν [[Κρυπτογραφική Συνάρτηση Κατατεμαχισμού|κατακερματισμό]] (Cryptographic hash function) [[SHA-1]] των περιεχομένων του. Το Git υπολογίζει τον κατακερματισμό και χρησιμοποιεί αυτήν την τιμή για το όνομα του αντικειμένου. Το αντικείμενο μπαίνει σε έναν κατάλογο που ταιριάζει με τους δύο πρώτους χαρακτήρες του κατακερματισμού του. Το υπόλοιπο του κατακερματισμού χρησιμοποιείται ως το όνομα του αρχείου για αυτό το αντικείμενο.

Το Git αποθηκεύει κάθε αναθεώρηση ενός αρχείου ως ένα μοναδικό blob. Η σχέση μεταξύ των blobs μπορεί να βρεθεί μέσα από την εξέταση του δένδρου και των αντικειμένων υποβολής. Νεοπροστιθέμενα αντικείμενα αποθηκεύονται στην ολότητά τους χρησιμοποιώντας μια συμπίεση [[zlib]]. Αυτό μπορεί να καταναλώσει ένα μεγάλο ποσό του χώρου του δίσκου γρήγορα, έτσι τα αντικείμενα μπορούν να ενωθούν σε *πακέτα'', που χρησιμοποιούν δέλτα συμπίεση για να αποθηκεύσουν χώρο, αποθηκεύοντας τα blobs ως αλλαγές τους σχετικά με άλλα blobs.

Οι διακομιστές του Git τυπικά ακροάζονται στη θύρα TCP 9418.

### Παραπομπές
Κάθε αντικείμενο στη βάση δεδομένων git στην οποία δεν αναφέρεται μπορεί να καθαριστεί χρησιμοποιώντας μια εντολή συλλογής απορριμμάτων, ή αυτόματα. Ένα αντικείμενο μπορεί να παραπεμφθεί από ένα άλλο αντικείμενο, ή με ρητή παραπομπή. Το Git γνωρίζει διαφορετικούς τύπους παραπομπών. Οι εντολές για δημιουργία, μετακίνηση και διαγραφή παραπομπών ποικίλλει. Το "git show-ref" εμφανίζει όλες τις παραπομπές. Μερικοί τύποι είναι:
; κεφαλίδας: αναφέρεται σε ένα αντικείμενο τοπικά.
; απομακρυσμένα: αναφέρονται σε ένα αντικείμενο που υπάρχει σε ένα απομακρυσμένο αποθετήριο.
; κρύπτης: αναφέρεται σε ένα αντικείμενο που δεν έχει ακόμη υποβληθεί.
; μετά:  π.χ. μια διαμόρφωση είναι ένα γυμνό αποθετήριο, που ο χρήστης διορθώνει. Ο χώρος ονόματος παραπομπών/μετά/διαμόρφωσης που εισήχθη αντίστοιχα χρησιμοποιείται από το Gerrit (λογισμικό)
; ετικέτες : δείτε παραπάνω.

## Υλοποιήσεις

Το αναπτύχθηκε κυρίως σε Linux, αν και υποστηρίζει τα περισσότερα κύρια λειτουργικά συστήματα συμπεριλαμβανομένων των BSD, Solaris, OS X και Microsoft Windows.

Η υλοποίηση JGit του Git είναι μια καθαρή βιβλιοθήκη λογισμικού Java, που σχεδιάστηκε για να ενσωματωθεί σε οποιαδήποτε εφαρμογή  Java.  Το JGit χρησιμοποιείται στο εργαλείο επιθεώρησης κώδικα Gerrit και στο EGit, έναν πελάτη Git για το IDE Eclipse.

Η υλοποίηση Dulwich του Git είναι ένα καθαρό συστατικό λογισμικού Python για Python 2.

Η υλοποίηση libgit2 του Git είναι μια βιβλιοθήκη λογισμικού ANSI C χωρίς άλλες εξαρτήσεις, που μπορεί να δομηθεί σε πολλά λειτουργικά συμπεριλαμβανομένων των Microsoft Windows, Linux, Mac OS X και BSD. Έχει συνδέσμους για πολλές προγραμματιστικές γλώσσες, συμπεριλαμβανόμενων των Ruby, Python και Haskell.

το JS-Git είναι μια υλοποίηση JavaScript ενός υποσυνόλου του Git.

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

### Απομακρυσμένη αποθήκευση αρχείου και πρόσβαση κελύφους
Ένα αποθετήριο git μπορεί να κλωνοποιηθεί σε ένα κοινόχρηστο σύστημα αρχείων και να προσπελαστεί από άλλα άτομα. Μπορεί επίσης να προσπελαστεί μέσα από απομακρυσμένο κέλυφος έχοντας απλώς το λογισμικό git εγκατεστημένο και επιτρέποντας σε έναν χρήστη να συνδεθεί.

### Ο δαίμονας Git, instaweb
Ο δαίμονας Git επιτρέπει στους χρήστες να μοιράζονται το δικό τους αποθετήριο με τους συνεργάτες τους γρήγορα. Το Git instaweb επιτρέπει στους χρήστες να παρέχουν προβολή ιστού στο αποθετήριο. Από τον Απρίλιο του 2014 το instaweb (στιγμιαίος ιστός) δεν δουλεύει στα Windows. Μπορείτε να δείτε αμφότερα στη γραμμή "hg serve" του Mercurial.

### Gitolite
Το Gitolite είναι μια στρώση ελέγχου πρόσβασης πάνω στο git, που παρέχει εξαιρετικό έλεγχο πρόσβασης στα αποθετήρια του git. Βασίζεται σε άλλο λογισμικό για την απομακρυσμένη προβολή των αποθετηρίων στον διακομιστή.

### Gerrit
Το Gerrit παρέχει δύο από τρεις λειτουργίες: έλεγχο πρόσβασης και διαχείριση αποθετηρίων. Χρησιμοποιεί το jGit. Για να προβάλετε τα αποθετήρια συνδυάζεται π.χ. με τα Gitiles ή GitBlit.

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

### Gitiles
Το Gitiles είναι ένας απλός περιηγητής αποθετηρίου, που χρησιμοποιείται συνήθως μαζί με το gerrit.

### Εξυπηρετητής Bonobo Git
Ο εξυπηρετητής Bonobo Git είναι ένας απλός εξυπηρετητής git για Windows που υλοποιήθηκε ως μια πύλη ASP.NET. Βασίζεται στους μηχανισμούς πιστοποίησης που παρέχονται από τις υπηρεσίες πληροφοριών διαδικτύου των Windows, συνεπώς δεν υποστηρίζει πρόσβαση SSH, αλλά μπορεί να ενσωματωθεί εύκολα με τον ενεργό κατάλογο.

### Εμπορικές λύσεις
Εμπορικές λύσεις είναι επίσης διαθέσιμες για εσωτερική εγκατάσταση, μεταξύ αυτών το λογισμικό GitHub (που χρησιμοποιεί εγγενές git, διαθέσιμο ως vm), Stash (χρησιμοποιώντας jGit), Team Foundation Server (χρησιμοποιώντας libgit2).

## Αποδοχή

Το Ίδρυμα Eclipse ανέφερε στην ετήσια έρευνα του ότι από τον Μάιο του 2014, το Git είναι πλέον το πιο διαδεδομένο εργαλείο διαχείρισης πηγαίου κώδικα, με το 42,9% των επαγγελματιών προγραμματιστών λογισμικού να αναφέρουν ότι χρησιμοποιούν το Git ή το GitHub ως το κύριο σύστημα ελέγχου συγκρινόμενο με το 36% το 2013, 27,6% το 2012 και 12,8% το 2011.

Η ιστοσελίδα εργασίας UK IT itjobswatch.co.uk αναφέρει ότι από τον Ιούνιο του 2014, το 18,54% των μόνιμων νέων εργασιών ανάπτυξης λογισμικού στο Ενωμένο Βασίλειο εμφανίζουν το Git ως προαπαιτούμενο, μπροστά από το 16,54% για το Subversion, 10,87% για το Microsoft Team Foundation Server, 1,32% για Mercurial, και 0,91% για το Visual SourceSafe.

## Παραπομπές


## Βιβλία
* ProGit

## Εξωτερικοί σύνδεσμοι

* 
* Your real git cheat sheet στο linux.com
* Fixing mistakes in Git

Κατηγορία:Ελεύθερο λογισμικό
Κατηγορία:Εργαλεία προγραμματισμού
Κατηγορία:Λογισμικό Linux