Skip to main content

Βασικές Έννοιες

Ορισμοί με παραδείγματα.

📦 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 addgit 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.yamlgit add . για όλα)

⬆️ Push

Στέλνεις τα τοπικά commits σου στο remote (GitLab), ώστε να τα δουν και οι άλλοι.

Παράδειγμα: έκανες 3 commits τοπικά όλο το πρωί. Στο τέλος πατάς Push → ανεβαίνουν στο GitLab, στο branch που δουλεύεις.

warning

Αν κάποιος άλλος έχει κάνει 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, για να πάρεις ό,τι έκαναν οι άλλοι το βράδυ.

tip

Δες 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 — διόρθωση bug
  • hotfix/xyz — επείγουσα διόρθωση σε production
  • release/1.2.0 — προετοιμασία release

🔀 Merge

Ενώνει τις αλλαγές από ένα branch σε ένα άλλο, δημιουργώντας ένα merge commit (αν χρειάζεται) που έχει 2 "γονείς".

Παράδειγμα: τελείωσες το feature/battery-degradation και δουλεύει → πας στο mainMerge το 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 ConflictsLaunch 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-degradationmain) → Συνάδελφος κάνει review/σχόλια → ApproveMerge (μέσα από το GitLab, όχι το SourceTree).

note

Το SourceTree δεν διαχειρίζεται τα MRs απευθείας — αυτό γίνεται στο web UI του GitLab.