Mwongozo

git cherry-pick: jinsi ya kuhamisha commit moja kwenda tawi jingine

Imesasishwa: · Skillaria.Top

git cherry-pick huchukua mabadiliko ya commit uliyoitaja na kuunda kwenye tawi la sasa commit mpya yenye dif ile ile na ujumbe ule ule, lakini hash tofauti. Hamia tawi lengwa kisha tekeleza git cherry-pick <hash>; ikitokea conflict, rekebisha faili, fanya git add na git cherry-pick --continue.

git cherry-pick inahamisha mabadiliko ya commit moja mahususi kwenda tawi la sasa, bila kuunganisha tawi zima. Git inahesabu dif ya commit iliyochaguliwa kuhusiana na mzazi wake, inaiweka juu ya HEAD yako na kuunda commit mpya — yenye ujumbe na mwandishi ule ule, lakini hash tofauti, kwa sababu ina mzazi tofauti.

Mfano wa kawaida: kwenye tawi la feature umerekebisha hitilafu, na marekebisho hayo yanahitajika haraka kwenye tawi la release ambalo feature bado haijawa tayari. Haiwezekani kuunganisha tawi zima, lakini commit moja inawezekana.

Jinsi ya kuhamisha commit moja kwenda tawi jingine

Kwanza tafuta hash ya commit inayohitajika, kisha hamia tawi ambapo unataka kuihamisha na utekeleze cherry-pick.

# 1. Tafuta commit kwenye tawi la feature
git log --oneline feature
a1b2c3d Rekebisha mgawanyo kwa sifuri kwenye hesabu ya punguzo
9f8e7d6 Ongeza skrini mpya ya malipo

# 2. Hamia tawi lengwa
git switch release-1.4

# 3. Hamisha commit
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Rekebisha mgawanyo kwa sifuri kwenye hesabu ya punguzo
 Date: Mon Oct 5 14:12:03 2026 +0300
 1 file changed, 3 insertions(+), 1 deletion(-)

Angalia: commit mpya imepata hash 4e5f6a7, si a1b2c3d. Hivi ni vitu viwili tofauti vyenye mabadiliko yanayofanana. Tawi la asili feature halibadiliki.

Badala ya hash unaweza kutoa rejeo lolote la commit: git cherry-pick feature itachukua commit ya mwisho ya tawi la feature, git cherry-pick feature~2 — ya tatu kutoka mwisho.

Jinsi ya kuhamisha commits kadhaa

Kwa kuorodhesha

Hash zinaweza kutolewa kama orodha — Git itazitumia kwa mpangilio uliotajwa, na kuunda commits mpya kwa idadi hiyo.

git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6

Mpangilio ni muhimu: ikiwa commit ya pili inategemea ya kwanza, na umeziorodhesha kinyume, utapata conflict au msimbo uliovunjika. Ni salama zaidi kuorodhesha kutoka za zamani hadi mpya.

Kwa safu

Kwa commits zinazofuatana tumia sintaksia ya safu. Hapa kuna mtego ambao karibu kila mtu anaanguka: A..B inamaanisha «commits zinazofikika kutoka B lakini si kutoka A», yaani A yenyewe haiingii kwenye safu.

# Itahamisha commits BAADA YA A hadi B ikijumuisha
git cherry-pick A..B

# Itahamisha A na kila kitu hadi B ikijumuisha
git cherry-pick A^..B

Ikiwa unataka kuhamisha kila kilichopo kwenye feature na kisichokuwepo kwenye main, andishi git cherry-pick main..feature ni rahisi. Lakini ikiwa commits ni nyingi, fikiria: pengine unahitaji rebase au merge, si cherry-pick.

Bendera muhimu za git cherry-pick

BenderaInafanya niniLini inahitajika
-xInaongeza kwenye ujumbe mstari «(cherry picked from commit …)»Unapohamisha marekebisho kati ya matawi ya umma — asili inaonekana
-n, --no-commitInaweka mabadiliko kwenye index na saraka ya kazi bila commitUnataka kuunganisha commits kadhaa kuwa moja au kurekebisha kabla ya commit
-e, --editInafungua kihariri kurekebisha ujumbeUnahitaji kuboresha ujumbe kwa tawi lengwa
-s, --signoffInaongeza mstari Signed-off-byMiradi inayodai DCO
-m 1Inataja mzazi «mkuu» wa merge commitKuhamisha merge commit
--ffInasogeza tawi mbele ikiwa HEAD ni mzazi wa commit iliyochaguliwaMara chache; inazuia nakala isiyo ya lazima
--allow-emptyInaruhusu kuhamisha commits tupu tangu mwanzoCommits tupu za huduma

Kwa nini -x ni muhimu

