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

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

Ιστορικό
--------

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

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

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

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

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

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

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

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

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

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

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

* **επίλυση**: ο παραδοσιακός αλγόριθμος συγχώνευσης τριών δρόμων.
* **αναδρομικά**: Αυτή είναι η προεπιλογή κατά την μετακίνηση ή συγχώνευση ενός κλάδου και είναι μια παραλλαγή του αλγόριθμου συγχώνευσης τριών δρόμων. 
> Όταν υπάρχουν περισσότεροι από έναν κοινό πρόγονο που μπορεί να χρησιμοποιηθεί για συγχώνευση τριών δρόμων, δημιουργεί ένα συγχωνευμένο δένδρο των κοινών προγόνων και το χρησιμοποιεί ως δένδρο αναφοράς για τη συγχώνευση τριών δρόμων. Αυτό έχει αναφερθεί να καταλήγει σε λιγότερες συγκρούσεις συγχωνεύσεων χωρίς να προκαλεί εσφαλμένες συγχωνεύσεις με δοκιμές που γίνονται σε ενεργές υποβολές συγχώνευσης που ελήφθησαν από το ιστορικό ανάπτυξης του πυρήνα Linux 2.6. Επιπρόσθετα αυτό μπορεί να εντοπίσει και να χειριστεί συγχωνεύσεις που περιέχουν μετονομασίες.
> 
> — Linus Torvalds
* **octopus**: Αυτή είναι η προεπιλογή κατά τη συγχώνευση περισσότερων από δύο κεφαλίδες.

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

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

> Κατά πολλούς τρόπους μπορείτε να δείτε το git ως ένα σύστημα αρχείων  — είναι προσπελάσιμο με το περιεχόμενο (content-addressable) και έχει μια ιδέα αναθεώρησης , αλλά στην πραγματικότητα ο σχεδιασμός του έρχεται στο πρόβλημα από την άποψη ενός προσώπου *συστήματος αρχείων* (αυτό που κάνω είναι πυρήνες) και στην πραγματικότητα έχω απολύτως *μηδενικό* ενδιαφέρον να δημιουργήσω ένα παραδοσιακό σύστημα 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 (λογισμικό)
ετικέτεςδείτε παραπάνω.

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

Το gitg είναι ένα γραφικό προσκήνιο που χρησιμοποιεί GTK+
Το αναπτύχθηκε κυρίως σε 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.

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

