Εισαγωγή στη συγχώνευση Git και Git Rebase: Τι κάνουν και πότε να τις χρησιμοποιήσετε

Ως προγραμματιστής, πολλοί από εμάς πρέπει να επιλέξουν μεταξύ του Merge και του Rebase. Με όλες τις αναφορές που λαμβάνουμε από το διαδίκτυο, όλοι πιστεύουν ότι "Μη χρησιμοποιείτε το Rebase, θα μπορούσε να προκαλέσει σοβαρά προβλήματα". Εδώ θα σας εξηγήσω τι είναι η συγχώνευση και η rebase, γιατί θα έπρεπε (και δεν θα έπρεπε) να τις χρησιμοποιήσετε και πώς να το πράξουν.

Το Git Merge και το Git Rebase εξυπηρετούν τον ίδιο σκοπό. Έχουν σχεδιαστεί για να ενσωματώνουν αλλαγές από πολλαπλούς κλάδους σε ένα. Παρόλο που ο τελικός στόχος είναι ο ίδιος, οι δύο μέθοδοι το επιτυγχάνουν με διαφορετικούς τρόπους και είναι χρήσιμο να γνωρίζετε τη διαφορά καθώς γίνετε καλύτερος προγραμματιστής λογισμικού.

Αυτή η ερώτηση έχει χωρίσει την κοινότητα Git. Ορισμένοι πιστεύουν ότι θα πρέπει πάντα να κάνετε rebase και άλλους που θα πρέπει πάντα να συγχωνεύσετε. Κάθε πλευρά έχει κάποια πειστικά οφέλη.

Git Merge

Η συγχώνευση είναι μια κοινή πρακτική για τους προγραμματιστές που χρησιμοποιούν συστήματα ελέγχου έκδοσης. Εάν δημιουργούνται υποκαταστήματα για δοκιμές, διορθώσεις σφαλμάτων ή για άλλους λόγους, η συγχώνευση δεσμεύει τις αλλαγές σε άλλη τοποθεσία. Για να είμαστε πιο συγκεκριμένοι, η συγχώνευση παίρνει το περιεχόμενο ενός υποκαταστήματος πηγής και τις ενοποιεί με ένα κλάδο στόχο. Σε αυτήν τη διαδικασία, αλλάζει μόνο ο κλάδος στόχος. Το ιστορικό κλάδου πηγής παραμένει το ίδιο.

Συγχώνευση κύριου -> κλάδου χαρακτηριστικών

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

  • Απλό και οικείο
  • Διατηρεί το πλήρες ιστορικό και τη χρονολογική σειρά
  • Διατηρεί το πλαίσιο του κλάδου

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

  • Το ιστορικό δεσμεύσεων μπορεί να μολυνθεί από πολλές δεσμεύσεις συγχώνευσης
  • Η σάρωση με το git bisect μπορεί να γίνει πιο δύσκολη

Πως να το κάνεις

Συγχώνευση του κύριου κλάδου στο κλάδο χαρακτηριστικών χρησιμοποιώντας τις εντολές πληρωμής και συγχώνευσης.

$ git χαρακτηριστικό checkout
$ git master merge
(ή)
$ git κύρια δυνατότητα συγχώνευσης

Αυτό θα δημιουργήσει μια νέα "δέσμευση συγχώνευσης" στον κλάδο χαρακτηριστικών που περιέχει το ιστορικό και των δύο υποκαταστημάτων.

Git Rebase

Το Rebase είναι ένας άλλος τρόπος για να ενσωματώσετε τις αλλαγές από τον ένα κλάδο στον άλλο. Το Rebase συμπιέζει όλες τις αλλαγές σε ένα ενιαίο "έμπλαστρο". Στη συνέχεια ενσωματώνει το έμπλαστρο στον κλάδο στόχο.

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

