Merge vs Rebase - Οδηγός Απόφασης

3 λεπτά

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

  1. Το δίλημμα
  2. Το merge εξηγημένο
  3. Το rebase εξηγημένο
  4. Συγκριτικός πίνακας
  5. Οδηγός απόφασης

1. Το δίλημμα

Αναπτύσσετε σε έναν κλάδο. Το main έχει προχωρήσει. Πώς ενσωματώνετε;

    A---B---C main
   /
  D---E feature-branch

2 επιλογές:

  • MERGE: Συγχώνευση με commit συγχώνευσης
  • REBASE: «Μετακίνηση» των commits σας μετά το main

Ποιο να επιλέξετε; Εξαρτάται από τον στόχο σας!

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

2. Το merge εξηγημένο

Εντολή:

bash
git checkout main
git merge feature-branch

Οπτικό αποτέλεσμα:

    A---B---C-------M main
   /               /
  D---E-----------/  (M = merge commit)

Τι συμβαίνει:

  1. Το Git δημιουργεί ένα νέο commit (M)
  2. Αυτό το commit συνδυάζει τις αλλαγές των 2 κλάδων
  3. Το ιστορικό δείχνει ότι υπήρξαν 2 γραμμές ανάπτυξης

Πλεονεκτήματα:

  • Αληθινό ιστορικό: Βλέπουμε ότι υπήρξαν 2 παράλληλες αναπτύξεις
  • Απλό: Μία εντολή, μία επίλυση σύγκρουσης
  • Ασφαλές: Δεν αλλοιώνει ποτέ τα υπάρχοντα commits
  • Πρότυπο: Προεπιλεγμένη προσέγγιση στις περισσότερες ομάδες

Μειονεκτήματα:

  • Σύνθετο ιστορικό: Πολλά commits συγχώνευσης
  • Λιγότερο ευανάγνωστο: Δύσκολο να ακολουθήσετε τη γραμμική εξέλιξη

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

3. Το rebase εξηγημένο

Εντολή:

bash
git checkout feature-branch
git rebase main

Οπτικό αποτέλεσμα:

    A---B---C---D'---E' main

Τι συμβαίνει:

  1. Το Git «αποσπά» τα commits D και E
  2. Τα «ξαναπαίζει» μετά το commit C
  3. Δημιουργεί νέα commits D' και E' (ίδιες αλλαγές, νέα hash)
  4. Το ιστορικό γίνεται γραμμικό

Πλεονεκτήματα:

  • Καθαρό ιστορικό: Ευθεία γραμμή, εύκολη ανάγνωση
  • Fast-forward merge: Χωρίς commit συγχώνευσης
  • Σαν ιστορία: Σαν να είχατε αναπτύξει μετά το main

Μειονεκτήματα:

  • Ξαναγράφει το ιστορικό: Τα D και E γίνονται D' και E'
  • Πιο σύνθετο: Πιθανές πολλές επιλύσεις συγκρούσεων
  • Επικίνδυνο: Ποτέ rebase σε κοινόχρηστα commits!

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

4. Συγκριτικός πίνακας

ΚριτήριοMERGEREBASE
ΙστορικόΔιατηρεί παράλληλους κλάδουςΓραμμικοποιεί τα πάντα
CommitsΠροσθέτει commit συγχώνευσηςΞαναγράφει τα commits
ΠολυπλοκότηταΑπλή (1 εντολή)Πιο σύνθετη
Συγκρούσεις1 επίλυση το πολύΠιθανές πολλές επιλύσεις
ΑσφάλειαΠολύ ασφαλέςΕπικίνδυνο αν χρησιμοποιηθεί λάθος
ΙχνηλασιμότηταΒλέπει πότε δημιουργήθηκαν/συγχωνεύθηκαν οι κλάδοιΧάνει τη χρονική πληροφορία
ΣυνεργασίαΙδανικό για ομάδαΠροσοχή στα κοινόχρηστα commits
ΑναγνωσιμότηταΣύνθετη με πολλούς κλάδουςΠολύ καθαρή, γραμμική

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

5. Οδηγός απόφασης

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

Καταστάσεις:

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

Εντολές:

bash
git checkout main
git pull origin main
git merge feature-branch
git push origin main

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

Καταστάσεις:

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

Εντολές:

bash
git checkout feature-branch
git rebase main               # Επίλυση συγκρούσεων αν χρειάζεται
  git checkout main
git merge feature-branch      # Fast-forward merge
  git push origin main
  ```

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

**NEVER REBASE SHARED COMMITS !**

```bash
# ΚΙΝΔΥΝΟΣ - ΠΟΤΕ μην κάνετε αυτό:
git push origin feature-branch    # Κοινόχρηστα commits
git rebase main                   # Ξαναγράφει κοινόχρηστα commits = ΧΑΟΣ ομάδας

# OK - Rebase μόνο τοπικά:
git rebase main                   # Commits ακόμα τοπικά = OK
git push origin feature-branch    # Push μετά το rebase = OK

Σύσταση ανά επίπεδο:

ΕπίπεδοΣυνιστώμενη στρατηγική
ΑρχάριοςΠάντα MERGE
ΜεσαίοςMERGE για συνεργασία, REBASE για τοπικό καθαρισμό
ΕιδικόςΗ ομάδα αποφασίζει μια συνεπή στρατηγική

Δημοφιλείς στρατηγικές ομάδας:

  1. «Merge only»: Απλό, ασφαλές, πλήρες ιστορικό
  2. «Rebase then merge»: Τοπικό rebase + merge στο main
  3. «Squash merge»: 1 commit ανά λειτουργία (στυλ GitHub)

Το σημαντικό = συνέπεια στην ομάδα, όχι τεχνική τελειότητα!

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