Baada ya miezi sita mtu ataona marekebisho kwenye tawi la release na atataka kujua yametoka wapi. Mstari unaoongezwa na -x unampa jibu moja kwa moja:

git cherry-pick -x a1b2c3d
git log -1
    Rekebisha mgawanyo kwa sifuri kwenye hesabu ya punguzo

    (cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)

Tumia -x pale commit ya asili tayari imechapishwa. Kwa kuhamisha kutoka tawi lako la ndani ambalo utalifuta baadaye, kiungo kitaelekeza mahali pasipo na kitu — hapo bendera haihitajiki.

Kuunganisha commits kadhaa kuwa moja: -n

git cherry-pick -n a1b2c3d 7c8d9e0
git status          # mabadiliko ya commits zote mbili yako kwenye index
git commit -m "Marekebisho ya hesabu ya punguzo"

Migongano wakati wa cherry-pick na jinsi ya kuisuluhisha

Conflict hutokea wakati mabadiliko ya commit hayaendani na msimbo wa sasa: kwenye tawi lengwa mistari ile ile tayari inaonekana tofauti. Git inasimama na kukujulisha.

git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Rekebisha mgawanyo kwa sifuri kwenye hesabu ya punguzo
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".

Kisha una njia tatu:

  1. Suluhisha na endelea. Fungua faili, ondoa alama <<<<<<<, =======, >>>>>>>, ukiacha toleo sahihi, kisha git add src/discount.js na git cherry-pick --continue.
  2. Ruka commit. Wakati wa kuhamisha orodha, git cherry-pick --skip inaruka commit yenye tatizo na kuendelea na inayofuata.
  3. Ghairi yote. git cherry-pick --abort inarudisha tawi kwenye hali ya kabla ya operesheni kuanza.

Pia kuna git cherry-pick --quit: inasimamisha operesheni lakini inabakiza commits zilizotumika tayari na hali ya faili ilivyo. Ni muhimu wakati nusu ya orodha imehamishwa kwa mafanikio na unataka kuendelea kwa mkono.

Ikiwa conflicts zinajirudia (kwa mfano unahamisha marekebisho mara kwa mara kwenda matawi kadhaa ya release), washa git config rerere.enabled true — Git itakumbuka jinsi ulivyosuluhisha conflict na kutumia suluhisho hilo kiotomatiki mara nyingine.

Jinsi ya kuhamisha merge commit

Merge commit ina wazazi wawili, na Git haijui dif inahesabiwa kuhusiana na lipi. Bila msaada utapata hitilafu:

git cherry-pick 5d6e7f8
error: commit 5d6e7f8 is a merge but no -m option was given.

Bendera -m 1 inasema: hesabu mabadiliko kuhusiana na mzazi wa kwanza — kwa kawaida ni tawi ambalo merge ilifanyika ndani yake. Kwa hiyo utahamisha kila kilicholetwa na tawi lililounganishwa kwa commit moja.

git cherry-pick -m 1 5d6e7f8

Kumbuka kwamba baada ya hapo Git haitaona tawi kama lililounganishwa: wakati wa merge ijayo inaweza kujaribu kutumia mabadiliko yale yale tena.

git cherry-pick na git apply: tofauti ni nini

git apply mara nyingi hutajwa pamoja na cherry-pick, kwa sababu amri zote mbili «zinaweka mabadiliko». Lakini zinafanya kazi na data tofauti za kuingiza.

git cherry-pickgit apply
ChanzoCommit iliyopo kwenye hifadhiFaili la patch (dif)
Inaunda commitNdiyo (bila -n)Hapana, inabadilisha faili tu (kwa --index — pia index)
Inahifadhi mwandishi na ujumbeNdiyoHapana, patch haina hayo
MigonganoMerge ya pande tatu yenye alamaKwa chaguo-msingi inakataa tu; kwa --3way — inaweka alama
Inahitaji hifadhi ya pamojaNdiyo, commit lazima ipatikane ndaniHapana, patch inaweza kupitishwa kwa njia yoyote

Mfano wa kutumia git apply wakati commit haipo kwenye hifadhi yako — mwenzako alituma dif kama faili:

# Mwenzako anafanya
git diff main..fix-discount > fix.patch

# Wewe unakagua na kutumia
git apply --check fix.patch   # angalia kama patch itafaa
git apply fix.patch           # itumie kwenye saraka ya kazi
git apply --3way fix.patch    # ikitofautiana — kwa alama za conflict

Ikiwa unataka kuhamisha commit nzima, pamoja na mwandishi na ujumbe, tumia jozi ya git format-patch na git am: ya kwanza inahifadhi commits kwenye faili, ya pili inaunda commits kutoka kwenye faili hizo. Kimsingi ni cherry-pick «kwa barua pepe».