Οι επαναβαθμίσεις είναι οι αλλαγές που πρέπει να περάσουν από την κορυφή της ιεραρχίας προς τα κάτω και οι συγχωνεύσεις είναι οι ροές προς τα πάνω
Το Rebase διαθέτει υποκατάστημα στο master

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

  • Βελτιώνει ένα δυνητικά πολύπλοκο ιστορικό
  • Η χειραγώγηση μιας απλής δέσμευσης είναι εύκολη (π.χ. επαναφορά της)
  • Αποφεύγει τη συγχώνευση "θορύβου" σε απασχολημένους repos με απασχολημένους κλάδους
  • Καθαρίζει τις ενδιάμεσες δεσμεύσεις, κάνοντάς τους μία δέσμευση, η οποία μπορεί να είναι χρήσιμη για τις ομάδες DevOps

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

  • Η καταστροφή του χαρακτηριστικού σε μια χούφτα δεσμεύσεων μπορεί να κρύψει το πλαίσιο
  • Η αποκατάσταση δημόσιων χώρων αποθήκευσης μπορεί να είναι επικίνδυνη όταν εργάζεστε ως ομάδα
  • Είναι περισσότερη δουλειά: Χρησιμοποιώντας το rebase για να διατηρείτε πάντα ενημερωμένο το κλαδί σας
  • Η επανατοποθέτηση με απομακρυσμένα υποκαταστήματα απαιτεί να πιέσετε. Το μεγαλύτερο πρόβλημα που αντιμετωπίζουν οι άνθρωποι είναι ότι πιέζουν, αλλά δεν έχουν ρυθμίσει το default default. Αυτό έχει ως αποτέλεσμα την ενημέρωση όλων των καταστημάτων που έχουν το ίδιο όνομα, τόσο τοπικά όσο και εξ αποστάσεως, και αυτό είναι τρομακτικό να αντιμετωπιστεί.
Εάν αναδιοργανώσετε εσφαλμένα και ακούσια ξαναγράψετε το ιστορικό, μπορεί να οδηγήσει σε σοβαρά ζητήματα, οπότε βεβαιωθείτε ότι γνωρίζετε τι κάνετε!

Πως να το κάνεις

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

$ git χαρακτηριστικό checkout
$ git master rebase

Αυτό μετακινεί ολόκληρο τον κλάδο χαρακτηριστικών πάνω από τον κύριο κλάδο. Αυτό γίνεται επαναγράφοντας το ιστορικό του έργου δημιουργώντας ολοκαίνουργιες δεσμεύσεις για κάθε δέσμευση στον αρχικό κλάδο (χαρακτηριστικό).

Διαδραστική επανατοποθέτηση

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

$ git χαρακτηριστικό checkout
$ git rebase -i master

Αυτό θα ανοίξει τον επεξεργαστή με την καταγραφή όλων των δεσμεύσεων που πρόκειται να μετακινηθούν.

επιλέξτε 22d6d7c Μήνυμα υπενθύμισης # 1
pick 44e8a9b Μήνυμα δέσμευσης # 2
επιλέξτε το μήνυμα 79f1d2h Commit # 3

Αυτό ορίζει ακριβώς τι θα φαίνεται το υποκατάστημα μετά την εκτέλεση του rebase. Με εκ νέου παραγγελία των οντοτήτων, μπορείτε να κάνετε την ιστορία να μοιάζει με ό, τι θέλετε. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε εντολές όπως fixup, squash, επεξεργασία κ.λπ., στη θέση επιλογής.

Ποιο από αυτά θα χρησιμοποιηθεί

Τι είναι καλύτερο; Τι συστήνουν οι ειδικοί;

Είναι δύσκολο να γενικεύσετε και να αποφασίσετε για το ένα ή το άλλο, δεδομένου ότι κάθε ομάδα είναι διαφορετική. Αλλά πρέπει να ξεκινήσουμε κάπου.

Οι ομάδες πρέπει να εξετάσουν διάφορες ερωτήσεις κατά τη ρύθμιση των πολιτικών τους Git rebase vs. merge. Επειδή όπως αποδεικνύεται, μια στρατηγική ροής εργασίας δεν είναι καλύτερη από την άλλη. Εξαρτάται από την ομάδα σας.

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

