Merge vs Rebase - Μελέτη Περίπτωσης

2 λεπτά

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

  1. Το πρόβλημα
  2. Λύση 1: Merge
  3. Λύση 2: Rebase
  4. Πρακτική σύγκριση
  5. Ποια προσέγγιση να επιλέξετε;

1. Το πρόβλημα

Τυπική κατάσταση:

  • Αναπτύσσετε στον feature-branch
  • Στο μεταξύ, το main προχωρά (οι συνάδελφοι κάνουν push)
  • Θέλετε να ενσωματώσετε τη δουλειά σας στο main

2 δυνατές στρατηγικές:

  1. MERGE: Συγχώνευση των κλάδων
  2. REBASE: Επανεγγραφή του ιστορικού

Επιστροφή στον πίνακα περιεχομένων

2. Λύση 1: Merge

Ρύθμιση του σεναρίου:

bash
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"

Merge:

bash
git merge feature-login

Αποτέλεσμα merge:

*   Merge branch 'feature-login'
|\  
| * Improve login
| * Add login  
* | Update main app
|/  
* Version initiale

Ιστορικό: Δείχνει καθαρά ότι υπήρξαν 2 παράλληλες γραμμές ανάπτυξης.

Επιστροφή στον πίνακα περιεχομένων

3. Λύση 2: Rebase

Ίδια ρύθμιση, διαφορετική στρατηγική:

bash
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"

Rebase:

bash
git checkout feature-login
git rebase main              # "Μετακινεί" τα commits σας μετά το main
git checkout main  
git merge feature-login      # Fast-forward merge

Αποτέλεσμα rebase:

* Improve login
* Add login  
* Update main app
* Version initiale

Ιστορικό: Γραμμικό, σαν να είχατε αναπτύξει μετά τις ενημερώσεις του main.

Επιστροφή στον πίνακα περιεχομένων

4. Πρακτική σύγκριση

ΠτυχήMERGEREBASE
ΙστορικόΔείχνει παράλληλους κλάδουςΓραμμικό, καθαρό
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 "μετακινημένα")

Επιστροφή στον πίνακα περιεχομένων

5. Ποια προσέγγιση να επιλέξετε;

Χρησιμοποιήστε MERGE όταν:

  • Ξεκινάτε με το Git
  • Θέλετε να κρατήσετε το «αληθινό» ιστορικό
  • Η ομάδα εργάζεται σε μακροχρόνιους κλάδους
  • Η ασφάλεια πάνω απ' όλα

Εντολή:

bash
git checkout main
git merge feature-branch

Χρησιμοποιήστε REBASE όταν:

  • Θέλετε καθαρό και γραμμικό ιστορικό
  • Ο κλάδος feature είναι σύντομος και προσωπικός
  • Η ομάδα προτιμά ιστορικό «σαν ιστορία»
  • Κατέχετε καλά το Git

Εντολή:

bash
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch    # Fast-forward

ΧΡΥΣΟΣ ΚΑΝΟΝΑΣ:

ΠΟΤΕ rebase σε commits ήδη κοινόχρηστα/σταλμένα!

Απλή σύσταση:

  • Αρχάριος → Πάντα MERGE
  • Έμπειρος → REBASE σε προσωπικούς κλάδους, MERGE για κοινοποίηση

Και τα δύο λειτουργούν. Το σημαντικό = συνέπεια στην ομάδα!

Επιστροφή στον πίνακα περιεχομένων