Kwa njia, cherry-pick kutoka hifadhi nyingine pia inawezekana: ongeza hifadhi hiyo kama remote, tekeleza git fetch, na commits zitapatikana kwa hash.

Wakati cherry-pick ni wazo baya

Cherry-pick huunda nakala: mabadiliko yale yale yanaishi kwenye historia chini ya hash mbili. Kwa kiasi kidogo ni kawaida, lakini kuna hali ambapo inaleta madhara.

  • Kuhamisha makumi ya commits. Ukihamisha karibu tawi lote, hiyo ni rebase au merge. Cherry-pick hapa itatoa historia ndefu ya nakala na conflicts zaidi.
  • Uhamisho wa pande mbili. Commit imehamishwa kutoka feature kwenda main, kisha feature inaunganishwa kwenye main. Git kwa kawaida inamudu (mabadiliko yanafanana), lakini ikiwa baada ya uhamisho mistari ilihaririwa, utapata conflict isiyo na sababu dhahiri.
  • Commits zinazotegemeana. Commit inatumia kazi iliyoongezwa na commits mbili zilizotangulia. Cherry-pick itahamisha commit yenyewe tu, na msimbo kwenye tawi lengwa hautajengwa. Daima hakiki ujenzi na majaribio baada ya uhamisho.

Mazoea mazuri kwa hotfixes: fanya marekebisho moja kwa moja kwenye tawi kongwe linalosaidiwa kisha uyaunganishe juu kwenda matawi mapya. Hivyo cherry-pick inabaki kuwa ubaguzi.

Jinsi ya kughairi cherry-pick

Ikiwa operesheni bado inaendelea (conflict) — git cherry-pick --abort. Ikiwa commit tayari imeundwa na haijatumwa kwenye seva, iondoe:

git reset --hard HEAD~1

Ikiwa commit tayari imetumwa kwenye tawi la pamoja, huwezi kuandika upya historia — unda commit ya kinyume:

git revert 4e5f6a7

Na ukifanya reset ukabadili nia, commit iliyopotea inapatikana kwa git reflog.

Jinsi ya kuangalia kama commit tayari imehamishwa

Kwa kuwa hash ni tofauti, git branch --contains ya kawaida haitasaidia. Git inaweza kulinganisha commits kwa yaliyomo ya mabadiliko (patch-id):

git cherry -v release-1.4 feature
- a1b2c3d Rekebisha mgawanyo kwa sifuri kwenye hesabu ya punguzo
+ 9f8e7d6 Ongeza skrini mpya ya malipo

Alama ya minus inamaanisha kwamba mabadiliko sawa tayari yapo kwenye release-1.4, alama ya plus — bado hayapo. Njia nyingine ni git log --cherry-pick --oneline release-1.4...feature, inayoficha commits pacha. Ikiwa ulitumia -x, unaweza kutafuta kwa ujumbe tu: git log --grep="cherry picked from commit a1b2c3d".

Muhtasari

git cherry-pick ni zana ya kulenga: kuhamisha hotfix kwenda release, kuchukua commit muhimu kutoka tawi lililoachwa, kurejesha commit iliyowekwa kimakosa mahali pasipofaa. Kumbuka mambo matatu: commit mpya inapata hash mpya, safu A..B haijumuishi A, na kwa matawi ya umma ni vizuri kuongeza -x. Ikiwa unahitaji kuhamisha dif kutoka faili badala ya commit, chukua git apply. Rebase, stash, cherry-pick na tagi zimefafanuliwa kwa vitendo katika kozi ya Git.

Maswali ya mara kwa mara

Je, cherry-pick inabadilisha tawi la asili?

Hapana. Commit ya asili inabaki pale ilipo, na kwenye tawi la sasa inaonekana nakala yake yenye hash mpya.

Je, inawezekana kufanya cherry-pick ya commit kutoka tawi la mbali?

Ndiyo. Tekeleza git fetch; baada ya hapo commit inapatikana kwa hash au kama origin/jina-la-tawi, na unaweza kuipitisha kwa git cherry-pick.

Kwa nini hash ya commit inabadilika baada ya cherry-pick?

Hash inategemea mzazi, wakati wa commit na yaliyomo ya mti wa faili. Nakala ina mzazi tofauti na wakati tofauti wa committer, kwa hiyo hash pia ni tofauti.

Je, mwandishi wa commit anabaki wakati wa cherry-pick?

Ndiyo, mwandishi na tarehe ya uandishi vinachukuliwa kutoka kwenye commit ya asili, na wewe unakuwa committer mwenye tarehe ya leo.

Nifanye nini ikiwa cherry-pick inasema commit ni tupu?

Maana yake mabadiliko hayo tayari yapo kwenye tawi. Ruka kwa git cherry-pick --skip, au rekodi ukitumia git commit --allow-empty.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.

Nenda kwenye kozi