Κλάδοι και στρατηγικές διακλάδωσης

9 λεπτά

Πίνακας περιεχομένων


1 — Γιατί κλάδοι;

Ένας κλάδος είναι μια ανεξάρτητη γραμμή ανάπτυξης. Επιτρέπει να εργάζεστε σε μια νέα λειτουργία ή μια διόρθωση χωρίς να αγγίζετε τον σταθερό κώδικα που χρησιμοποιούν οι άλλοι.

Σκεφτείτε έναν κλάδο σαν ένα ξεχωριστό πρόχειρο. Μπορείτε να κάνετε όλες τις δοκιμές που θέλετε· όσο δεν έχετε συγχωνεύσει, η δουλειά των άλλων δεν επηρεάζεται.

Χωρίς κλάδους, όλη η ομάδα θα έγραφε στο ίδιο αρχείο ταυτόχρονα: χάος εξασφαλισμένο. Με τους κλάδους, ο καθένας προχωρά στον διάδρομό του και έπειτα συγκεντρώνουμε καθαρά.

Οι βασικές εντολές που είδαμε ήδη στο module 01:

bash
# Δημιουργία κλάδου και μετάβαση σε αυτόν
git switch -c feature/login

# Λίστα κλάδων
git branch

# Επιστροφή στο main
git switch main
ΕνέργειαΣύγχρονη εντολήΠαλιά σύνταξη
Δημιουργία + μετάβασηgit switch -c nomgit checkout -b nom
Μετάβασηgit switch nomgit checkout nom
Λίσταgit branchgit branch
Διαγραφήgit branch -d nomgit branch -d nom

🔧 Μίνι-άσκηση — Γράψτε τη σύγχρονη εντολή για να δημιουργήσετε έναν κλάδο feature/login και να μεταβείτε σε αυτόν με μία κίνηση.

✅ Δείτε μια λύση

git switch -c feature/login (ισοδύναμο με την παλιά σύνταξη git checkout -b feature/login).

↑ Επιστροφή στην αρχή


2 — Οι τύποι κλάδων

Σε μια ομάδα, δεν δημιουργούμε κλάδους στην τύχη: τους δίνουμε έναν ρόλο και ένα συμβατικό όνομα. Ακολουθούν οι πιο διαδεδομένοι τύποι.

Τύπος κλάδουΣύνηθες πρόθεμαΡόλοςΔιάρκεια ζωής
Κύριοςmainmaster)Κώδικας σε παραγωγή, πάντα σταθερόςΜόνιμος
ΕνσωμάτωσηdevelopΣυγκεντρώνει τις λειτουργίες σε εξέλιξηΜόνιμος
Λειτουργίαfeature/Ανάπτυξη μιας νέας λειτουργίαςΣύντομη
Έκδοσηrelease/Σταθεροποίηση πριν από την παραγωγήΣύντομη
Επείγον διορθωτικόhotfix/Διόρθωση κρίσιμου σφάλματος στην παραγωγήΠολύ σύντομη

Παραδείγματα ρεαλιστικών ονομάτων:

bash
feature/ajout-paiement-stripe
feature/dashboard-utilisateur
release/1.4.0
hotfix/correction-faille-login

Μια καλή σύμβαση ονοματοδοσίας είναι δωρεάν τεκμηρίωση: μόνο από το όνομα του κλάδου, η ομάδα καταλαβαίνει για τι πρόκειται.

🔧 Μίνι-άσκηση — Πρέπει να διορθώσετε επειγόντως ένα κενό ασφαλείας σύνδεσης στην παραγωγή. Ποιο πρόθεμα κλάδου χρησιμοποιείτε, και προτείνετε ένα πλήρες όνομα.

✅ Δείτε μια λύση

Το πρόθεμα hotfix/ (επείγουσα διόρθωση που ξεκινά από το main). Παράδειγμα: hotfix/correction-faille-login.

↑ Επιστροφή στην αρχή


3 — Git Flow

Το Git Flow είναι μια δομημένη στρατηγική που εισήγαγε ο Vincent Driessen το 2010. Βασίζεται σε δύο μόνιμους κλάδους (main και develop) και τρεις τύπους προσωρινών κλάδων (feature, release, hotfix).

