Cherry-pick — τι είναι, μηχανισμός και εφαρμογή στο Git

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-05-10 Χρόνος ανάγνωσης: 10 λεπ

Cherry-pick — είναι μια εντολή Git που εφαρμόζει αλλαγές από ένα ή περισσότερα υπάρχοντα commits στο τρέχον branch. Σε αντίθεση με το Merge (μεταφέρει ολόκληρο το branch) και το Rebase (μεταφέρει μια ακολουθία commits), το cherry-pick επιλέγει μόνο τα καθορισμένα commits. Σύμφωνα με το git-scm.com, 2025, το cherry-pick είναι περισσότερο ζητούμενο σε σενάρια μεταφοράς διορθώσεων μεταξύ branches έκδοσης.

Κύρια σημεία

  • Cherry-pick — μεταφορά μεμονωμένων commits μεταξύ branches χωρίς πλήρη συγχώνευση
  • Στοχευμένη μεταφορά — επιλέγονται συγκεκριμένα commits, όχι ολόκληρο το branch
  • Νέα SHA — κάθε cherry-pick δημιουργεί νέο commit με τροποποιημένο hash
  • Σενάριο Hotfix — το cherry-pick είναι βολικό για μεταφορά διόρθωσης στο branch έκδοσης
  • Κίνδυνοι — διπλασιασμός commits και απώλεια πλαισίου κατά την ενεργή χρήση

Τι είναι το Cherry-pick;

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

Σύνταξη του cherry-pick είναι απλή: καθορίστε το hash του commit που θέλετε να μεταφέρετε. Το Git θα αντιγράψει τις αλλαγές στο τρέχον branch ως νέο commit. Υποστηρίζεται η μεταφορά πολλών commits ταυτόχρονα και ολόκληρων περιοχών.

bash
# Μεταφορά ενός 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 έκδοσης.

bash
# Βρείτε το 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 με επιλογές).

bash
# Επίλυση διένεξης στο cherry-pick
# Το Git εμφανίζει αρχεία με διένεξη
git status

# Επιλύστε χειροκίνητα, στη συνέχεια:
git add επιτρεπόμενο_αρχείο.kt
git cherry-pick --continue

# Ή ακυρώστε το cherry-pick:
git cherry-pick --abort

Πότε να εφαρμόσετε το Cherry-pick

Cherry-pick είναι βέλτιστο σε σενάρια όπου απαιτείται στοχευμένη μεταφορά αλλαγών χωρίς συγχώνευση ολόκληρων branches. Ας εξετάσουμε πέντε κύριες περιπτώσεις όπου το cherry-pick γίνεται η καλύτερη επιλογή.

  • Μεταφορά hotfix — η διόρθωση βρέθηκε στο develop, αλλά πρέπει να εφαρμοστεί στο branch έκδοσης (release/v2.0). Το Cherry-pick μεταφέρει μόνο το commit της διόρθωσης, χωρίς να αγγίζει ημιτελείς λειτουργίες από το develop
  • Backport σε παλιές εκδόσεις — η διόρθωση για την τρέχουσα έκδοση πρέπει να μεταφερθεί στην έκδοση LTS. Αντί να συγχωνεύεται ολόκληρη η τρέχουσα βάση κώδικα, το cherry-pick επιλέγει μόνο τα απαραίτητα commits
  • Ακύρωση commit σε άλλο branch — εάν το commit έγινε σε λάθος branch, το cherry-pick το μεταφέρει στο σωστό branch και το αρχικό commit ακυρώνεται
  • Μεταφορά τεκμηρίωσης — αλλαγές σε README ή αρχεία διαμόρφωσης που πρέπει να υπάρχουν σε όλα τα branches, μεταφέρονται εύκολα μέσω cherry-pick
  • Επιλεκτική εφαρμογή — από το branch πρωτοτύπου χρειάζεται μόνο ένα επιτυχημένο commit, χωρίς μεταφορά ολόκληρου του πρωτοτύπου στην κύρια ανάπτυξη

Για την ανάπτυξη εφαρμογών για κινητά, το 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.

Cherry-pick vs Merge vs Rebase

Τρία κύρια εργαλεία ενσωμάτωσης αλλαγών στο Git — merge, rebase και cherry-pick — επιλύουν διαφορετικές εργασίες. Η επιλογή εξαρτάται από το πόσες αλλαγές πρέπει να μεταφερθούν και πώς πρέπει να μοιάζει το ιστορικό.

ΚριτήριοMergeRebaseCherry-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

