Βασικές Έννοιες
Ορισμοί με παραδείγματα.
📦 Repository (Repo)
Ο "φάκελος" που το Git παρακολουθεί. Περιέχει όλο το ιστορικό των αλλαγών.
- Local repo: στον δικό σου υπολογιστή
- Remote repo: στο GitLab
Παράδειγμα: το Chronos project → 1 repo, με local αντίγραφο στο PC σου και remote στο GitLab.
📝 Commit
Ένα "στιγμιότυπο" (snapshot) των αλλαγών σου, με μήνυμα που εξηγεί τι έκανες. Είναι σαν save point σε παιχνίδι.
Κάθε commit έχει: μοναδικό hash (π.χ. a3f5c9d), author,
timestamp, μήνυμα, και δείχνει στο "γονικό" commit πριν από αυτό.
Τα commits είναι τοπικά μέχρι να κάνεις push.
Παράδειγμα: άλλαξες τα config files → git add → git commit -m "2030-projectX-central-4h-1cycle".
Στο SourceTree: staged files (κάτω αριστερά) → γράφεις μήνυμα → κουμπί
Commit.
:::warning Συχνή παρανόηση Commit ≠ Push. Το commit μένει στον υπολογιστή σου μέχρι να το στείλεις. :::
🎯 Stage / Staging (Index)
Η διαδικασία να "σημαδέψεις" ποιες αλλαγές θα μπουν στο επόμενο commit.
Γιατί υπάρχει; Γιατί μπορεί να έχεις αλλάξει 5 αρχεία αλλά να θέλεις να κάνεις commit μόνο τα 2 (π.χ. να χωρίσεις τις αλλαγές σε λογικά commits).
- Unstaged = "το είδα, δεν το πρόσθεσα ακόμα"
- Staged = "έτοιμο να μπει στο commit"
Στο SourceTree: πάνω λίστα = unstaged, κάτω λίστα = staged. Κλικ στο checkbox ή drag για stage.
Εντολή: git add config.yaml (ή git add . για όλα)
⬆️ Push
Στέλνεις τα τοπικά commits σου στο remote (GitLab), ώστε να τα δουν και οι άλλοι.
Παράδειγμα: έκανες 3 commits τοπικά όλο το πρωί. Στο τέλος πατάς Push → ανεβαίνουν στο GitLab, στο branch που δουλεύεις.
Αν κάποιος άλλος έχει κάνει push πριν από σένα στο ίδιο branch, το push σου θα αποτύχει μέχρι να κάνεις πρώτα pull/fetch + merge.
⬇️ Fetch
Κατεβάζει τις πληροφορίες (νέα commits, branches) από το remote, χωρίς να τις ενσωματώσει στα δικά σου αρχεία.
Είναι σαν να λες: "Δείξε μου τι άλλαξε στο GitLab, αλλά μην αγγίξεις τίποτα δικό μου ακόμα."
Χρήσιμο για να δεις τι έκαναν οι συνάδελφοι πριν αποφασίσεις αν θα κάνεις merge.
Στο SourceTree: κουμπί Fetch πάνω-πάνω. Θα δεις τα remote branches να ενημερώνονται (γκρι γραμμές στο γράφημα) αλλά το δικό σου working directory μένει ίδιο.
⬇️➕ Pull
= Fetch + Merge (ή Fetch + Rebase, ανάλογα με τη ρύθμιση) σε ένα βήμα.
Κατεβάζει τις αλλαγές από το remote ΚΑΙ τις ενσωματώνει στο τρέχον branch σου.
Παράδειγμα: ξεκινάς τη μέρα σου → πρώτο πράγμα, Pull στο main, για
να πάρεις ό,τι έκαναν οι άλλοι το βράδυ.
Δες Pull: Merge vs Rebase για τη διαφορά.
🌿 Branch
Ένα ανεξάρτητο "μονοπάτι" ανάπτυξης. Σου επιτρέπει να δουλεύεις σε κάτι
καινούργιο χωρίς να επηρεάζεις τον κύριο κώδικα (main/master).
- Local branch: υπάρχει μόνο στον υπολογιστή σου
- Remote branch: υπάρχει στο GitLab (π.χ.
origin/feature-x) - Tracking branch: ένα local branch που είναι "συνδεδεμένο" με ένα remote branch, ώστε το push/pull να ξέρει πού να πάει αυτόματα
Παράδειγμα: θες να δοκιμάσεις ένα νέο σενάριο χωρίς να σπάσεις το
production. → git checkout -b feature/battery-degradation (δημιουργεί +
πηγαίνει στο νέο branch)
Στο SourceTree: δεξί κλικ στο branch → New Branch, ή κουμπί Branch πάνω.
Naming conventions που συνηθίζονται:
feature/xyz— νέο χαρακτηριστικόfix/xyzήbugfix/xyz— διόρθωση bughotfix/xyz— επείγουσα διόρθωση σε productionrelease/1.2.0— προετοιμασία release
🔀 Merge
Ενώνει τις αλλαγές από ένα branch σε ένα άλλο, δημιουργώντας ένα merge commit (αν χρειάζεται) που έχει 2 "γονείς".
Παράδειγμα: τελείωσες το feature/battery-degradation και δουλεύει →
πας στο main → Merge το feature/battery-degradation μέσα.
Το ιστορικό δείχνει καθαρά ότι υπήρχαν 2 ξεχωριστά branches που ενώθηκαν (διακλάδωση στο graph).
- Πλεονέκτημα: διατηρεί πλήρες, ακριβές ιστορικό.
- Μειονέκτημα: το graph μπορεί να γίνει "μπερδεμένο" με πολλά merges.
🔁 Rebase
Παίρνει τα commits σου από ένα branch και τα "ξαναγράφει" πάνω στην τελευταία έκδοση ενός άλλου branch — σαν να τα είχες κάνει από την αρχή εκεί.
Παράδειγμα: δουλεύεις στο feature/battery-degradation 3 μέρες. Στο
μεταξύ το main έχει προχωρήσει. Κάνεις git rebase main (ενώ είσαι στο
feature branch) → τα 3 commits σου "μετακινούνται" σαν να ξεκίνησες σήμερα,
πάνω στο τελευταίο main.
- Πλεονέκτημα: καθαρό, γραμμικό ιστορικό (χωρίς merge commits).
- Μειονέκτημα: ξαναγράφει ιστορικό → ποτέ μην κάνεις rebase σε branch που το έχουν κατεβάσει άλλοι (θα τους δημιουργήσει χάος).
:::tip Κανόνας για αρχάριους Merge όταν δεν είσαι σίγουρος. Rebase μόνο σε προσωπικά, τοπικά branches πριν τα μοιραστείς. :::
⚔️ Merge Conflict
Συμβαίνει όταν το Git δεν μπορεί να αποφασίσει μόνο του πώς να συνδυάσει δύο αλλαγές στην ίδια γραμμή ενός αρχείου.
Παράδειγμα: εσύ άλλαξες μια γραμμή στο config.yaml σε "Χ", ο
συνάδελφος την άλλαξε σε "Ψ", και τα δύο branches προσπαθούν να ενωθούν.
Το Git σου δείχνει κάτι σαν:
<<<<<<< HEAD
cycles_per_day: 1.5 # δική σου αλλαγή
=======
cycles_per_day: 2.0 # αλλαγή συναδέλφου
>>>>>>> feature/battery-degradation
Πρέπει να διαλέξεις (ή να συνδυάσεις) χειροκίνητα, να σβήσεις τα
<<<<<<< / ======= / >>>>>>>, και μετά git add + commit για να
"λύσεις" (resolve) το conflict.
Στο SourceTree: τα conflicted αρχεία εμφανίζονται με κόκκινο εικονίδιο. Δεξί κλικ → Resolve Conflicts → Launch External Merge Tool (ή χειροκίνητα σε editor).
🔗 Remote
Ένα "όνομα-δείκτης" προς μια απομακρυσμένη τοποθεσία repository (π.χ. στο GitLab).
- Το προεπιλεγμένο όνομα remote είναι σχεδόν πάντα
origin - Μπορείς να έχεις πολλαπλά remotes (π.χ.
originγια GitLab,upstreamγια κάποιο άλλο fork)
Στο SourceTree: αριστερό μενού → REMOTES → βλέπεις origin και τη
διεύθυνση GitLab.
📌 HEAD
Δείχνει πού βρίσκεσαι αυτή τη στιγμή — ποιο commit/branch είναι "ενεργό".
Αν είσαι στο branch main, το HEAD δείχνει στο τελευταίο commit του main.
"Detached HEAD" = είσαι σε συγκεκριμένο commit, όχι σε branch (προσοχή, αν κάνεις commits εκεί μπορεί να "χαθούν").
🏷️ Tag
Μια "ετικέτα" σε συγκεκριμένο commit, συνήθως για versions/releases.
Παράδειγμα: v1.0.0, v1.1.0 για releases.
Στο SourceTree: δεξί κλικ σε commit → Tag.
📦 Stash
Προσωρινά "βάζεις στην άκρη" αλλαγές που δεν έχεις κάνει commit, χωρίς να τις χάσεις, ώστε να αλλάξεις branch καθαρά.
Παράδειγμα: δουλεύεις κάτι στο feature/battery-degradation, ξαφνικά
πρέπει να πας urgent στο main για hotfix, αλλά δεν είσαι έτοιμος να κάνεις
commit. → Stash (σώζει τις αλλαγές "στην άκρη") → αλλάζεις branch → μετά
Stash Pop για να τις πάρεις πίσω.
Στο SourceTree: κουμπί Stash πάνω. Οι stashes εμφανίζονται στο αριστερό μενού κάτω από STASHES.
↩️ Reset vs Revert vs Checkout
Η πιο μπερδεμένη τριάδα:
| Εντολή | Τι κάνει | Ασφαλές; |
|---|---|---|
| Checkout | Πηγαίνεις σε άλλο branch/commit (αλλάζει τι βλέπεις) | ✅ Ναι, δεν χάνεται τίποτα |
| Revert | Δημιουργεί νέο commit που αναιρεί ένα προηγούμενο | ✅ Ασφαλές, διατηρεί ιστορικό |
| Reset | "Μετακινεί" το branch πίσω σε παλιότερο commit, σβήνοντας το ιστορικό μετά από κει (soft/mixed/hard) | ⚠️ Επικίνδυνο αν έχει γίνει ήδη push |
Παράδειγμα Revert: έκανες commit κάτι λάθος, το έστειλες ήδη (push). Θες να το αναιρέσεις χωρίς να χαλάσεις το ιστορικό των άλλων → Revert (ασφαλές, δημόσιο).
Παράδειγμα Reset: έκανες commit κάτι τοπικά, ΔΕΝ το έστειλες ακόμα, θες απλά να το σβήσεις σαν να μην έγινε → Reset (τοπικό, ασφαλές μόνο αν δεν το μοιράστηκες).
:::danger Χρυσός κανόνας Reset μόνο σε πράγματα που ΔΕΝ έχεις κάνει push. Αν το έχεις ήδη στείλει, χρησιμοποίησε Revert. :::
🔄 Merge Request (MR)
Το GitLab αντίστοιχο του "Pull Request".
Δεν είναι Git εντολή — είναι λειτουργία του GitLab. Είναι ένα αίτημα:
"Θέλω να ενώσω το branch μου στο main — μπορεί κάποιος να το ελέγξει
(review) πρώτα;"
Ροή: Push το feature/battery-degradation στο GitLab → Ανοίγεις Merge
Request στο GitLab UI (feature/battery-degradation → main) →
Συνάδελφος κάνει review/σχόλια → Approve → Merge (μέσα από το
GitLab, όχι το SourceTree).
Το SourceTree δεν διαχειρίζεται τα MRs απευθείας — αυτό γίνεται στο web UI του GitLab.