| # | Ενότητα |
|---|---|
| 1 | Συνεργασία: δύο μοντέλα |
| 2 | Fork και clone |
| 3 | Συγχρονισμός του fork (upstream) |
| 4 | Τα issues |
| 5 | Καλές πρακτικές ομάδας |
| 6 | Κουίζ — Η συνεργατική ροή εργασίας |
| 7 | Πρακτική — Συνεισφορά μέσω fork |
| 8 | Σύνοψη |
Για να εργαστείτε πολλοί σε ένα αποθετήριο, υπάρχουν δύο μεγάλα μοντέλα συνεργασίας. Η επιλογή εξαρτάται κυρίως από το ποιος έχει δικαίωμα εγγραφής στο αποθετήριο.
| Μοντέλο | Αρχή | Τυπική περίπτωση |
|---|---|---|
| Κοινόχρηστος κλάδος | Όλα τα μέλη έχουν πρόσβαση εγγραφής· ο καθένας δημιουργεί τους κλάδους του στο ίδιο αποθετήριο | Εσωτερική ομάδα, επιχείρηση |
| Fork & pull | Αντιγράφετε το αποθετήριο στον δικό σας λογαριασμό, εργάζεστε εκεί, έπειτα προτείνετε ένα PR προς το πρωτότυπο | Open source, εξωτερικοί συνεισφέροντες |
Στην επιχείρηση, χρησιμοποιούμε σχεδόν πάντα τον κοινόχρηστο κλάδο (μαθήματα 01–03). Για να συνεισφέρετε σε ένα έργο open source του οποίου δεν είστε μέλος, περνάτε από το fork.
Ένα fork είναι ένα προσωπικό αντίγραφο ενός αποθετηρίου στον δικό σας λογαριασμό GitHub. Έχετε όλα τα δικαιώματα εκεί, χωρίς να αγγίζετε το πρωτότυπο. Το clone, από την άλλη, κατεβάζει ένα αποθετήριο στον τοπικό υπολογιστή σας.
Μην τα συγχέετε:
| Όρος | Πού; | Ενέργεια |
|---|---|---|
| Fork | Στο GitHub | Αντιγράφει το αποθετήριο στον λογαριασμό σας |
| Clone | Από το GitHub στον υπολογιστή σας | Κατεβάζει το αποθετήριο τοπικά |
| origin | Το απομακρυσμένο fork σας | Εκεί που στέλνετε |
| upstream | Το αρχικό αποθετήριο | Η πηγή που ακολουθείτε |
# 1. Το fork γίνεται με το κουμπί "Fork" στο GitHub (ή το CLI)
gh repo fork projet/app --clone
# Χειροκίνητο ισοδύναμο μετά από ένα fork:
# 2. Κλωνοποίηση ΤΟΥ ΔΙΚΟΥ ΣΑΣ fork
git clone https://github.com/vous/app.git
cd app
# 3. Επαλήθευση του remote
git remote -v
# origin https://github.com/vous/app.git (fetch/push)Το fork είναι το «sandbox» σας: μπορείτε να τα σπάσετε όλα χωρίς κίνδυνο για το αρχικό έργο. Όταν η δουλειά σας είναι έτοιμη, ένα pull request την προτείνει στον συντηρητή, που αποφασίζει αν θα την αποδεχτεί.
🔧 Μίνι-άσκηση — Με το gh, κάντε fork το αποθετήριο projet/app και κλωνοποιήστε το στον υπολογιστή σας με μία εντολή.
gh repo fork projet/app --clone
Ενώ εργάζεστε, το αρχικό αποθετήριο εξελίσσεται. Το fork σας δεν ενημερώνεται μόνο του. Πρέπει να προσθέσετε ένα remote upstream που δείχνει στο πρωτότυπο, και έπειτα να ανακτάτε τις αλλαγές του τακτικά.
# 1. Δήλωση του αρχικού αποθετηρίου ως 'upstream'
git remote add upstream https://github.com/projet/app.git
# 2. Ανάκτηση των τελευταίων αλλαγών του
git fetch upstream
# 3. Ενημέρωση του τοπικού main
git switch main
git merge upstream/main
# 4. Αποστολή στο δικό σας fork
git push origin main| Remote | Ρόλος | Κατεύθυνση χρήσης |
|---|---|---|
origin | Το fork σας | push της εργασίας σας |
upstream | Αρχικό αποθετήριο | fetch των ενημερώσεων των άλλων |
Ο συγχρονισμός νωρίς και συχνά με το
upstreamαποτρέπει το fork σας από το να «απομακρυνθεί» από το έργο. Όσο περισσότερο περιμένετε, τόσο περισσότερες θα είναι οι συγκρούσεις την ημέρα του PR.
🔧 Μίνι-άσκηση — Γράψτε την εντολή για να δηλώσετε το αρχικό αποθετήριο https://github.com/projet/app.git ως remote upstream.
git remote add upstream https://github.com/projet/app.git
Ένα issue είναι ένα εισιτήριο: ένα μέρος για να σηματοδοτήσετε ένα σφάλμα, να προτείνετε μια λειτουργία ή να θέσετε μια ερώτηση. Είναι το σύστημα παρακολούθησης ενός έργου GitHub.
Τι βάζουμε σε ένα καλό issue σφάλματος:
| Στοιχείο | Παράδειγμα |
|---|---|
| Σαφής τίτλος | «Crash στο κλικ στο Εξαγωγή» |
| Βήματα αναπαραγωγής | 1. Άνοιγμα X, 2. κλικ στο Y… |
| Αναμενόμενη συμπεριφορά | «Το αρχείο κατεβαίνει» |
| Παρατηρούμενη συμπεριφορά | «Η εφαρμογή κλείνει» |
| Περιβάλλον | ΛΣ, περιηγητής, έκδοση |
# Δημιουργία issue από το τερματικό
gh issue create --title "Crash au clic sur Exporter" \
--body "Étapes : 1) ouvrir X 2) cliquer Exporter → l'app se ferme."
# Λίστα ανοιχτών issues
gh issue list
# Σύνδεση ενός PR με ένα issue: στην περιγραφή του PR
# Closes #42 → κλείνει αυτόματα το issue #42 στη συγχώνευσηΟι ετικέτες οργανώνουν τα issues: bug, enhancement, documentation, good first issue, help wanted…
Τα issues μετατρέπουν το «θα έπρεπε να το διορθώσουμε κάποια μέρα» σε ιχνηλατήσιμες και συζητήσιμες εργασίες. Η σύνδεση ενός PR με
Closes #Nκλείνει το issue αυτόματα στη συγχώνευση: μηδέν ξεχασμένα.
🔧 Μίνι-άσκηση — Με το gh, δημιουργήστε ένα issue με τίτλο «Crash au clic sur Exporter».
gh issue create --title "Crash au clic sur Exporter" --body "L'app se ferme au clic sur Exporter."
Πέρα από τις εντολές, η αποτελεσματική συνεργασία βασίζεται σε κοινές συμβάσεις. Ακολουθούν εκείνες που κάνουν τη διαφορά.
| Καλή πρακτική | Συγκεκριμένα |
|---|---|
| Σαφή μηνύματα commit | «Διορθώνει τον υπολογισμό ΦΠΑ», όχι «update» |
| Σύμβαση ονοματοδοσίας | feature/, fix/, docs/ για τους κλάδους |
| Σύντομοι κλάδοι | Ενσωμάτωση νωρίς για περιορισμό συγκρούσεων |
| Μικρά και αναθεωρημένα PR | Σοβαρή ανάγνωση, λιγότερα σφάλματα |
Το main πάντα αναπτύξιμο | Ποτέ δεν σπάμε τον κύριο κλάδο |
Ένα αρχείο README + CONTRIBUTING | Τεκμηριώνει πώς να συνεισφέρετε |
Το πρότυπο των «Conventional Commits», πολύ διαδεδομένο:
git commit -m "feat: ajout de l'export CSV"
git commit -m "fix: corrige le crash au login"
git commit -m "docs: mise à jour du README"
git commit -m "refactor: simplifie le service de paiement"| Πρόθεμα | Σημασία |
|---|---|
feat: | Νέα λειτουργία |
fix: | Διόρθωση σφάλματος |
docs: | Τεκμηρίωση |
refactor: | Επανεγγραφή χωρίς αλλαγή συμπεριφοράς |
test: | Προσθήκη ή τροποποίηση δοκιμών |
Μια ομάδα που μοιράζεται συμβάσεις δεν χρειάζεται να συνεννοείται αδιάκοπα: ο κώδικας, τα commits και οι κλάδοι «μιλούν» την ίδια γλώσσα. Αυτό είναι η συνεργατική ρευστότητα.
🔧 Μίνι-άσκηση — Μόλις προσθέσατε την εξαγωγή CSV. Γράψτε το μήνυμα commit στη μορφή Conventional Commits.
git commit -m "feat: ajout de l'export CSV" (πρόθεμα feat: για νέα λειτουργία).
Question 1 : Τι είναι ένα fork;
a) Συγχώνευση δύο κλάδων
b) Προσωπικό αντίγραφο ενός αποθετηρίου στον λογαριασμό σας GitHub
c) Ένας τύπος σύγκρουσης
d) Διαγραφή του ιστορικού
✅ Απάντηση: b) — Ένα fork αντιγράφει το αποθετήριο στον λογαριασμό σας· εργάζεστε ελεύθερα χωρίς να αγγίζετε το πρωτότυπο.
Question 2 : Ποια είναι η διαφορά μεταξύ origin και upstream στο μοντέλο fork & pull;
a) Καμία, είναι συνώνυμα
b) Το origin είναι το fork σας, το upstream είναι το αρχικό αποθετήριο
c) Το origin είναι τοπικό, το upstream είναι στον δίσκο σας
d) Το upstream χρησιμεύει για διαγραφή κλάδων
✅ Απάντηση: b) — Στέλνουμε στο origin (το fork μας) και ανακτούμε ενημερώσεις από το upstream (το πρωτότυπο).
Question 3 : Σε τι χρησιμεύει ένα issue;
a) Να μεταγλωττίσετε τον κώδικα
b) Να σηματοδοτήσετε ένα σφάλμα, να προτείνετε μια λειτουργία ή να συζητήσετε μια εργασία
c) Να συγχωνεύσετε αυτόματα τους κλάδους
d) Να κλωνοποιήσετε ένα αποθετήριο
✅ Απάντηση: b) — Ένα issue είναι ένα εισιτήριο παρακολούθησης: σφάλμα, ιδέα, ερώτηση, οργανωμένο με ετικέτες.
Question 4 : Τι κάνει το Closes #42 στην περιγραφή ενός pull request;
a) Διαγράφει το commit 42
b) Κλείνει αυτόματα το issue #42 όταν συγχωνευθεί το PR
c) Ανοίγει ένα νέο issue
d) Ακυρώνει το PR
✅ Απάντηση: b) — Η λέξη-κλειδί Closes (ή Fixes) συνδέει το PR με το issue και το κλείνει στη συγχώνευση.
Question 5 : Τι σημαίνει το πρόθεμα commit fix: στα Conventional Commits;
a) Νέα λειτουργία
b) Διόρθωση σφάλματος
c) Τεκμηρίωση
d) Δοκιμή
✅ Απάντηση: b) — Το fix: δηλώνει διόρθωση σφάλματος· το feat: μια λειτουργία, το docs: τεκμηρίωση.
Θέλετε να συνεισφέρετε σε ένα έργο open source projet/app του οποίου δεν είστε μέλος. Εκτελέστε τον πλήρη κύκλο του μοντέλου fork & pull:
upstream και συγχρονίστε το main σας.# 1. Fork + κλωνοποίηση
gh repo fork projet/app --clone
cd app
# 2. Προσθήκη upstream και συγχρονισμός
git remote add upstream https://github.com/projet/app.git
git fetch upstream
git switch main
git merge upstream/main
git push origin main
# 3. Διακλάδωση, commit, αποστολή
git switch -c fix/correction-typo-readme
# ... διόρθωση του αρχείου README ...
git commit -am "fix: corrige une faute dans le README"
git push -u origin fix/correction-typo-readme
# 4. Άνοιγμα του PR προς το ΑΡΧΙΚΟ αποθετήριο
gh pr create --repo projet/app \
--base main --head vous:fix/correction-typo-readme \
--title "fix: faute de frappe dans le README" \
--body "Corrige une coquille. Closes #8"Αναμενόμενο αποτέλεσμα:
| Βήμα | Επαλήθευση |
|---|---|
| Fork δημιουργήθηκε | Το αποθετήριο εμφανίζεται στο github.com/vous/app |
Προστέθηκε upstream | Το git remote -v εμφανίζει origin και upstream |
| Κλάδος στάλθηκε | Ο κλάδος υπάρχει στο δικό σας fork (origin) |
| PR άνοιξε | Το PR στοχεύει το projet/app:main από το vous:fix/... |
| Issue συνδεδεμένο | Το Closes #8 θα κλείσει το issue όταν συγχωνεύσει ο συντηρητής |
$ git remote -v
origin https://github.com/vous/app.git (push)
upstream https://github.com/projet/app.git (fetch)Το PR ξεκινά από τον δικό σας κλάδο (
vous:fix/...) προς τοmainτου αρχικού αποθετηρίου. Ο συντηρητής το αναθεωρεί και αποφασίζει να συγχωνεύσει: μόλις συνεισφέρατε στο open source χωρίς ποτέ να έχετε δικαίωμα εγγραφής στο έργο.
Closes #N συνδέει και κλείνει στη συγχώνευση.main.feat:, fix:, docs:…) τυποποιούν τα μηνύματα.Αυτό το module 02 ολοκληρώθηκε: ξέρετε πλέον να διακλαδώνετε, να συγχωνεύετε, να ανοίγετε pull requests και να συνεργάζεστε σε μεγάλη κλίμακα. Το module 03 συνεχίζει τη διαδρομή DevOps με τη συνεχή ενσωμάτωση (CI/CD), που θα αυτοματοποιήσει δοκιμές και αναπτύξεις από τα ίδια αυτά pull requests.
Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων