Git — είναι ένα κατανεμημένο σύστημα ελέγχου εκδόσεων ανοιχτού κώδικα, που δημιουργήθηκε από τον Linus Torvalds το 2005 για την ανάπτυξη του πυρήνα Linux. Σε αντίθεση με τα συγκεντρωτικά συστήματα όπως το SVN, το Git αποθηκεύει ένα πλήρες αντίγραφο του αποθετηρίου σε κάθε συσκευή προγραμματιστή, επιτρέποντας την εργασία χωρίς συνεχή σύνδεση με τον διακομιστή. Σύμφωνα με τα δεδομένα του Git SCM, 2024, το Git χρησιμοποιείται σε περισσότερο από το 90% όλων των εμπορικών έργων ανάπτυξης λογισμικού.
Κύρια σημεία
Git — είναι ένα κατανεμημένο σύστημα ελέγχου εκδόσεων (VCS) που παρακολουθεί αλλαγές σε αρχεία και επιτρέπει σε πολλούς προγραμματιστές να εργάζονται ταυτόχρονα στο ίδιο έργο. Σε αντίθεση με τα συγκεντρωτικά συστήματα, στο Git κάθε προγραμματιστής έχει ένα πλήρες αντίγραφο του αποθετηρίου, συμπεριλαμβανομένου ολόκληρου του ιστορικού αλλαγών, καθιστώντας το σύστημα ανθεκτικό στην απώλεια δεδομένων και χωρίς να απαιτείται συνεχής σύνδεση με τον κεντρικό διακομιστή.
Η ιστορία του Git ξεκίνησε το 2005, όταν ο Linus Torvalds δημιούργησε ένα νέο VCS αφού η εταιρεία BitKeeper απέσυρε τη δωρεάν άδεια χρήσης του συστήματός της για τους προγραμματιστές του πυρήνα Linux. Οι στόχοι ήταν: ταχύτητα, απλότητα αρχιτεκτονικής, υποστήριξη μη γραμμικής ανάπτυξης μέσω διακλάδωσης και πλήρης κατανεμημένη λειτουργία. Μέσα σε 3 μήνες ο Torvalds έγραψε τον πυρήνα του Git και μετά από ένα χρόνο το έργο πέρασε σε αυτοδιαχείριση υπό την ηγεσία του Junio Hamano.
Σύμφωνα με την έρευνα του Stack Overflow (2024), το 93,9% των επαγγελματιών προγραμματιστών χρησιμοποιεί Git, καθιστώντας το το κυρίαρχο σύστημα ελέγχου εκδόσεων στη βιομηχανία. Ο πλησιέστερος ανταγωνιστής — το Subversion (SVN) — χρησιμοποιείται μόνο στο 5,2% των έργων, κυρίως σε μεγάλα εταιρικά περιβάλλοντα με συγκεντρωτικές διαδικασίες.
Αποθετήριο Git — είναι ένας κατάλογος στον οποίο το Git παρακολουθεί αλλαγές όλων των αρχείων. Μέσα στον κατάλογο βρίσκεται ένας κρυφός φάκελος .git, όπου αποθηκεύονται όλα τα αντικείμενα του συστήματος: commits, δέντρα, blob και αναφορές. Όταν ένας προγραμματιστής δημιουργεί ένα commit, το Git δεν αντιγράφει τα αρχεία στο σύνολό τους — δημιουργεί ένα στιγμιότυπο (snapshot) της κατάστασης και αποθηκεύει μια αναφορά σε αυτό.
Κάθε commit περιέχει: ένα μοναδικό SHA-1 hash (40 χαρακτήρες), μια αναφορά στο προηγούμενο commit (parent), συγγραφέα, ημερομηνία, μήνυμα commit και μια αναφορά στο δέντρο (tree) που περιγράφει την κατάσταση των αρχείων τη στιγμή του commit. Η αλυσίδα των commits σχηματίζει ένα κατευθυνόμενο ακυκλικό γράφημα, όπου κάθε commit δείχνει σε έναν ή περισσότερους γονείς.
# Αρχικοποίηση αποθετηρίου
git init my-project
cd my-project
# Δημιουργία commit
echo "Hello, Git" > README.md
git add README.md
git commit -m "Initial commit"
# Προβολή ιστορικού
git log --oneline --graph --all
Το Git χρησιμοποιεί τρεις κύριες περιοχές: working directory (αρχεία στον δίσκο), staging area (ευρετήριο όπου καταλήγουν τα προετοιμασμένα αρχεία) και repository (ιστορικό commits). Η εντολή git add μετακινεί αλλαγές από τον κατάλογο εργασίας στο staging και η git commit καταγράφει το περιεχόμενο του staging στο αποθετήριο. Αυτός ο διαχωρισμός επιτρέπει στον προγραμματιστή να συγκεντρώσει ένα ουσιαστικό commit από ένα σύνολο αλλαγών, χωρίς να καταγράφει κάθε διόρθωση ξεχωριστά.
Οι βασικές εντολές Git καλύπτουν το 90% των καθημερινών λειτουργιών ενός προγραμματιστή. Η εντολή git clone δημιουργεί ένα τοπικό αντίγραφο ενός απομακρυσμένου αποθετηρίου, η git pull λαμβάνει αλλαγές από τον διακομιστή και τις συγχωνεύει με τον τρέχοντα κλάδο, και η git push στέλνει τοπικά commits στον διακομιστή. Αυτές οι τρεις εντολές αποτελούν τον βασικό κύκλο εργασίας με το Git.
Για την προβολή κατάστασης χρησιμοποιείται η git status — δείχνει ποια αρχεία έχουν τροποποιηθεί, ποια έχουν προστεθεί στο staging και ποια δεν παρακολουθούνται. Η git diff εμφανίζει συγκεκριμένες αλλαγές σε αρχεία πριν από την προσθήκη στο staging. Παρακάτω είναι ο πίνακας με τις πιο συχνά χρησιμοποιούμενες εντολές:
| Εντολή | Ενέργεια | Παράδειγμα |
|---|---|---|
| git clone | Αντιγράφει απομακρυσμένο αποθετήριο | git clone https://example.com/repo |
| git add | Προσθέτει αρχεία στο staging | git add src/main.kt |
| git commit | Καταγράφει αλλαγές στο ιστορικό | git commit -m "Fix login bug" |
| git push | Στέλνει commits στον διακομιστή | git push origin main |
| git pull | Λαμβάνει αλλαγές από τον διακομιστή | git pull origin feature |
Για την αναίρεση αλλαγών το Git προσφέρει πολλές επιλογές. Η git reset μετακινεί τον δείκτη κλάδου στο καθορισμένο commit και μπορεί να επαναφέρει το staging ή τον κατάλογο εργασίας. Η git revert δημιουργεί ένα νέο commit που αναιρεί τις αλλαγές του καθορισμένου commit — αυτός είναι ένας ασφαλής τρόπος αναίρεσης για κοινόχρηστους κλάδους, επειδή το ιστορικό δεν ξαναγράφεται.
Οι κλάδοι στο Git — είναι ελαφροί μετακινούμενοι δείκτες σε ένα συγκεκριμένο commit. Η δημιουργία ενός νέου κλάδου δεν αντιγράφει αρχεία, απλά δημιουργεί έναν νέο δείκτη, καθιστώντας τη διακλάδωση πρακτικά στιγμιαία. Ο κλάδος main (πρώην master) — ο κύριος κλάδος του έργου, που περιέχει σταθερό, έτοιμο για κυκλοφορία κώδικα.
Η τυπική πρακτική είναι η χρήση Git Flow ή GitHub Flow. Στο Git Flow χρησιμοποιούνται κλάδοι: main (κώδικας κυκλοφορίας), develop (κλάδος ενσωμάτωσης), feature/* (νέες λειτουργίες), release/* (προετοιμασία κυκλοφοριών) και hotfix/* (επείγουσες διορθώσεις). Το GitHub Flow είναι απλούστερο: μόνο main και feature κλάδοι, και όλες οι αλλαγές παραδίδονται μέσω Pull Request.
# Δημιουργία και εναλλαγή κλάδου
git branch feature-auth
git checkout feature-auth
# ή με μία εντολή:
git checkout -b feature-auth
# Λίστα κλάδων
git branch --list
git branch -a # όλα τα branches, συμπεριλαμβανομένων των απομακρυσμένων
# Διαγραφή κλάδου
git branch -d feature-auth
Μια σημαντική ιδιότητα της διακλάδωσης Git — η δυνατότητα cherry-pick: μεταφορά ενός μεμονωμένου commit από έναν κλάδο σε άλλον με την εντολή git cherry-pick <hash>. Αυτό είναι χρήσιμο όταν χρειάζεται να μεταφέρετε μια διόρθωση σφάλματος από έναν feature κλάδο στο release χωρίς να συγχωνεύσετε ολόκληρο τον κλάδο. Το Git υποστηρίζει επίσης rebase και διαδραστικό rebase (git rebase -i) για συγκόλληση, αναδιάταξη και επεξεργασία commits.
Merge (συγχώνευση) δημιουργεί ένα ειδικό merge-commit που έχει δύο γονείς. Αυτό το commit καταγράφει το γεγονός της ένωσης δύο κλάδων και διατηρεί το πλήρες ιστορικό — είναι ορατό πού και πότε έγινε η συγχώνευση. Το Merge διατηρεί το ιστορικό στη μορφή που δημιουργήθηκε, γεγονός που απλοποιεί τον έλεγχο, αλλά καθιστά το γράφημα commits πιο περίπλοκο.
Rebase (αναβάση) αντί να δημιουργεί merge-commit, μετακινεί τα commits του τρέχοντος κλάδου στην κορυφή του κλάδου-στόχου. Το ιστορικό γίνεται γραμμικό — δημιουργείται η εντύπωση ότι η ανάπτυξη έγινε διαδοχικά. Ωστόσο, το rebase ξαναγράφει το ιστορικό, αλλάζοντας τα SHA-1 hash των commits, καθιστώντας το επικίνδυνο για κοινόχρηστους κλάδους στους οποίους έχουν πρόσβαση άλλοι προγραμματιστές.
Σύσταση για επιλογή: χρησιμοποιήστε merge για δημόσιους κλάδους όπου το ιστορικό βλέπουν άλλοι προγραμματιστές (feature → develop), και rebase για τοπική εργασία όταν χρειάζεται να εφαρμόσετε φρέσκες αλλαγές από το main στον feature κλάδο σας πριν δημιουργήσετε Pull Request. Ο κανόνας είναι απλός: αν ένα commit έχει ήδη σταλεί στον διακομιστή — μην το κάνετε rebase.
Σύγκρουση συγχώνευσης προκύπτει όταν το Git δεν μπορεί να συνδυάσει αυτόματα αλλαγές σε ένα αρχείο. Το Git επισημαίνει τα αντικρουόμενα τμήματα στο αρχείο με ειδικούς δείκτες: <<<<<<< (δικές μας αλλαγές), ======= (διαχωριστικό), >>>>>>> (δικές τους αλλαγές). Ο προγραμματιστής επεξεργάζεται χειροκίνητα το αρχείο, επιλέγοντας την επιθυμητή επιλογή ή συνδυάζοντας και τις δύο, και ολοκληρώνει τη συγχώνευση με ένα commit.
Απομακρυσμένο αποθετήριο (remote) — ένα αντίγραφο του αποθετηρίου Git που βρίσκεται σε έναν διακομιστή. GitHub, GitLab και Bitbucket είναι οι πιο δημοφιλείς πλατφόρμες φιλοξενίας απομακρυσμένων αποθετηρίων. Παρέχουν διαδικτυακή διεπαφή για προβολή κώδικα, διαχείριση πρόσβασης, ανασκόπηση κώδικα και ενσωμάτωση με συστήματα CI/CD.
Στο Git μπορούν να ρυθμιστούν πολλά απομακρυσμένα αποθετήρια για ένα έργο. Από προεπιλογή, το κύριο remote ονομάζεται origin. Η εντολή git remote add προσθέτει ένα νέο remote, η git fetch λαμβάνει αλλαγές χωρίς συγχώνευση και η git pull είναι συντομογραφία για git fetch + git merge. Για εργασία με κώδικα μέσω Pull Request, ο προγραμματιστής δημιουργεί ένα fork του αποθετηρίου, το κλωνοποιεί, εργάζεται σε έναν feature κλάδο και στέλνει ένα αίτημα συγχώνευσης στο αρχικό αποθετήριο.
# Προσθήκη απομακρυσμένου αποθετηρίου
git remote add origin https://github.com/user/repo.git
# Προβολή απομακρυσμένων αποθετηρίων
git remote -v
# Αποστολή κλάδου στον διακομιστή
git push -u origin feature-auth
# Λήψη αλλαγών από απομακρυσμένο κλάδο
git pull origin main
Τα απομακρυσμένα αποθετήρια υποστηρίζουν επισήμανση για τη σήμανση εκδόσεων κυκλοφορίας. Οι ετικέτες μπορεί να είναι ελαφριές (απλά ένας δείκτης σε ένα commit) και σχολιασμένες (περιέχουν μεταδεδομένα: συγγραφέας, ημερομηνία, μήνυμα). Οι σχολιασμένες ετικέτες συνιστώνται για εκδόσεις κυκλοφορίας, καθώς μεταφέρουν πλήρεις πληροφορίες σχετικά με την έκδοση και μπορούν να υπογραφούν με κλειδί GPG για επαλήθευση της πατρότητας.
Git Worktree επιτρέπει την ταυτόχρονη εργασία με πολλούς κλάδους σε διαφορετικούς καταλόγους χωρίς εναλλαγή μεταξύ τους. Η εντολή git worktree add ../feature-auth feature-auth δημιουργεί έναν νέο κατάλογο εργασίας feature-auth, όπου μπορείτε να γράφετε κώδικα χωρίς να αλλάζετε κλάδο στον κύριο κατάλογο. Το Worktree είναι χρήσιμο για γρήγορες διορθώσεις στον κλάδο release όταν ο κύριος κατάλογος είναι απασχολημένος με μακροχρόνια ανάπτυξη.
Git Submodules — μηχανισμός ενσωμάτωσης ενός αποθετηρίου Git σε ένα άλλο. Το Submodule αποθηκεύει μια αναφορά σε ένα σταθερό commit ενός εξωτερικού αποθετηρίου, που εγγυάται την αναπαραγωγιμότητα της μεταγλώττισης. Η εντολή git submodule add https://github.com/example/lib.git προσθέτει μια εξωτερική βιβλιοθήκη ως υπομονάδα. Κατά την κλωνοποίηση ενός έργου με υπομονάδες, για τη φόρτωση όλων των εξαρτήσεων πρέπει να εκτελεστεί η git submodule update --init --recursive.
Συχνές ερωτήσεις
Git — κατανεμημένο VCS με τοπικό ιστορικό και δυνατότητα εργασίας εκτός σύνδεσης. SVN — ένα συγκεντρωτικό σύστημα που απαιτεί συνεχή σύνδεση με τον διακομιστή για όλες τις λειτουργίες εκτός από την προβολή αρχείων.
Χρησιμοποιήστε git revert HEAD για ασφαλή αναίρεση (δημιουργείται νέο commit). Εάν το commit δεν έχει ακόμη σταλεί στον διακομιστή, μπορείτε να χρησιμοποιήσετε git reset --soft HEAD~1.
.gitignore — ένα αρχείο που περιέχει μοτίβα αρχείων και καταλόγων που το Git πρέπει να αγνοεί. Χρησιμοποιείται για τον αποκλεισμό προσωρινών αρχείων, μεταγλωττίσεων και ρυθμίσεων IDE από το αποθετήριο.
git fetch κατεβάζει αλλαγές από τον διακομιστή αλλά δεν τις συγχωνεύει με τον τρέχοντα κλάδο. git pull κάνει fetch και αμέσως εκτελεί merge. Για έλεγχο, χρησιμοποιήστε fetch + προβολή diff, στη συνέχεια μη αυτόματο merge.
Χρησιμοποιήστε git commit --amend — αυτή η εντολή ανοίγει τον επεξεργαστή για αλλαγή του μηνύματος commit. Εάν το commit είναι ήδη στον διακομιστή, θα απαιτηθεί git push --force, το οποίο είναι επικίνδυνο για κοινόχρηστους κλάδους.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης