Τυπική κατάσταση:
feature-branchmain προχωρά (οι συνάδελφοι κάνουν push)main2 δυνατές στρατηγικές:
mkdir demo-merge && cd demo-merge && git init
# Κοινή βάση
echo "print('app v1')" > app.py
git add . && git commit -m "Version initiale"
# Κλάδος feature
git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"
# Το main προχωρά στο μεταξύ
git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"git merge feature-login* Merge branch 'feature-login'
|\
| * Improve login
| * Add login
* | Update main app
|/
* Version initialeΙστορικό: Δείχνει καθαρά ότι υπήρξαν 2 παράλληλες γραμμές ανάπτυξης.
mkdir demo-rebase && cd demo-rebase && git init
# Ίδια ρύθμιση όπως πριν...
echo "print('app v1')" > app.py
git add . && git commit -m "Version initiale"
git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"
git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"git checkout feature-login
git rebase main # "Μετακινεί" τα commits σας μετά το main
git checkout main
git merge feature-login # Fast-forward merge* Improve login
* Add login
* Update main app
* Version initialeΙστορικό: Γραμμικό, σαν να είχατε αναπτύξει μετά τις ενημερώσεις του main.
| Πτυχή | MERGE | REBASE |
|---|---|---|
| Ιστορικό | Δείχνει παράλληλους κλάδους | Γραμμικό, καθαρό |
| Commit συγχώνευσης | Ναι, δημιουργείται αυτόματα | Όχι, fast-forward |
| Πολυπλοκότητα | Απλή | Πιο σύνθετη |
| Συγκρούσεις | Επίλυση 1 φορά | Ίσως πολλές φορές |
| Ιχνηλασιμότητα | Βλέπει πότε δημιουργήθηκε/συγχωνεύθηκε το feature | Σαν να αναπτύχθηκε διαδοχικά |
MERGE:
A---B---C main
/ \
D---E---F---G feature (merge commit G)REBASE:
A---B---C---D'---E'---F' main (commits D,E,F "μετακινημένα")Εντολή:
git checkout main
git merge feature-branchΕντολή:
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # Fast-forwardΠΟΤΕ rebase σε commits ήδη κοινόχρηστα/σταλμένα!
Και τα δύο λειτουργούν. Το σημαντικό = συνέπεια στην ομάδα!