Ο απόλυτος οδηγός για το Git Merge και το Git Rebase

Καλώς ορίσατε στον απόλυτο οδηγό μας για τις εντολές git mergeκαι git rebase. Αυτό το σεμινάριο θα σας διδάξει όλα όσα πρέπει να γνωρίζετε για το συνδυασμό πολλαπλών κλάδων με το Git.

Git Merge

Η git mergeεντολή θα συγχωνεύσει τυχόν αλλαγές που έγιναν στη βάση κώδικα σε ξεχωριστό κλάδο στον τρέχοντα κλάδο σας ως νέα δέσμευση.

Η σύνταξη εντολών έχει ως εξής:

git merge BRANCH-NAME

Για παράδειγμα, εάν εργάζεστε αυτήν τη στιγμή σε ένα υποκατάστημα με όνομα devκαι θέλετε να συγχωνεύσετε τυχόν νέες αλλαγές που έγιναν σε ένα υποκατάστημα με όνομα new-features, θα εκδώσετε την ακόλουθη εντολή:

git merge new-features

Σημείωση: Εάν υπάρχουν ασυμβίβαστες αλλαγές στον τρέχοντα κλάδο σας, η Git δεν θα σας επιτρέψει να συγχωνευθείτε έως ότου πραγματοποιηθούν όλες οι αλλαγές στον τρέχοντα κλάδο σας. Για να χειριστείτε αυτές τις αλλαγές, μπορείτε είτε:

Δημιουργήστε έναν νέο κλάδο και δεσμεύστε τις αλλαγές

git checkout -b new-branch-name git add . git commit -m ""

Κρύψε τους

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Εγκαταλείψτε όλες τις αλλαγές

git reset --hard # removes all pending changes

Git Rebase

Η επαναφορά ενός κλάδου στο Git είναι ένας τρόπος για να μετακινήσετε ολόκληρο ένα κλαδί σε άλλο σημείο του δέντρου. Το απλούστερο παράδειγμα είναι να μετακινήσετε ένα κλαδί πιο πάνω στο δέντρο. Ας πούμε ότι έχουμε έναν κλάδο που αποκλίνει από τον κύριο κλάδο στο σημείο Α:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Όταν κάνετε επαναφορά μπορείτε να το μετακινήσετε ως εξής:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

Για επαναφορά, βεβαιωθείτε ότι έχετε όλες τις δεσμεύσεις που θέλετε στην αναδιατύπωση στον κύριο κλάδο σας. Ρίξτε μια ματιά στον κλάδο στον οποίο θέλετε να αναβαθμίσετε και πληκτρολογήστε git rebase master(όπου ο κύριος είναι ο κλάδος στον οποίο θέλετε να αναβαθμίσετε)

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

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

Μετά git rebase master branchή git rebase masterόταν έχετε ελέγξει το υποκατάστημα, θα λάβετε:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git rebase διαδραστικό στην κονσόλα

Για να χρησιμοποιήσετε git rebaseστην κονσόλα με μια λίστα δεσμεύσεων μπορείτε να επιλέξετε, να επεξεργαστείτε ή να αποθέσετε το rebase:

  • Εισαγάγετε git rebase -i HEAD~5με τον τελευταίο αριθμό να είναι οποιοσδήποτε αριθμός δεσμεύσεων από την πιο πρόσφατη προς τα πίσω που θέλετε να ελέγξετε.
  • Στο vim, πατήστε escκαι μετά iγια να ξεκινήσετε την επεξεργασία του τεστ.
  • Στην αριστερή πλευρά μπορείτε να αντικαταστήσετε pickμε μία από τις παρακάτω εντολές. Εάν θέλετε να συμπιέσετε μια δέσμευση σε προηγούμενη και να απορρίψετε το μήνυμα δέσμευσης, εισαγάγετε fστη θέση της pickδέσμευσης.
  • Αποθηκεύστε και κλείστε το πρόγραμμα επεξεργασίας κειμένου.
  • Όταν σταματήσει το rebase, κάντε τις απαραίτητες ρυθμίσεις και, στη συνέχεια, χρησιμοποιήστε git rebase --continueέως ότου το rebase είναι επιτυχές.
  • Εάν επανεμφανιστεί επιτυχώς, τότε πρέπει να πιέσετε τις αλλαγές σας για git push -fνα προσθέσετε την αναβαθμισμένη έκδοση στο απομακρυσμένο αποθετήριο σας.
  • Εάν υπάρχει διένεξη συγχώνευσης, υπάρχουν διάφοροι τρόποι για να το επιλύσετε, όπως ακολουθώντας τις προτάσεις σε αυτόν τον οδηγό. Ένας τρόπος είναι να ανοίξετε τα αρχεία σε ένα πρόγραμμα επεξεργασίας κειμένου και να διαγράψετε τα μέρη του κώδικα που δεν θέλετε. Στη συνέχεια χρησιμοποιήστε git add ακολουθούμενο από git rebase --continue. Μπορείτε να παραλείψετε τη διένεξη δέσμευσης εισάγοντας git rebase --skip, να σταματήσετε την επαναφορά εκτελώντας την git rebase --abortκονσόλα σας.
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Συγχώνευση συγκρούσεων

Μια διένεξη συγχώνευσης είναι όταν κάνετε δεσμεύσεις σε ξεχωριστούς κλάδους που αλλάζουν την ίδια γραμμή με αντιφατικούς τρόπους. Εάν συμβεί αυτό, το Git δεν θα γνωρίζει ποια έκδοση του αρχείου θα διατηρήσει σε ένα μήνυμα σφάλματος παρόμοιο με το ακόλουθο:

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Εάν κοιτάξετε το resumé.txtαρχείο στο πρόγραμμα επεξεργασίας κώδικα, μπορείτε να δείτε πού συνέβη η διένεξη:

<<<<<<>>>>>> updated_address

Ο Git πρόσθεσε μερικές επιπλέον γραμμές στο αρχείο:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Σκεφτείτε   =======ως τη διαχωριστική γραμμή της σύγκρουσης. Τα πάντα μεταξύ <<<<<<< HEADκαι =======είναι το περιεχόμενο του τρέχοντος κλάδου στον οποίο αναφέρεται το HEAD ref. Από την άλλη πλευρά, τα πάντα μεταξύ   =======και >>>>>>> updated_addressείναι το περιεχόμενο στον κλάδο ον συγχωνεύονται, updated_address.

Git Merge εναντίον Git Rebase

Και οι δύο git mergeκαι git rebaseείναι πολύ χρήσιμες εντολές και το ένα δεν είναι καλύτερο από το άλλο. Ωστόσο, υπάρχουν μερικές πολύ σημαντικές διαφορές μεταξύ των δύο εντολών που εσείς και η ομάδα σας πρέπει να λάβετε υπόψη.

Όποτε git mergeεκτελείται, δημιουργείται μια επιπλέον δέσμευση συγχώνευσης. Κάθε φορά που εργάζεστε στο τοπικό αποθετήριο, η ύπαρξη πάρα πολλών συγχωνεύσεων μπορεί να κάνει το ιστορικό δεσμεύσεων να φαίνεται συγκεχυμένο. Ένας τρόπος για να αποφευχθεί η συγχώνευση δεσμεύονται να χρησιμοποιούν git rebaseαντ 'αυτού.

git rebaseείναι ένα πολύ ισχυρό χαρακτηριστικό. Τούτου λεχθέντος, είναι επίσης επικίνδυνο εάν δεν χρησιμοποιείται με τον σωστό τρόπο. git rebaseαλλάζει το ιστορικό δεσμεύσεων, γι 'αυτό χρησιμοποιήστε το με προσοχή. Εάν η επαναφορά γίνεται στο απομακρυσμένο αποθετήριο, τότε μπορεί να δημιουργήσει πολλά προβλήματα όταν άλλοι προγραμματιστές προσπαθούν να τραβήξουν τις πιο πρόσφατες αλλαγές κώδικα από το απομακρυσμένο αποθετήριο. Θυμηθείτε να εκτελείτε μόνο git rebaseσε ένα τοπικό αποθετήριο.

Αυτό είναι ό, τι πρέπει να ξέρετε για να συγχωνευτείτε και να επανασυνδέσετε με τα καλύτερα.