Ο τυπικός κύκλος:

  1. Ξεκινάμε από το develop για να δημιουργήσουμε έναν κλάδο feature/*.
  2. Όταν ολοκληρωθεί, το feature συγχωνεύεται στο develop.
  3. Όταν αρκετές λειτουργίες είναι έτοιμες, δημιουργούμε ένα release/* για σταθεροποίηση.
  4. Το release συγχωνεύεται στο main (και λαμβάνει ετικέτα) και στο develop.
  5. Κρίσιμο σφάλμα στην παραγωγή; Δημιουργούμε ένα hotfix/* από το main, έπειτα το συγχωνεύουμε στο main και στο develop.
bash
# Έναρξη μιας λειτουργίας (χωρίς την επέκταση git-flow)
git switch develop
git switch -c feature/panier

# ... εργασία + commits ...

git switch develop
git merge feature/panier
git branch -d feature/panier
ΠλεονεκτήματαΜειονεκτήματα
Πολύ δομημένο, σαφείς ρόλοιΒαρύ, πολλοί κλάδοι
Ιδανικό για προγραμματισμένες εκδόσειςΑκατάλληλο για συνεχή ανάπτυξη
Διαχωρίζει καθαρά ανάπτυξη και παραγωγήΠολύπλοκες συγχωνεύσεις, κίνδυνος συγκρούσεων

Το Git Flow λάμπει σε λογισμικό που παραδίδεται ανά εκδόσεις (εφαρμογές κινητών, εγκατεστημένα προγράμματα). Για έναν ιστότοπο που αναπτύσσεται 10 φορές την ημέρα, γίνεται τροχοπέδη.

↑ Επιστροφή στην αρχή


4 — GitHub Flow

Το GitHub Flow είναι μια στρατηγική απλή και ελαφριά, σχεδιασμένη για τη συνεχή ανάπτυξη. Ένας μόνο μόνιμος κλάδος: main. Όλα τα υπόλοιπα περνούν από σύντομους κλάδους feature και pull requests.

Οι χρυσοί κανόνες:

  1. Το main είναι πάντα έτοιμο για ανάπτυξη.
  2. Για κάθε εργασία, δημιουργούμε έναν περιγραφικό κλάδο από το main.
  3. Κάνουμε commit τακτικά και ανοίγουμε ένα pull request (το βλέπουμε στο μάθημα 03).
  4. Μετά από αναθεώρηση και πράσινα τεστ, συγχωνεύουμε στο main.
  5. Αναπτύσσουμε αμέσως το main.
bash
git switch main
git pull
git switch -c feature/filtre-recherche
# ... commits ...
git push -u origin feature/filtre-recherche
# → άνοιγμα ενός Pull Request στο GitHub
ΠλεονεκτήματαΜειονεκτήματα
Απλό, λίγοι κλάδοιΠροϋποθέτει καλή κάλυψη δοκιμών
Ιδανικό για web / SaaSΛιγότερο κατάλληλο για πολλές εκδόσεις προς συντήρηση
Ενθαρρύνει τις μικρές συχνές παραδόσειςΑπαιτεί πειθαρχία στην ποιότητα του main

Το GitHub Flow είναι πιθανότατα το καλύτερο σημείο εκκίνησης για μια σύγχρονη ομάδα: αρκετή δομή για συνεργασία, αρκετή ελαφρότητα για ταχύτητα.

🔧 Μίνι-άσκηση — Στο GitHub Flow, γράψτε τις δύο εντολές για να ξεκινήσετε από ένα ενημερωμένο main πριν δημιουργήσετε τον κλάδο εργασίας σας.

✅ Δείτε μια λύση
bash
git switch main
git pull

Και μόνο μετά: git switch -c feature/....

↑ Επιστροφή στην αρχή


5 — Trunk-Based Development

Το Trunk-Based Development (ανάπτυξη στον κορμό) ωθεί την απλότητα ακόμα πιο μακριά: όλοι ενσωματώνουν τη δουλειά τους σε έναν μοναδικό κλάδο (τον trunk, δηλαδή το main) πολύ συχνά — ιδανικά αρκετές φορές την ημέρα.

Βασικές αρχές:

  • Οι κλάδοι λειτουργιών είναι μικροσκοπικοί και ζουν λιγότερο από μία ημέρα.
  • Οι ημιτελείς λειτουργίες κρύβονται πίσω από feature flags (σημαίες) αντί να μένουν σε μακρούς κλάδους.
  • Η συνεχής ενσωμάτωση (CI) είναι υποχρεωτική: κάθε commit ενεργοποιεί build + δοκιμές.
bash
# Υπερσύντομος κύκλος
git switch main
git pull
# μικρή τροποποίηση...
git commit -am "Ajout du bouton export"
git push      # ενσωματωμένο στον κορμό λίγα λεπτά μετά
ΠλεονεκτήματαΜειονεκτήματα
Πραγματική συνεχής ενσωμάτωσηΑπαιτεί στερεή και γρήγορη CI
Αποφεύγει τα «συγχωνεύσεις της κόλασης»Απαιτεί πολλή πειθαρχία
Πρακτική πολύ αποδοτικών ομάδων (Google κ.λπ.)Feature flags προς διαχείριση

Ο χειρότερος εχθρός των ομάδων Git είναι οι κλάδοι που ζουν εβδομάδες. Όσο πιο αργά ενσωματώνουμε, τόσο πιο επώδυνη είναι η συγχώνευση. Το trunk-based το λύνει ενσωματώνοντας νωρίς και συχνά.

🔧 Μίνι-άσκηση — Στο Trunk-Based, πώς ενσωματώνετε μια λειτουργία μη ολοκληρωμένη χωρίς να μπλοκάρετε τους άλλους ούτε να δημιουργήσετε μακρύ κλάδο;

✅ Δείτε μια λύση

Κρύβουμε τον ημιτελή κώδικα πίσω από ένα feature flag (σημαία λειτουργίας): είναι ενσωματωμένος στον κορμό αλλά απενεργοποιημένος για τους χρήστες.

↑ Επιστροφή στην αρχή


6 — Σύγκριση και επιλογή στρατηγικής

Δεν υπάρχει καθολική στρατηγική: η σωστή επιλογή εξαρτάται από τον τύπο προϊόντος, την ωριμότητα της ομάδας και τη συχνότητα ανάπτυξης.

ΚριτήριοGit FlowGitHub FlowTrunk-Based
Μόνιμοι κλάδοι2 (main + develop)1 (main)1 (main)
ΠολυπλοκότηταΥψηλήΧαμηλήΠολύ χαμηλή
Συχνότητα παράδοσηςΑνά εκδόσειςΣυνεχήςΠολύ συνεχής
Διάρκεια κλάδωνΜεγάληΣύντομηΠολύ σύντομη (< 1 ημ.)
Απαιτούμενες αυτοματοποιημένες δοκιμέςΕπιθυμητέςΣημαντικέςΑπαραίτητες
Ιδανική περίπτωσηΕκδόσεις εφαρμογών, κινητάWeb / SaaS, μέση ομάδαΏριμη ομάδα, ισχυρή CI

Συμβουλή: οι περισσότερες ομάδες θα πρέπει να ξεκινήσουν με το GitHub Flow. Προσφέρει τον καλύτερο συμβιβασμό απλότητας / ασφάλειας. Μεταβαίνουμε στο trunk-based όταν η CI είναι ώριμη, ή στο Git Flow μόνο αν το προϊόν επιβάλλει εκδόσεις.

↑ Επιστροφή στην αρχή


7 — Κουίζ — Οι στρατηγικές διακλάδωσης

Question 1 : Σε τι χρησιμεύει κυρίως ένας κλάδος Git;

a) Να δημιουργεί αντίγραφο ασφαλείας του αποθετηρίου στο cloud

b) Να εργάζεστε απομονωμένα χωρίς να επηρεάζετε τον σταθερό κώδικα

c) Να συμπιέζετε τα αρχεία

d) Να διαγράφετε το ιστορικό

💡 Δείτε τη λύση

Απάντηση: b) — Ένας κλάδος είναι μια ανεξάρτητη γραμμή ανάπτυξης που απομονώνει τη δουλειά μέχρι τη συγχώνευση.


Question 2 : Πόσους μόνιμους κλάδους χρησιμοποιεί το Git Flow;

a) Έναν μόνο (main)

b) Δύο (main και develop)

c) Κανέναν

d) Έναν ανά προγραμματιστή

💡 Δείτε τη λύση

Απάντηση: b) — Το Git Flow βασίζεται σε δύο μόνιμους κλάδους: main (παραγωγή) και develop (ενσωμάτωση).


Question 3 : Ποια στρατηγική ταιριάζει καλύτερα σε έναν ιστότοπο που αναπτύσσεται αρκετές φορές την ημέρα;

a) Git Flow

b) GitHub Flow ή Trunk-Based

c) Καθόλου κλάδοι

d) Ένας κλάδος ανά έτος

💡 Δείτε τη λύση

Απάντηση: b) — Το GitHub Flow (και ακόμα περισσότερο το Trunk-Based) έχουν σχεδιαστεί για συνεχή ανάπτυξη. Το Git Flow θα ήταν υπερβολικά βαρύ.


Question 4 : Στο Trunk-Based Development, πώς κρύβουμε μια μη ολοκληρωμένη λειτουργία;

a) Σε έναν μακρύ κλάδο αρκετών εβδομάδων

b) Με ένα feature flag (σημαία λειτουργίας)

c) Διαγράφοντας τον κώδικα κάθε βράδυ

d) Δεν γίνεται, πρέπει να τελειώσουμε τα πάντα μονομιάς

💡 Δείτε τη λύση

Απάντηση: b) — Τα feature flags επιτρέπουν να ενσωματώνουμε ημιτελή κώδικα χωρίς να τον ενεργοποιούμε για τους χρήστες, αποφεύγοντας τους μακρούς κλάδους.


Question 5 : Ποιο πρόθεμα κλάδου χρησιμοποιούμε για να διορθώσουμε ένα κρίσιμο σφάλμα απευθείας στην παραγωγή;

a) feature/

b) release/

c) hotfix/

d) develop/

💡 Δείτε τη λύση

Απάντηση: c) — Ένας κλάδος hotfix/ ξεκινά από το main για να διορθώσει ένα επείγον σφάλμα, έπειτα συγχωνεύεται στο main και στο develop.

↑ Επιστροφή στην αρχή


8 — Πρακτική — Εφαρμογή του GitHub Flow

Οδηγία

Εργάζεστε σε ένα αποθετήριο του οποίου το main είναι σταθερό. Σας ζητείται να προσθέσετε μια σελίδα «Σχετικά». Εφαρμόστε το GitHub Flow:

  1. Ξεκινήστε από ένα ενημερωμένο main.
  2. Δημιουργήστε έναν καλά ονομασμένο κλάδο λειτουργίας.
  3. Κάντε ένα commit που προσθέτει το αρχείο apropos.html.
  4. Σπρώξτε τον κλάδο στο απομακρυσμένο αποθετήριο για να προετοιμάσετε ένα pull request.
  5. Καταγράψτε τους κλάδους σας για επαλήθευση.

Διόρθωση

bash
# 1. Εκκίνηση από ενημερωμένο main
git switch main
git pull origin main

# 2. Δημιουργία περιγραφικού κλάδου
git switch -c feature/page-apropos

# 3. Δημιουργία του αρχείου και commit
echo "<h1>À propos</h1>" > apropos.html
git add apropos.html
git commit -m "Ajout de la page À propos"

# 4. Αποστολή του κλάδου στο απομακρυσμένο
git push -u origin feature/page-apropos

# 5. Επαλήθευση των κλάδων
git branch

Αναμενόμενο αποτέλεσμα:

ΒήμαΕπαλήθευση
Κλάδος δημιουργήθηκεΤο git branch εμφανίζει * feature/page-apropos
Το commit υπάρχειΤο git log --oneline -1 δείχνει «Ajout de la page À propos»
Ο κλάδος στάλθηκεΤο Git εμφανίζει * [new branch] feature/page-apropos -> feature/page-apropos
Παρακολούθηση ρυθμισμένηΤο -u συνδέει τον τοπικό κλάδο με τον απομακρυσμένο
text
* feature/page-apropos
  main

Επόμενο λογικό βήμα: άνοιγμα ενός pull request στο GitHub για αναθεώρηση και συγχώνευση αυτής της εργασίας — αυτό ακριβώς είναι το αντικείμενο του μαθήματος 03.

↑ Επιστροφή στην αρχή


9 — Σύνοψη

Σημεία που πρέπει να θυμάστε

  1. Ένας κλάδος απομονώνει τη δουλειά χωρίς να επηρεάζει τον σταθερό κώδικα.
  2. Τύποι κλάδων: main, develop, feature/, release/, hotfix/ — ο καθένας με τον ρόλο του.
  3. Git Flow: δομημένο, δύο μόνιμοι κλάδοι, ιδανικό για προγραμματισμένες εκδόσεις.
  4. GitHub Flow: απλό, ένας κλάδος main + pull requests, ιδανικό για το web.
  5. Trunk-Based: πολύ συχνή ενσωμάτωση στον κορμό, απαιτεί στερεή CI.
  6. Η επιλογή εξαρτάται από το προϊόν, την ομάδα και τη συχνότητα ανάπτυξης.

Η συνέχεια

Τώρα που ξέρετε να οργανώνετε τους κλάδους σας, σειρά έχει το μάθημα 02 — Merge και rebase: πώς να συγκεντρώνετε καθαρά αυτούς τους κλάδους και να επιλύετε συγκρούσεις.

↑ Επιστροφή στην αρχή


Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.

Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων