Cherry-pick: bu nədir, cherry-pick necə yerinə yetirilir və Git əmrləri

Müəllif: IT Sectr Dərc olunub: 2026-08-01 Oxuma vaxtı: 8 dəq

Cherry-pick — Git əmri olub, göstərilmiş commitdən dəyişiklikləri cari budağa tətbiq edir, mənbə budağın bütöv tarixini köçürmədən. Merge və ya rebase-dən fərqli olaraq, cherry-pick hər commitlə fərdi işləyir: tərtibatçı xaş üzrə konkret commiti seçir və yalnız onun dəyişikliklərini köçürür. Git sənədlərinə (2026) görə, cherry-pick xüsusilə buraxılış budaqları arasında dəqiq düzəlişlərin köçürülməsi üçün faydalıdır, bütöv merge lazımsız və ya təhlükəli olduqda. Əmr yeni xaşlə yeni commit yaradır, lakin orijinal mesajı və müəllifi qoruyur.

Başlıca

  • Cherry-pick — ayrıca commitin xaş üzrə bir budaqdan digərinə köçürülməsi.
  • Yeni xaş — hər cherry-pick orijinaldan köçürülmüş dəyişikliklərlə yeni commit yaradır.
  • Bir neçə commit bir dəfəyə — git cherry-pick A B C göstərilmiş commitləri ardıcıl köçürür.
  • Buraxılış budaqları — əsas ssenari: hotfix-in develop-dən release-ə lazımsız kod olmadan köçürülməsi.
  • Mümkün konfliktlər — commit tətbiq edilərkən Git konfliktlərin həllini tələb edə bilər.

Git-də cherry-pick nədir

Cherry-pick — git cherry-pick əmri olub, mövcud commitdən dəyişiklikləri götürür və onları cari budaqda yeni commit kimi tətbiq edir. Orijinal commit öz budağında dəyişməz qalır, hədəf budaqda isə dəyişikliklərin surəti yaradılır. Əmr bütöv budağı köçürmədən konkret düzəlişi köçürmək lazım olduqda faydalıdır.

Sintaksis: git cherry-pick <commit-hash>. Git göstərilmiş commitin valideyni ilə fərqini (diff) təhlil edir və bu fərqi cari budağa tətbiq edir. Dəyişikliklər bir neçə fayldadırsa — hamısı birlikdə köçürülür. Əmr həmçinin diapazonları qəbul edir: git cherry-pick A..B — A-dan B-yə qədər bütün commitlər, A daxil deyil.

Flakslar imkanları genişləndirir: -n (--no-commit) dəyişiklikləri işçi qovluğuna və indeksə commit yaratmadan tətbiq edir — bir neçə commitin dəyişikliklərini bir commitdə birləşdirmək lazım olduqda faydalıdır. -x flaqası commit mesajına (cherry picked from commit ...) sətri əlavə edir ki, bu da tarixdə dəyişikliklərin mənşəyini izləməyi asanlaşdırır.

bash
# Cherry-pick tək commiti xaş üzrə
git cherry-pick a1b2c3d

# Cherry-pick bir neçə commit (ardıcıl)
git cherry-pick a1b2c3d e4f5g6h i6j7k8l

# Cherry-pick avtomatik commit olmadan
git cherry-pick -n a1b2c3d

# -x flaqası orijinal commitə istinad əlavə edir
git cherry-pick -x a1b2c3d

Cherry-pick nə vaxt tətbiq edilir

Əsas ssenari — buraxılış budaqları arasında düzəlişlərin köçürülməsi. Təsəvvür edin: develop-də kritik səhv tapıldı və düzəldildi. Buraxılış budağı release/v2.1 artıq ayrılıb və bu səhv orada da var. Bütöv develop-ın release-ə merge edilməsi çoxlu hazır olmayan kodu köçürəcək, cherry-pick isə bir düzəliş commiti ilə təhlükəsiz və dəqiq həlledir.

İkinci ssenari — dəyişikliklərin ləğv edilməsi (revert) və sonra bərpa. Əgər commit git revert vasitəsilə ləğv edilibsə və sonra ləğvin səhv olduğu məlum olubsa — ləğv edilmiş commitin cherry-pick-i dəyişiklikləri bərpa edir. Bu, revert-in ləğvindən daha düzgündür, çünki təkrari konfliktlər yaratmır.

Üçüncü ssenari — müxtəlif feature-budaqlardan commitlərin birləşdirilməsi inteqrasiya testi üçün bir test budağına. Bir neçə yarımçıq budağı birləşdirmək əvəzinə, hər birindən yalnız hazır commitləri seçib onların birgə işini yoxlamaq olar.

  • Hotfix-lər — düzəlişin develop-dən release-ə hazır olmayan kod olmadan köçürülməsi.
  • Təcili hotfix — hotfix budağından düzəlişin main və develop-ə eyni vaxtda tətbiqi.
  • Səhv revert-in ləğvi — dəyişiklikləri bərpa etmək üçün ləğv edilmiş commitin cherry-pick-i.
  • Test etmə — inteqrasiya yoxlaması üçün müxtəlif budaqlardan seçilmiş commitlərin toplanması.

Cherry-pick vs rebase və merge

Cherry-pick rebase və merge-dən onunla fərqlənir ki, ayrı-ayrı commitlər səviyyəsində işləyir, bütöv budaqlar səviyyəsində yox. Rebase budağın bütün commitlərini köçürür, merge iki budağı birləşdirir, cherry-pick isə yalnız lazım olanları seçir. Bu, onu daha dəqiq alət edir, lakin daha çox əl işi tələb edir.

Digər fərq — müəlliflik. Cherry-pick zamanı Git orijinal commitin müəllifini (Author) qoruyur, lakin committer (Committer) cari istifadəçi olur. Commit mesajında mənşəyi -x flaqası vasitəsilə izləmək olar. Rebase zamanı həm müəllif, həm committer — hər ikisi yeni xaşlə cari istifadəçidir.

Məhsuldarlıq: bir commitin cherry-pick-i çox sayda commiti olan iki budağın merge-indən daha sürətli yerinə yetirilir. Lakin onlarla commiti köçürmək lazımdırsa, müvəqqəti budaq yaradıb rebase etmək daha səmərəli olar və onlarla xaşın göstərilməsini tələb etməz.

ƏməliyyatTətbiq sahəsiYan təsirlər
Cherry-pickAyrı-ayrı commitlərYeni xaş, kodun dublikasiyası
RebaseBudağın bütün commitləriTarixin yenidən yazılması, yeni xaşlar
MergeBudaqların tam birləşməsiMerge-commit, tarixin qorunması

Bir neçə commitin köçürülməsi

Bir neçə commit bir əmrlə köçürülə bilər, onların xaşlarını boşluqla ayıraraq: git cherry-pick A B C. Git commitləri göstərilən ardıcıllıqla tətbiq edir. Əgər commitlərdən hər hansı konflikt yaradırsa, cherry-pick dayandırılır və tərtibatçı konflikti həll etməli, sonra git cherry-pick --continue ilə davam etməlidir.

Commit diapazonları: git cherry-pick A..B (A-dan sonra B-yə qədər bütün commitlər, A daxil deyil) və git cherry-pick A^..B (A daxil olmaqla B-yə qədər bütün commitlər). Diapazonlar bir budaqdan bütün commitləri valideyn əlaqəsi olmadan köçürmək lazım olduqda rahatdır — məsələn, hazır funksiyanı köhnə budaqdan yenisinə köçürərkən.

--strategy flaqası Git-in dəyişiklikləri necə tətbiq edəcəyini müəyyən edir. Varsayılan olaraq recursive strategiyası istifadə olunur, lakin konflikt tərəfini avtomatik seçmək üçün ours və ya theirs göstərilə bilər. --mainline flaqası merge-commitin cherry-pick-ində istifadə olunur — diff-in hesablandığı valideyn nömrəsini (1 və ya 2) göstərir.

bash
# Cherry-pick commit diapazonu
git cherry-pick develop~5..develop~2

# Cherry-pick merge commiti (valideyni göstər)
git cherry-pick -m 1 m9n0o1p

# Theirs strategiyasını istifadə et
git cherry-pick --strategy=recursive \
  --strategy-option=theirs a1b2c3d

# Konflikt həllindən sonra davam et
git cherry-pick --continue

Cherry-pick zamanı konfliktlər

Cherry-pick zamanı konfliktlər köçürülən commitin dəyişiklikləri hədəf budaqda dəyişdirilmiş eyni sətirlərə toxunduqda yaranır. Git icranı dayandırır, konflikt edən faylları qeyd edir və həllini gözləyir. Statusda belə fayllar both modified kimi göstərilir.

Konflikt zamanı hərəkət ardıcıllığı: konflikt edən faylı açmaq, konflikt markerlərini tapmaq (<<<<<<<, =======, >>>>>>>), məzmunu redaktə etmək, markerləri silmək, həll edilmiş fayllar üçün git add etmək və git cherry-pick --continue işlətmək. Konflikt həll olunmazsa — git cherry-pick --abort bütöv cherry-pick-i ləğv edir, budağı ilkin vəziyyətinə qaytarır.

Tez-tez rast gəlinən problem: commit artıq mövcud olana ekvivalent dəyişiklikləri ehtiva edir. Bu halda Git cherry-pick cəhdi zamanı «nothing to commit» və ya «empty commit» bildirir. --keep-redundant-commits və --empty=keep flaqsları Git-i ardıcıllığı qorumaq üçün boş commit yaratmağa məcbur edir, --skip isə belə commiti ötürməyə imkan verir.

bash
# Cherry-pick zamanı konflikt — dayan
git cherry-pick a1b2c3d
# xəta: a1b2c3d... tətbiq edilə bilmədi commit mesajı

# Konflikti həll et → indeksə əlavə et
git add src/conflicted_file.swift
git cherry-pick --continue

# Boş commiti ötür (artıq tətbiq edilib)
git cherry-pick --skip

# Tam ləğv
git cherry-pick --abort

Cherry-pick üçün ən yaxşı təcrübələr

Birinci qayda: həmişə köçürülən commitin özünükifayət olduğunu yoxlayın. Əgər commit A köçürülməyən commit B-dəki dəyişikliklerdən asılıdırsa, A-nın cherry-pick-i qurğunu poza bilər. Cherry-pick-ədənkər commitin hansı faylları dəyişdirdiyini git show --stat <hash> vasitəsilə yoxlamaq faydalıdır.

İkinci qayda: cherry-pick-i sənədləşdirin. Commit mesajında mənbə commitə istinadı qorumaq üçün -x flaqasından istifadə edin. Bu, tarixin sonrakı təhlilində dəyişikliyin haradan gəldiyini müəyyən etməyə kömək edəcək. -x olmadan cherry-pick adi commit kimi görünür və onun mənşəyi yalnız git log --graph vasitəsilə müəyyən edilə bilər.

Üçüncü qayda: çox fərqlənən budaqlar arasında cherry-pick-dən çəkinin. Əgər commitin yaradılmasından çox vaxt keçibsə və kod bazası əhəmiyyətli dəyişilibsə, konfliktlər çoxsaylı və mürəkkəb olacaq. Belə hallarda düzəlişi hədəf budaqda yenidən etmək daha yaxşıdır — bu, onlarla konflikti həll etməkdən daha az vaxt aparacaq.

  • Cherry-pick yalnız xarici asılılıqları olmayan özünükifayət commitləri.
  • -x flaqası commitin mənşəyini sənədləşdirmək üçün məcburidir.
  • Çəkinin kod bazası böyük fərqlə olan köhnə commitlərin cherry-pick-indən.
  • CI/CD cherry-pick-dən sonra qurğunu yoxlayın: konflikt olmaya bilər, lakin kod kompilyasiya olunmaya bilər.
  • PR-də şərh pull request yaradarkən cherry-pick ilə köçürülmüş commitləri göstərin.

Tez-tez verilən suallar

Commiti cherry-pick etmək nə deməkdir?

Cherry-pick etmək — göstərilmiş commitin dəyişikliklərini git cherry-pick vasitəsilə cari budağa tətbiq etmək. Əmr eyni dəyişikliklərlə, lakin yeni xaşlə yeni commit yaradır. Orijinal commit öz budağında dəyişməz qalır. Bu, yalnız bir konkret commit lazım olduqda bütöv budağın birləşdirilməsinə alternativdir.

Nə vaxt cherry-pick merge əvəzinə lazımdır?

Cherry-pick bütöv budağı köçürmədən bir və ya bir neçə konkret commiti köçürmək lazım olduqda seçilir. Merge budaqların tam birləşməsi üçün tətbiq edilir. Cherry-pick üçün tipik ssenari — hotfix-in inkişaf budağından, qalan dəyişikliklərin hələ hazır olmadığı buraxılış budağına köçürülməsidir.

Cherry-pick-i ləğv etmək olarmı?

Tamamlanmadan əvvəl — git cherry-pick --abort əməliyyatı tamamilə ləğv edir. Uğurlu tamamlanmadan sonra — git revert <hash> cherry-pick dəyişikliklərini ləğv edən commit yaradır. --abort-dan fərqi: revert commiti tarixdən silmir, əksinə yeni ləğvedici commit yaradır.

Cherry-pick boş commit yaradarsa nə etməli?

Boş commit dəyişikliklər hədəf budaqda artıq mövcud olduqda yaranır. Belə commiti ötürmək üçün git cherry-pick --skip istifadə edin və ya xaşların ardıcıllığını qorumaq üçün git cherry-pick --keep-redundant-commits ilə boş commit yaradın.

Cherry-pick rebase-dən nə ilə fərqlənir?

Cherry-pick seçilmiş commitləri (bir və ya siyahı ilə) cari budağa köçürür. Rebase budağın bütün commitlərini yeni bazaya köçürür. Cherry-pick mənbə budağı dəyişmir, rebase tarixi yenidən yazır. Cherry-pick dəqiqdir, lakin əl ilədir; rebase avtomatikdir, lakin ictimai budaqlar üçün təhlükəlidir.

Nəticələr

  • Cherry-pick — dəyişiklikləri qoruyaraq və yeni xaş yaradaraq ayrı-ayrı commitləri budaqlar arasında köçürmək üçün əmr.
  • Əsas ssenari — bütöv tarixi və ya hazır olmayan kodu köçürmədən buraxılış budaqları arasında düzəlişlərin köçürülməsi.
  • Bir neçə commit xaşları sadalamaqla və ya A..B diapazonu ilə bir əmrlə köçürülür.
  • Konfliktlər merge-də olduğu kimi həll edilir: faylları redaktə, git add, git cherry-pick --continue.
  • -x flaqası tarixin şəffaflığı üçün mesaja mənbə commitə istinad əlavə edir.
  • Ləğv etmə tamamlanmadan əvvəl --abort və ya sonra git revert vasitəsilə edilir.
  • Risk: asılı commitlərin və çox köhnə dəyişikliklərin cherry-pick-i çoxsaylı konfliktlərə səbəb ola bilər.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun