Κάνω commit — η ενέργεια καταγραφής αλλαγών στο σύστημα ελέγχου εκδόσεων Git, δημιουργώντας ένα σημείο αποθήκευσης στην ιστορία του έργου. Κάθε commit περιλαμβάνει hash, συγγραφέα, ημερομηνία και περιγραφή αλλαγών. Σύμφωνα με τα δεδομένα GitHub Octoverse 2024, καθημερινά δημιουργούνται πάνω από 50 εκατομμύρια commit παγκοσμίως. Commit — η βασική μονάδα εργασίας με εκδόσεις, χωρίς την οποία είναι αδύνατο να φανταστεί κανείς τη σύγχρονη ανάπτυξη λογισμικού.
Κύρια σημεία
Ένα commit στο Git είναι ένα αντικείμενο που αποθηκεύει την κατάσταση των αρχείων του έργου σε μια συγκεκριμένη χρονική στιγμή. Κάθε commit περιέχει ένα στιγμιότυπο όλων των παρακολουθούμενων αρχείων, αναφορά στο γονικό commit και μεταδεδομένα. Σε αντίθεση με άλλα συστήματα ελέγχου εκδόσεων, το Git χρησιμοποιεί content-addressable storage — κάθε αντικείμενο αναγνωρίζεται από το hash SHA-1 του περιεχομένου του.
Όταν ο προγραμματιστής κάνει commit αλλαγών, το Git δημιουργεί ένα commit object που αποθηκεύει: tree object (δομή αρχείων), hash γονικού commit, συγγραφέα, committer, ημερομηνία και μήνυμα. Αυτό το αντικείμενο είναι αμετάβλητο — μετά τη δημιουργία, το commit δεν μπορεί να τροποποιηθεί χωρίς αλλαγή του hash του. Αυτή η αμεταβλητότητα εγγυάται την ακεραιότητα της ιστορίας του έργου.
# Προετοιμασία αλλαγών και commit
git add index.html style.css
git commit -m "Fix responsive layout on mobile devices"
# Προβολή λεπτομερειών commit
git log --oneline -3
git show HEAD
# Προετοιμασία όλων των αλλαγών και commit σε ένα βήμα
git commit -a -m "Update dependencies to latest versions"
Τα commits σχηματίζουν έναν κατευθυνόμενο ακυκλικό γράφο (DAG), όπου κάθε νέο commit αναφέρεται στο προηγούμενο. Αυτό επιτρέπει την πλοήγηση στην ιστορία, την ακύρωση αλλαγών και την ανάλυση της εξέλιξης της βάσης κώδικα. Η κατανόηση της δομής Git DAG — η βάση για προηγμένη εργασία με commits.
Η διαδικασία commit στο Git αποτελείται από δύο στάδια: προσθήκη αλλαγών στο staging area (ευρετήριο) και δημιουργία commit. Το staging area επιτρέπει στον προγραμματιστή να επιλέξει ποιες αλλαγές θα εισαχθούν στο commit, ακόμα κι αν έχουν τροποποιηθεί πολλά αρχεία στον κατάλογο εργασίας.
Ο κανόνας ατομικότητας — η βασική αρχή ενός καλού commit. Κάθε commit πρέπει να περιέχει μία λογική αλλαγή. Αν ο προγραμματιστής διορθώνει ένα σφάλμα και αναδιαρθρώνει κώδικα — αυτά είναι δύο διαφορετικά commits. Τα ατομικά commits απλοποιούν την αναθεώρηση κώδικα, την αναίρεση αλλαγών και την ανάλυση ιστορίας.
Πριν κάνεις commit, αξίζει να ελέγξεις: αν έχουν μείνει στον κώδικα έξοδοι εντοπισμού σφαλμάτων, σχολιασμένα μπλοκ ή τυχαίες αλλαγές. Γι' αυτό χρησιμοποιείται η εντολή git diff --cached, που δείχνει τι ακριβώς θα εισαχθεί στο commit. Πρόσθετος έλεγχος μέσω git status εμφανίζει τη λίστα αρχείων στο staging area.
Το μήνυμα commit είναι η τεκμηρίωση της αλλαγής για μελλοντικούς προγραμματιστές. Ένα καλό μήνυμα απαντά στις ερωτήσεις: τι άλλαξε και γιατί. Η σύμβαση Conventional Commits (ομάδα Angular, 2016) έχει γίνει πρότυπο για πολλά έργα και καθορίζει τη μορφή: τύπος(τομέας): περιγραφή.
| Τύπος | Σκοπός | Παράδειγμα |
|---|---|---|
| feat | νέα λειτουργικότητα | feat(api): add user registration endpoint |
| fix | διόρθωση σφάλματος | fix(auth): resolve token refresh issue |
| refactor | αναδιάρθρωση χωρίς αλλαγή συμπεριφοράς | refactor(core): extract payment validator |
| docs | τεκμηρίωση | docs(readme): update installation guide |
| test | προσθήκη tests | test(cart): add unit tests for checkout |
Ένα καλό μήνυμα commit αποτελείται από επικεφαλίδα (έως 50 χαρακτήρες) και σώμα (προαιρετικά, έως 72 χαρακτήρες ανά γραμμή). Η επικεφαλίδα γράφεται σε προστακτική έγκλιση: “Add” όχι “Added” ή “Adds”. Κεφαλαίο γράμμα και τελεία στο τέλος της επικεφαλίδας δεν χρησιμοποιούνται — αυτή είναι η διεθνής σύμβαση Git.
Κακό μήνυμα: “fix things” ή “update” — δεν φέρει πληροφορία. Σε ένα μήνα ο προγραμματιστής δεν θα μπορεί να καταλάβει τι ακριβώς άλλαξε και γιατί. Καλό μήνυμα: “fix(payment): handle timeout in stripe callback” — αμέσως ξεκάθαρο πού και τι διορθώθηκε.
Οι προγραμματιστές, ειδικά οι αρχάριοι, συχνά κάνουν τυπικά λάθη στα commits. Το πιο συνηθισμένο — πολύ μεγάλο commit στο οποίο αναμειγνύονται δεκάδες αλλαγές. Ένα τέτοιο commit δεν μπορεί να ακυρωθεί μερικώς, και η αναθεώρηση κώδικα γίνεται μαρτύριο.
Το δεύτερο πιο συχνό λάθος — κακό μήνυμα commit. Μηνύματα τύπου “fix”, “update”, “changes” ή “wip” δεν δίνουν πλαίσιο σε μελλοντικούς προγραμματιστές. Σε έξι μήνες κανείς δεν θα θυμάται τι ακριβώς διορθώθηκε. Ο κανόνας είναι απλός: φαντάσου ότι σε ένα χρόνο κοιτάς την ιστορία και προσπαθείς να βρεις μια συγκεκριμένη αλλαγή.
Τρίτο λάθος — commit μη μεταγλωττισμένου ή μη λειτουργικού κώδικα. Μετά το commit, ο κώδικας πρέπει τουλάχιστον να μεταγλωττίζεται. Μη σπασμένο build — βασική απαίτηση για κάθε commit σε κοινό branch. Γι' αυτό πριν το commit εκτελούνται build και tests.
Τέταρτο λάθος — commit με εμπιστευτικά δεδομένα. Κλειδιά API, κωδικοί πρόσβασης και token δεν πρέπει να εισέρχονται στην ιστορία Git. Αν ένα μυστικό έχει ήδη γίνει commit, δεν αρκεί απλώς να διαγραφεί σε ένα νέο commit — πρέπει να διαγραφεί από ολόκληρη την ιστορία μέσω git filter-branch ή BFG Repo-Cleaner.
Το Git παρέχει εργαλεία για τη διαχείριση της ιστορίας commits. Ένα από τα πιο χρήσιμα είναι το git commit --amend, που επιτρέπει τη συμπλήρωση του τελευταίου commit με νέες αλλαγές ή τη διόρθωση του μηνύματος. Είναι βολικό αν ο προγραμματιστής ξέχασε να συμπεριλάβει ένα αρχείο ή έκανε λάθος στο μήνυμα.
# Διόρθωση τελευταίου μηνύματος commit
git commit --amend -m "fix(auth): correct token validation logic"
# Προσθήκη αρχείου που παραλείφθηκε στο τελευταίο commit
git add missed-file.txt
git commit --amend --no-edit
# Διαδραστικό rebase για τα τελευταία 3 commits
git rebase -i HEAD~3
Το Interactive rebase — ισχυρό εργαλείο για επανεγγραφή της ιστορίας. Επιτρέπει τη συγχώνευση commits (squash), αλλαγή μηνυμάτων (reword), αλλαγή σειράς (reorder) και διαγραφή commits (drop). Ωστόσο, το rebase αλλάζει την ιστορία, γι' αυτό εφαρμόζεται μόνο σε τοπικά commits που δεν έχουν αποσταλεί ακόμα στο απομακρυσμένο αποθετήριο.
Για την ακύρωση commits υπάρχουν δύο προσεγγίσεις. git revert δημιουργεί ένα νέο commit που ακυρώνει τις αλλαγές του προηγούμενου — ασφαλής τρόπος που διατηρεί την ιστορία. git reset διαγράφει commits από την ιστορία — επικίνδυνο αν τα commits έχουν ήδη αποσταλεί. Στην ομαδική ανάπτυξη χρησιμοποιείται μόνο git revert για ακύρωση δημοσιευμένων commits.
Συχνές Ερωτήσεις
Κάνω commit σημαίνει να δημιουργήσεις ένα σημείο αποθήκευσης αλλαγών στο Git. Το commit καταγράφει την τρέχουσα κατάσταση αρχείων στην ιστορία του έργου με περιγραφή του τι και γιατί άλλαξε. Κάθε commit έχει μοναδικό αναγνωριστικό (hash SHA-1) και αποτελεί μέρος μιας αδιάσπαστης αλυσίδας αλλαγών.
Συνιστάται να κάνεις commits μετά από κάθε λογικά ολοκληρωμένη αλλαγή, ακόμα και μικρή. Βέλτιστη συχνότητα — 1 commit ανά εργασία ή διόρθωση. Δεν αξίζει να κάνεις commit κάθε 5 λεπτά, αλλά ούτε και να συσσωρεύεις αλλαγές για πολλές ημέρες χωρίς κανένα commit.
Το ατομικό commit περιέχει μία λογική αλλαγή — μία εργασία, μία διόρθωση σφάλματος ή μία νέα λειτουργικότητα. Δεν αναμειγνύει διαφορετικές αλλαγές σε ένα commit. Πλεονεκτήματα ατομικών commits: απλότητα αναίρεσης, κατανοητή ιστορία και εύκολη αναθεώρηση κώδικα.
Για ακύρωση δημοσιευμένου commit χρησιμοποίησε git revert
Ναι, πριν από την αποστολή στο απομακρυσμένο αποθετήριο. Χρησιμοποίησε git commit --amend για αλλαγή του τελευταίου commit ή git rebase -i για αλλαγή πολλών commits. Μετά το push, η αλλαγή ιστορίας δεν συνιστάται — μπορεί να προκαλέσει προβλήματα σε άλλους προγραμματιστές αν έχουν ήδη στείλει τις αλλαγές τους.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης