Middle
Πώς πραγματοποιείται η συγχώνευση (merge) ή η επαναφορά ιστορίας (rebase) στο σύστημα ελέγχου εκδόσεων στην εταιρεία σας;
sobes.tech AI
Απάντηση από AI
Στην ομάδα μας ακολουθούμε μια ροή εργασίας βασισμένη στο Git. Για την ενσωμάτωση αλλαγών, χρησιμοποιούμε δύο βασικές προσεγγίσεις: merge και rebase, επιλέγοντας ανάλογα με την κατάσταση και τον τύπο του κλάδου.
Merge:
- Εφαρμόζεται γενικά για τη συγχώνευση μακροχρόνιων κλάδων, π.χ. dev σε main, ή για την ενσωμάτωση λειτουργικών κλάδων στο dev.
- Δημιουργεί ένα commit συγχώνευσης που δείχνει σαφώς πότε πραγματοποιήθηκε η ενσωμάτωση αλλαγών από άλλους κλάδους.
- Διατηρεί ολόκληρο το ιστορικό των commits, συμπεριλαμβανομένων όλων των διακλαδώσεων.
git checkout dev // Μεταβαίνουμε στον στόχο κλάδο
git merge feature/νέα-λειτουργία // Συγχωνεύουμε τον λειτουργικό κλάδο
Rebase:
- Χρησιμοποιείται για τη διατήρηση ενός καθαρού και γραμμικού ιστορικού commits στους λειτουργικούς κλάδους μέχρι την ενσωμάτωσή τους (συνήθως στο dev).
- Μεταφέρει τα commits του τρέχοντος κλάδου στην κορυφή του στόχου (dev), επανεγγράφοντας ουσιαστικά την ιστορία.
- Απλοποιεί την ιστορία, αποφεύγοντας commits συγχώνευσης για κάθε μικρή λειτουργία ή διόρθωση.
- Σημαντικό: Ποτέ μην κάνετε rebase σε δημόσιους κλάδους στους οποίους εργάζονται άλλοι προγραμματιστές, καθώς αυτό μπορεί να δημιουργήσει συγκρούσεις κατά το pull των αλλαγών.
git checkout feature/νέα-λειτουργία // Μεταβαίνουμε στον λειτουργικό κλάδο
git rebase dev // Μεταφέρουμε τα commits του λειτουργικού κλάδου στην κορυφή του dev
// Εάν χρειάζεται, επιλύουμε συγκρούσεις
git push --force-with-lease // Χρησιμοποιούμε --force-with-lease για ασφαλή push μετά το rebase
Το πρότυπο workflow μας:
- Μια νέα λειτουργία ή διόρθωση αναπτύσσεται σε ξεχωριστό κλάδο (feature/..., fix/...).
- Περιοδικά (πριν από το pull request ή για συγχρονισμό με το dev) ο λειτουργικός κλάδος rebase-άρεται στην τρέχουσα έκδοση του dev. Αυτό βοηθά στην επίλυση συγκρούσεων σε πρώιμο στάδιο.
- Μετά την ολοκλήρωση της ανάπτυξης και της αναθεώρησης κώδικα, ο λειτουργικός κλάδος συγχωνεύεται στο
devμεno-ff(non-fast-forward), ώστε να διατηρηθεί η πληροφορία της συγχώνευσης. Ή, σπανιότερα, γίνεται squash σε ένα μόνο commit πριν από τη συγχώνευση στοdevγια πολύ μικρές λειτουργίες ή διορθώσεις. - Από το
dev, πραγματοποιούνται περιοδικές κυκλοφορίες στοmain(κλάδος παραγωγής), πάντα με merge.
Έτσι, ισορροπούμε την διατήρηση της ιστορίας των commits (merge) με τη διατήρηση ενός καθαρού αναπτυξιακού κλάδου (rebase των λειτουργικών κλάδων).