1. ↑  web.archive.org/web/20151116175401/https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290.
2. ↑  www.linux.com/blog/10-years-git-interview-git-creator-linus-torvalds. Ανακτήθηκε στις 19  Οκτωβρίου 2016.
3. ↑  github.com/git/git/graphs/contributors. Ανακτήθηκε στις 3  Αυγούστου 2018.
4. ↑  «[ANNOUNCE] Git v2.44.0». 23 Φεβρουάριος 2024. Ανακτήθηκε στις 24 Φεβρουάριος 2024.
5. ↑  «Copying». (Αγγλικά) Ανακτήθηκε στις 5  Αυγούστου 2018.
6. 1 2  Torvalds, Linus (2005-04-07). «Re: Kernel SCM saga..». *linux-kernel mailing list*. .  "So I'm writing some scripts to try to track things a whole lot faster."
7. 1 2  
Torvalds, Linus (2007-06-10). «Re: fatal: serious inflate inconsistency». *git mailing list*. .  Μια σύντομη περιγραφή των σκοπών σχεδίασης της ακεραιότητας των δεδομένων του Git.
8. 1 2 3 4 5 6  
Linus Torvalds (3 Μαΐου 2007). *Google tech talk: Linus Torvalds on git*. Συμβαίνει στα 02:30. Ανακτήθηκε στις 16 Μαΐου 2007.
9. 1 2  «Eclipse Community Survey 2014 results | Ian Skerrett». Ianskerrett.wordpress.com. 23 Ιουνίου 2014. Ανακτήθηκε στις 23 Ιουνίου 2014.
10. ↑  «Feature: No More Free BitKeeper | KernelTrap.org». Αρχειοθετήθηκε από το πρωτότυπο στις 23 Μαΐου 2012. Ανακτήθηκε στις 11 Αυγούστου 2014.
11. ↑  «GitFaq: Why the 'git' name?». Git.or.cz. Ανακτήθηκε στις 14 Ιουλίου 2012.
12. ↑  «After controversy, Torvalds begins work on 'git'». PC World. 14 Ιουλίου 2012. Αρχειοθετήθηκε από το πρωτότυπο στις 1 Φεβρουαρίου 2011. Ανακτήθηκε στις 11 Αυγούστου 2014. Torvalds seemed aware that his decision to drop BitKeeper would also be controversial. When asked why he called the new software, "git", British slang meaning "a rotten person", he said. "I'm an egotistical bastard, so I name all my projects after myself. First Linux, now git"
13. ↑  
«git(1) Manual Page». Ανακτήθηκε στις 21 Ιουλίου 2012.
14. 1 2  Torvalds, Linus (2007-02-27). «Re: Trivia: When did git self-host?». *git mailing list*. .
15. ↑  
Torvalds, Linus (2005-04-06). «Kernel SCM saga..». *linux-kernel mailing list*. .
16. ↑  Torvalds, Linus (2005-04-17). «First ever real kernel git merge!». *git mailing list*. .
17. ↑  
Mackall, Matt (2005-04-29). «Mercurial 0.4b vs git patchbomb benchmark». *git mailing list*. .
18. ↑  
Torvalds, Linus (2005-06-17). «Linux 2.6.12». *git-commits-head mailing list*. .
19. ↑  Torvalds, Linus (2005-07-27). «Meet the new maintainer...». *git mailing list*. .
20. ↑  Hamano, Junio C. (2005-12-21). «Announce: Git 1.0.0». *git mailing list*. .
21. ↑  Torvalds, Linus (2006-05-05). «Re: [ANNOUNCE] Git wiki». *linux-kernel mailing list*. .  "Some historical background" on git's predecessors
22. 1 2  Torvalds, Linus (2005-04-08). «Re: Kernel SCM saga». *linux-kernel mailing list*.. Ανακτήθηκε στις 2008-02-20.
23. 1 2  Torvalds, Linus (2006-03-23). «Re: Errors GITtifying GCC and Binutils». *git mailing list*. .
24. ↑  Torvalds, Linus (2006-10-20). «Re: VCS comparison table». *git mailing list*. .  A discussion of Git vs. BitKeeper
25. ↑  Torvalds, Linus (2006-10-19). «Re: VCS comparison table». *git mailing list*. .
26. ↑  Dreier, Roland (13 Νοεμβρίου 2006). «Oh what a relief it is». , observing that "git log" is 100x faster than "svn log" because the latter has to contact a remote server.
27. ↑  «Trust». *Git Concepts*. Git User's Manual. 18 Οκτωβρίου 2006.
28. ↑  Torvalds, Linus. «Re: VCS comparison table». *git mailing list*.. Ανακτήθηκε στις 2009-04-10. , describing Git's script-oriented design
29. ↑  iabervon (22 Δεκεμβρίου 2005). «Git rocks!». , praising Git's scriptability
30. ↑  «Git User's Manual». 5 Αυγούστου 2007.
31. ↑  Torvalds, Linus (2005-04-10). «Re: more git updates..». *linux-kernel mailing list*. .
32. ↑  Haible, Bruno (2007-02-11). «how to speed up "git log"?». *git mailing list*. .
33. ↑  Torvalds, Linus (2006-03-01). «Re: impure renames / history tracking». *git mailing list*. .
34. ↑  Hamano, Junio C. (2006-03-24). «Re: Errors GITtifying GCC and Binutils». *git mailing list*. .
35. ↑  Hamano, Junio C. (2006-03-23). «Re: Errors GITtifying GCC and Binutils». *git mailing list*. .
36. ↑  Torvalds, Linus (2006-11-28). «Re: git and bzr». *git mailing list*. . , on using `git-blame` to show code moved between source files
37. ↑  Torvalds, Linus (18 Ιουλίου 2007). «git-merge(1)».
38. ↑  Torvalds, Linus (18 Ιουλίου 2007). «CrissCrossMerge». Αρχειοθετήθηκε από το πρωτότυπο στις 13 Ιανουαρίου 2006. Ανακτήθηκε στις 11 Αυγούστου 2014.
39. ↑  Torvalds, Linus (2005-04-10). «Re: more git updates...». *linux-kernel mailing list*. .
40. ↑  «1.4 Getting Started - Installing Git». git-scm.com. Ανακτήθηκε στις 1 Νοεμβρίου 2013.
41. ↑  Gerrit Code Review - Project Configuration File Format
42. ↑  «downloads». Ανακτήθηκε στις 14 Μαΐου 2012.
43. ↑  «JGit». Ανακτήθηκε στις 24 Αυγούστου 2012.
44. ↑  «Dulwich». Ανακτήθηκε στις 27 Αυγούστου 2012.
45. ↑  «libgit2». Ανακτήθηκε στις 24 Αυγούστου 2012.
46. ↑  «rugged». Ανακτήθηκε στις 24 Αυγούστου 2012.
47. ↑  «pygit2». Ανακτήθηκε στις 24 Αυγούστου 2012.
48. ↑  «hlibgit2». Ανακτήθηκε στις 30 Απριλίου 2013.
49. ↑   "js-git: a JavaScript implementation of Git." Retrieved 13 August 2013.
50. ↑  4.4 Git on the Server - Setting Up the Server, Pro Git.
51. ↑  «hosting a git repository on windows». Αρχειοθετήθηκε από το πρωτότυπο στις 7 Ιανουαρίου 2015. Ανακτήθηκε στις 11 Αυγούστου 2014.
52. ↑  git-instaweb manual page
53. ↑  Hosting git repositories
54. ↑  gitolite source code and description
55. ↑  Gitblit Homepage
56. ↑  Wikimedia Gitblit installation
57. ↑  Gitiles Homepage
58. ↑  Android source code repositories
59. ↑
60. ↑  «Microsoft embraces git with new TFS support, Visual Studio integration». Ανακτήθηκε στις 1 Φεβρουαρίου 2013.
61. ↑  «Ohloh: Compare Repositories». Αρχειοθετήθηκε από το πρωτότυπο στις 11 Ιουλίου 2014. Ανακτήθηκε στις 11 Αυγούστου 2014.
62. ↑  «Git (software) Jobs, Average Salary for Git Distributed Version Control System Skills». Itjobswatch.co.uk. Ανακτήθηκε στις 22 Απριλίου 2014.
63. ↑  «Subversion Jobs, Average Salary for Apache Subversion (SVN) Skills». Itjobswatch.co.uk. Ανακτήθηκε στις 22 Απριλίου 2014.
64. ↑  «Team Foundation Server Jobs, Average Salary for Microsoft Team Foundation Server (TFS) Skills». Itjobswatch.co.uk. Ανακτήθηκε στις 22 Απριλίου 2014.
65. ↑  «Mercurial Jobs, Average Salary for Mercurial Skills». Itjobswatch.co.uk. Ανακτήθηκε στις 22 Απριλίου 2014.
66. ↑  «VSS/SourceSafe Jobs, Average Salary for Microsoft Visual SourceSafe (VSS) Skills». Itjobswatch.co.uk. Ανακτήθηκε στις 22 Απριλίου 2014.

Βιβλία
------

* ProGit

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

|  |  |
| --- | --- |
| Commons logoCommons logo | Τα Wikimedia Commons έχουν πολυμέσα σχετικά με το θέμα   **Git (λογισμικό)** |

* Επίσημος ιστότοπος
* Your real git cheat sheet στο linux.com
* Fixing mistakes in Git

  


|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| Καθιερωμένοι όροι | 
* WorldCat
* VIAF: 304416640
* LCCN: n2013035657
* GND: 7687494-1
* SUDOC: 192014498
* BNF: cb17031353d (data)
* BIBSYS: 14065119
* NKC: ph559299

 |

 |