Τέλος, οι αποφάσεις σχετικά με τη συγχώνευση και την επαναδιαπραγμάτευση πρέπει να ληφθούν υπόψη στο πλαίσιο μιας σαφούς στρατηγικής διακλάδωσης (Ανατρέξτε σε αυτό το άρθρο για να κατανοήσετε περισσότερα σχετικά με τη στρατηγική διακλάδωσης). Μια επιτυχημένη στρατηγική διακλάδωσης σχεδιάζεται γύρω από την οργάνωση των ομάδων σας.

Τι συστήνω;

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

Λαμβάνοντας υπόψη τις παρακάτω περιστάσεις και κατευθυντήριες γραμμές, μπορείτε να αξιοποιήσετε καλύτερα το Rebase:

  • Αναπτύσσετε τοπικά: Εάν δεν έχετε μοιραστεί την εργασία σας με κανέναν άλλο. Σε αυτό το σημείο, θα πρέπει να προτιμάτε να κάνετε rebasing για να συγχωνευθείτε για να διατηρήσετε την ιστορία σας τακτοποιημένη. Αν έχετε το προσωπικό σας πιρούνι του χώρου αποθήκευσης και αυτό δεν μοιράζεται με άλλους προγραμματιστές, μπορείτε να κάνετε επανεκκίνηση ακόμα και μετά την ώθηση στο υποκατάστημά σας.
  • Ο κωδικός σας είναι έτοιμος για αναθεώρηση: Δημιουργήσατε ένα αίτημα έλξης. Άλλοι επανεξετάζουν την εργασία σας και ενδεχομένως τη μεταφέρουν στο πιρούνι τους για τοπική αναθεώρηση. Σε αυτό το σημείο, δεν πρέπει να αναδιοργανώσετε την εργασία σας. Θα πρέπει να δημιουργήσετε δεσμεύσεις "επαναχρησιμοποίησης" και να ενημερώσετε το υποκατάστημα χαρακτηριστικών σας. Αυτό βοηθά με την ανιχνευσιμότητα στο αίτημα έλξης και αποτρέπει την τυχαία θραύση του ιστορικού.
  • Η ανασκόπηση γίνεται και είναι έτοιμη να ενσωματωθεί στον κλάδο στόχο. Συγχαρητήρια! Πρόκειται να διαγράψετε τον κλάδο λειτουργιών σας. Δεδομένου ότι οι άλλοι προγραμματιστές δεν θα προσέλθουν-συγχωνεύοντας σε αυτές τις αλλαγές από αυτό το σημείο, αυτή είναι η ευκαιρία σας να απολυμαίνετε την ιστορία σας. Σε αυτό το σημείο, μπορείτε να ξαναγράψετε την ιστορία και να διπλώσετε τις αρχικές δεσμεύσεις και αυτά τα ενοχλητικά "re rework" και "συγχώνευση" δεσμεύονται σε ένα μικρό σύνολο εστιασμένων δεσμεύσεων. Η δημιουργία μιας ρητής συγχώνευσης για αυτές τις δεσμεύσεις είναι προαιρετική, αλλά έχει αξία. Καταγράφει όταν το χαρακτηριστικό βαθμολογήθηκε για να κυριαρχήσει.

συμπέρασμα

Ελπίζω ότι αυτή η εξήγηση έχει δώσει κάποια στοιχεία σχετικά με τη συγχώνευση Git και την Git rebase. Η στρατηγική Merge vs. rebase είναι πάντοτε αμφισβητήσιμη. Αλλά ίσως αυτό το άρθρο θα βοηθήσει να διαλύσει τις αμφιβολίες σας και να σας επιτρέψει να υιοθετήσετε μια προσέγγιση που λειτουργεί για την ομάδα σας.

Περιμένω με ανυπομονησία να γράψω στις ροές εργασίας Git και τις έννοιες του Git. Σχολιάστε τα θέματα που θέλετε να γράψω για το επόμενο. Στην υγειά σας!

κωδικός = καφές + προγραμματιστής

Ακολουθεί μια άλλη χρήσιμη αναφορά

  • Πώς να υιοθετήσετε μια στρατηγική διακλάδωσης Git

σχολή κωδικοποίησης για προγραμματιστές λογισμικού