Cherry-pick — χρήσιμο αλλά δυνητικά επικίνδυνο εργαλείο σε περίπτωση εσφαλμένης ή υπερβολικής χρήσης. Οι κύριοι κίνδυνοι σχετίζονται με διπλασιασμό commits, απώλεια πλαισίου και διενέξεις σε μετέπειτα συγχωνεύσεις.

  • Διπλασιασμός commits — εάν το ίδιο commit αργότερα εισέλθει στο branch μέσω merge, το Git δημιουργεί ένα δεύτερο commit, πανομοιότυπο σε αλλαγές. Αυτό μολύνει το ιστορικό και δυσκολεύει το git bisect
  • Απώλεια πλαισίου — το cherry-pick μεταφέρει το diff, αλλά δεν μεταφέρει πληροφορίες για γονικά commits και εξαρτήσεις. Εάν το cherry-pick εφάρμοσε το commit A χωρίς το commit B από το οποίο εξαρτάται το A, ενδέχεται να προκύψουν λογικά σφάλματα
  • Διενέξεις στο merge — μετά το cherry-pick, κατά την πλήρη συγχώνευση branches, το Git μπορεί να δει τις ίδιες αλλαγές δύο φορές και να δημιουργήσει διενέξεις που θα μπορούσαν να αποφευχθούν σε κανονικό merge
  • Έλλειψη σύνδεσης — χωρίς τη σημαία -x είναι αδύνατο να γίνει κατανοητό ότι το commit μεταφέρθηκε από άλλο branch. Κατά την αναζήτηση της προέλευσης της αλλαγής, ο προγραμματιστής μπορεί να ξοδέψει ώρες για να προσδιορίσει την προέλευση του commit

Συστάσεις για ελαχιστοποίηση κινδύνων: χρησιμοποιείτε πάντα τη σημαία -x για να υποδείξετε το αρχικό SHA, τεκμηριώστε τον λόγο του cherry-pick στο μήνυμα commit και, όταν είναι δυνατόν, χρησιμοποιήστε merge αντί για cherry-pick όταν το επιτρέπει το πλαίσιο. Εάν υπάρχουν πολλά cherry-pick — εξετάστε την αναδιάρθρωση των branches.

Αυτοματοποίηση ελέγχων στο Cherry-pick

Τα CI pipelines πρέπει να λαμβάνουν υπόψη το cherry-pick ως ξεχωριστό σενάριο. Συνιστάται η ρύθμιση αυτόματου ελέγχου: κατά τη δημιουργία ενός cherry-pick commit, το CI ελέγχει ότι τα τροποποιημένα αρχεία αντιστοιχούν στο αναμενόμενο σύνολο και εκτελεί δοκιμές για τις επηρεαζόμενες μονάδες. Αυτό μειώνει τον κίνδυνο παλινδρόμησης κατά τη στοχευμένη μεταφορά αλλαγών μεταξύ branches.

Συχνές Ερωτήσεις

Σε τι διαφέρει το cherry-pick από το git revert;

Cherry-pick μεταφέρει αλλαγές από ένα commit σε άλλο branch. Revert δημιουργεί νέο commit που αναιρεί τις αλλαγές του καθορισμένου commit στο ίδιο branch. Το Revert δεν διαγράφει το ιστορικό — προσθέτει μια αντίστροφη αλλαγή.

Μπορείτε να κάνετε cherry-pick πολλά commits ταυτόχρονα;

Ναι: git cherry-pick A B C — μεταφορά των commits A, B και C με τη σειρά. Ή git cherry-pick A..C — μεταφορά όλων των commits από A έως C (χωρίς το A). Η σειρά μεταφοράς αντιστοιχεί στη σειρά της εντολής.

Πώς λειτουργεί το cherry-pick με merge commits;

Από προεπιλογή, το cherry-pick δεν λειτουργεί με merge commits επειδή ένα merge commit έχει δύο γονείς. Χρησιμοποιήστε τη σημαία -m 1 για να καθορίσετε με ποιον γονέα θα γίνει σύγκριση. Το -m 1 λαμβάνει το diff σε σχέση με τον πρώτο γονέα.

Τι να κάνετε αν το cherry-pick δημιούργησε εσφαλμένο commit;

Ακύρωση του cherry-pick μπορεί να γίνει μέσω git reset --hard HEAD~1, εάν είναι το τελευταίο commit. Εάν το commit έχει ήδη σταλεί — χρησιμοποιήστε git revert <SHA> για να δημιουργήσετε ένα commit ακύρωσης.

Μπορεί το cherry-pick να μεταφέρει ένα commit από ένα branch στο ίδιο branch;

Δεν έχει νόημα, αλλά τεχνικά είναι δυνατό. Εάν το commit υπάρχει ήδη στο branch, το Git θα ανιχνεύσει ότι οι αλλαγές έχουν ήδη εφαρμοστεί και θα αναφέρει: «The previous cherry-pick is now empty, possibly due to conflict resolution.» Το commit δεν θα δημιουργηθεί ξανά.

Σύνοψη

  • Cherry-pick — μεταφορά επιλεγμένων commits μεταξύ branches χωρίς πλήρη συγχώνευση
  • Μηχανισμός — το Git υπολογίζει το diff του commit και το εφαρμόζει ως νέο commit στο target
  • Σενάριο Hotfix — κύρια περίπτωση χρήσης: μεταφορά διόρθωσης στο branch έκδοσης
  • Σημαία -x — υποχρεωτική για τεκμηρίωση του αρχικού SHA του μεταφερόμενου commit
  • Κίνδυνοι — διπλασιασμός commits, απώλεια πλαισίου, διενέξεις σε μελλοντικά merge
  • Διαφορά από Merge — το cherry-pick είναι στοχευμένο, το merge συγχωνεύει branches πλήρως
  • Διαφορά από Rebase — το cherry-pick επιλέγει commits χειροκίνητα, το rebase είναι αυτόματο για αλυσίδα

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης