Cherry-pick — είναι μια εντολή Git που εφαρμόζει αλλαγές από ένα ή περισσότερα υπάρχοντα commits στο τρέχον branch. Σε αντίθεση με το Merge (μεταφέρει ολόκληρο το branch) και το Rebase (μεταφέρει μια ακολουθία commits), το cherry-pick επιλέγει μόνο τα καθορισμένα commits. Σύμφωνα με το git-scm.com, 2025, το cherry-pick είναι περισσότερο ζητούμενο σε σενάρια μεταφοράς διορθώσεων μεταξύ branches έκδοσης.
Κύρια σημεία
Cherry-pick — είναι μια εντολή Git που αντιγράφει αλλαγές από ένα καθορισμένο commit και τις εφαρμόζει ως νέο commit στο τρέχον branch. Το όνομα προέρχεται από τη μεταφορά «διαλέγω κεράσια»: ο προγραμματιστής επιλέγει μόνο τα commits που χρειάζεται, αγνοώντας τα υπόλοιπα.
Σε αντίθεση με το Merge, το cherry-pick δεν δημιουργεί merge commit και δεν απαιτεί πλήρη συγχώνευση branches. Σε αντίθεση με το Rebase, το cherry-pick δεν μεταφέρει ακολουθία commits — μόνο τα καθορισμένα. Αυτό καθιστά το cherry-pick ιδανικό εργαλείο για στοχευμένη μεταφορά διορθώσεων.
Σύμφωνα με δεδομένα της Atlassian, 2025, το cherry-pick χρησιμοποιείται στο 47% των ομάδων που εργάζονται ταυτόχρονα με πολλά branches έκδοσης. Το cherry-pick είναι ιδιαίτερα ζητούμενο στην ανάπτυξη εφαρμογών για κινητά, όπου υποστηρίζονται ταυτόχρονα πολλές εκδόσεις της εφαρμογής (εκδόσεις LTS) και απαιτείται μεταφορά διορθώσεων μεταξύ τους.
Κατά την εκτέλεση του cherry-pick, το Git υπολογίζει το diff μεταξύ του καθορισμένου commit και του γονέα του, στη συνέχεια εφαρμόζει αυτό το diff στο τρέχον branch. Εάν οι αλλαγές εφαρμόστηκαν χωρίς διένεξη — το Git δημιουργεί νέο commit με το ίδιο μήνυμα αλλά νέο SHA. Εάν υπάρχει διένεξη — το cherry-pick τίθεται σε παύση για μη αυτόματη επίλυση.
Σύνταξη του cherry-pick είναι απλή: καθορίστε το hash του commit που θέλετε να μεταφέρετε. Το Git θα αντιγράψει τις αλλαγές στο τρέχον branch ως νέο commit. Υποστηρίζεται η μεταφορά πολλών commits ταυτόχρονα και ολόκληρων περιοχών.
# Μεταφορά ενός commit στο τρέχον branch
git cherry-pick a1b2c3d4
# Μεταφορά πολλών commits
git cherry-pick a1b2c3d4 e5f6g7h8
# Μεταφορά περιοχής commits (από a1b2 έως f9e8, χωρίς το a1b2)
git cherry-pick a1b2c3d4..f9e8d7c6
Μετά την εκτέλεση του cherry-pick, το τρέχον branch λαμβάνει ένα νέο commit με αλλαγές από το αρχικό. Το μήνυμα commit αντιγράφεται προεπιλεγμένα από το αρχικό, αλλά μπορεί να τροποποιηθεί με τη σημαία -n (να μην δημιουργηθεί commit) ή --edit (επεξεργασία μηνύματος).
Ας εξετάσουμε ένα τυπικό σενάριο: στο develop βρέθηκε και διορθώθηκε ένα κρίσιμο σφάλμα, το οποίο υπάρχει επίσης στο branch έκδοσης release/v2.0. Πρέπει να μεταφερθεί μόνο αυτή η διόρθωση, χωρίς συγχώνευση ολόκληρου του develop στο branch έκδοσης.
# Βρείτε το hash του commit με τη διόρθωση στο develop
git log --oneline develop
# a1b2c3d fix: null check in payment processing
# Μεταβείτε στο branch έκδοσης
git checkout release/v2.0
# Εφαρμόστε τη διόρθωση
git cherry-pick a1b2c3d4
# Εάν υπάρχει διένεξη — επιλύστε και συνεχίστε
git add src/payment/PaymentProcessor.kt
git cherry-pick --continue
Η σημαία -x προσθέτει στο μήνυμα commit μια αναφορά στο αρχικό SHA: «(cherry picked from commit a1b2c3d4)». Αυτό διευκολύνει την παρακολούθηση από πού μεταφέρθηκε το commit. Συνιστάται η χρήση του -x σε όλα τα σενάρια, εκτός από προσωρινά προσχέδια.
Σε περίπτωση διένεξης, το cherry-pick συμπεριφέρεται όπως το merge: το Git σταματά και επισημαίνει τα αρχεία με διένεξη. Ο προγραμματιστής επιλύει τη διένεξη, εκτελεί git add και στη συνέχεια git cherry-pick --continue. Για ακύρωση — git cherry-pick --abort. Η σημαία --strategy επιτρέπει τον καθορισμό στρατηγικής συγχώνευσης (π.χ. recursive με επιλογές).
# Επίλυση διένεξης στο cherry-pick
# Το Git εμφανίζει αρχεία με διένεξη
git status
# Επιλύστε χειροκίνητα, στη συνέχεια:
git add επιτρεπόμενο_αρχείο.kt
git cherry-pick --continue
# Ή ακυρώστε το cherry-pick:
git cherry-pick --abort
Cherry-pick είναι βέλτιστο σε σενάρια όπου απαιτείται στοχευμένη μεταφορά αλλαγών χωρίς συγχώνευση ολόκληρων branches. Ας εξετάσουμε πέντε κύριες περιπτώσεις όπου το cherry-pick γίνεται η καλύτερη επιλογή.
Για την ανάπτυξη εφαρμογών για κινητά, το cherry-pick είναι κρίσιμο κατά την υποστήριξη πολλών εκδόσεων της εφαρμογής. Για παράδειγμα, εάν ένα σφάλμα βρεθεί στην έκδοση 3.2 που έχει ήδη κυκλοφορήσει στο Google Play, ενώ το develop περιέχει κώδικα για την έκδοση 4.0 — το cherry-pick επιτρέπει τη μεταφορά της διόρθωσης στο branch v3.x χωρίς συγχώνευση όλων των breaking changes. Αυτό είναι ιδιαίτερα σημαντικό για έργα όπου υποστηρίζονται ταυτόχρονα δύο ή περισσότερες κύριες εκδόσεις με διαφορετικά API και εξαρτήσεις.
Παράδειγμα από την πράξη: σε μια εφαρμογή για κινητά ανακαλύφθηκε crash κατά την εξουσιοδότηση μέσω Google Sign-In σε Android 12. Η διόρθωση εισήχθη στο develop και πέρασε από έλεγχο. Ωστόσο, το τρέχον branch έκδοσης v2.5 βρίσκεται ήδη σε φάση beta testing. Το Cherry-pick του commit διόρθωσης από το develop στο release/v2.5 επιτρέπει την ενσωμάτωση της διόρθωσης στην επόμενη έκδοση, χωρίς μεταφορά των υπόλοιπων αλλαγών που δεν είναι ακόμη έτοιμες για κυκλοφορία.
Κατά τη χρήση του cherry-pick σε έργα για κινητά είναι σημαντικό να λαμβάνονται υπόψη οι εξαρτήσεις: εάν η διόρθωση επηρεάζει αρχεία που τροποποιήθηκαν στο develop μετά το σημείο διακλάδωσης του branch έκδοσης, το cherry-pick μπορεί να φέρει ελλιπές σύνολο αλλαγών. Σε τέτοιες περιπτώσεις, πρέπει να ελέγχεται ότι όλες οι σχετικές αλλαγές έχουν επίσης μεταφερθεί, διαφορετικά η εφαρμογή μπορεί να μην μεταγλωττιστεί ή να λειτουργεί εσφαλμένα. Πάντα ελέγχετε το build μετά το cherry-pick πριν από την αποστολή αλλαγών στο κοινό branch.
Τρία κύρια εργαλεία ενσωμάτωσης αλλαγών στο Git — merge, rebase και cherry-pick — επιλύουν διαφορετικές εργασίες. Η επιλογή εξαρτάται από το πόσες αλλαγές πρέπει να μεταφερθούν και πώς πρέπει να μοιάζει το ιστορικό.
| Κριτήριο | Merge | Rebase | Cherry-pick |
|---|---|---|---|
| Όγκος | Ολόκληρο branch | Σειρά commits | Επιλεγμένα commits |
| Ιστορικό | Διατηρεί διακλάδωση | Γραμμικό | Γραμμικό |
| Merge commit | Ναι (εκτός ff) | Όχι | Όχι |
| Αυτοματοποίηση | Πλήρης | Σε αλυσίδα | Μόνο καθορισμένα |
| Για δημόσια branches | Ασφαλές | Επικίνδυνο | Ασφαλές |
Merge — όταν πρέπει να συγχωνευθούν δύο branches πλήρως και να διατηρηθεί η πληροφορία διακλάδωσης. Rebase — όταν πρέπει να ενημερωθεί ένα προσωπικό branch στην τρέχουσα κατάσταση με καθαρό ιστορικό. Cherry-pick — όταν χρειάζεται μόνο ένα commit ή μερικά επιλεγμένα commits.
Στην πράξη, αυτά τα εργαλεία συνδυάζονται: η λειτουργία αναπτύσσεται με περιοδικό rebase στο develop, στη συνέχεια συγχωνεύεται μέσω --no-ff merge, και όταν χρειάζεται μεταφορά διόρθωσης σε άλλο branch χρησιμοποιείται cherry-pick. Κάθε εργαλείο επιλύει τη δική του εργασία στο στάδιό του.
Cherry-pick — χρήσιμο αλλά δυνητικά επικίνδυνο εργαλείο σε περίπτωση εσφαλμένης ή υπερβολικής χρήσης. Οι κύριοι κίνδυνοι σχετίζονται με διπλασιασμό commits, απώλεια πλαισίου και διενέξεις σε μετέπειτα συγχωνεύσεις.
Συστάσεις για ελαχιστοποίηση κινδύνων: χρησιμοποιείτε πάντα τη σημαία -x για να υποδείξετε το αρχικό SHA, τεκμηριώστε τον λόγο του cherry-pick στο μήνυμα commit και, όταν είναι δυνατόν, χρησιμοποιήστε merge αντί για cherry-pick όταν το επιτρέπει το πλαίσιο. Εάν υπάρχουν πολλά cherry-pick — εξετάστε την αναδιάρθρωση των branches.
Τα CI pipelines πρέπει να λαμβάνουν υπόψη το cherry-pick ως ξεχωριστό σενάριο. Συνιστάται η ρύθμιση αυτόματου ελέγχου: κατά τη δημιουργία ενός cherry-pick commit, το CI ελέγχει ότι τα τροποποιημένα αρχεία αντιστοιχούν στο αναμενόμενο σύνολο και εκτελεί δοκιμές για τις επηρεαζόμενες μονάδες. Αυτό μειώνει τον κίνδυνο παλινδρόμησης κατά τη στοχευμένη μεταφορά αλλαγών μεταξύ branches.
Συχνές Ερωτήσεις
Cherry-pick μεταφέρει αλλαγές από ένα commit σε άλλο branch. Revert δημιουργεί νέο commit που αναιρεί τις αλλαγές του καθορισμένου commit στο ίδιο branch. Το Revert δεν διαγράφει το ιστορικό — προσθέτει μια αντίστροφη αλλαγή.
Ναι: git cherry-pick A B C — μεταφορά των commits A, B και C με τη σειρά. Ή git cherry-pick A..C — μεταφορά όλων των commits από A έως C (χωρίς το A). Η σειρά μεταφοράς αντιστοιχεί στη σειρά της εντολής.
Από προεπιλογή, το cherry-pick δεν λειτουργεί με merge commits επειδή ένα merge commit έχει δύο γονείς. Χρησιμοποιήστε τη σημαία -m 1 για να καθορίσετε με ποιον γονέα θα γίνει σύγκριση. Το -m 1 λαμβάνει το diff σε σχέση με τον πρώτο γονέα.
Ακύρωση του cherry-pick μπορεί να γίνει μέσω git reset --hard HEAD~1, εάν είναι το τελευταίο commit. Εάν το commit έχει ήδη σταλεί — χρησιμοποιήστε git revert <SHA> για να δημιουργήσετε ένα commit ακύρωσης.
Δεν έχει νόημα, αλλά τεχνικά είναι δυνατό. Εάν το commit υπάρχει ήδη στο branch, το Git θα ανιχνεύσει ότι οι αλλαγές έχουν ήδη εφαρμοστεί και θα αναφέρει: «The previous cherry-pick is now empty, possibly due to conflict resolution.» Το commit δεν θα δημιουργηθεί ξανά.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης