Gabay

git cherry-pick: paano ilipat ang isang commit sa ibang branch

Na-update: · Skillaria.Top

Kinukuha ng git cherry-pick ang mga pagbabago ng isang commit at gumagawa ng bagong commit sa kasalukuyang branch na may parehong diff at mensahe, pero ibang hash. Pumunta sa target na branch at patakbuhin ang git cherry-pick hash; kapag may conflict, ayusin ang mga file, gawin ang git add, at pagkatapos ay git cherry-pick --continue.

git cherry-pick ang naglilipat ng pagbabago ng isang partikular na commit papunta sa kasalukuyang branch, nang hindi sini-merge ang buong branch. Kinukuwenta ng Git ang diff ng napiling commit laban sa parent nito, ina-apply ito sa HEAD ninyo, at gumagawa ng bagong commit: iisang mensahe at author, pero ibang hash, dahil iba ang parent nito.

Karaniwang sitwasyon: sa feature branch, naayos ninyo ang bug, at kailangan ito agad sa release branch kung saan hindi pa handa ang feature. Hindi puwedeng i-merge ang buong branch, pero puwede ang isang commit.

Paano ilipat ang isang commit sa ibang branch

Unahin ang paghahanap ng hash ng commit, tapos lumipat sa branch kung saan ito ilalagay, at patakbuhin ang cherry-pick.

# 1. Hanapin ang commit sa branch na feature
git log --oneline feature
a1b2c3d Ayusin ang division by zero sa kuwenta ng diskuwento
9f8e7d6 Idagdag ang bagong payment screen

# 2. Lumipat sa target na branch
git switch release-1.4

# 3. Ilipat ang commit
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Ayusin ang division by zero sa kuwenta ng diskuwento
 Date: Mon Oct 5 14:12:03 2026 +0800
 1 file changed, 3 insertions(+), 1 deletion(-)

Pansinin: nakuha ng bagong commit ang hash na 4e5f6a7, hindi a1b2c3d. Dalawang magkaibang object ito na may parehong pagbabago. Hindi nagbabago ang orihinal na branch na feature.

Sa halip na hash, puwede kayong magbigay ng anumang reference sa commit: git cherry-pick feature ang kukuha sa huling commit ng feature branch, at git cherry-pick feature~2 ang ikatlo mula sa dulo.

Paano ilipat ang maraming commit

Isa-isang listahan

Maaaring ibigay ang mga hash bilang listahan. Ia-apply ng Git ang mga ito ayon sa pagkakasunod-sunod, at gagawa ng kaparehong bilang ng bagong commit.

git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6

Mahalaga ang pagkakasunod-sunod: kung nakasalalay ang pangalawang commit sa una, pero binaliktad ninyo ang listahan, makakakuha kayo ng conflict o sirang code. Mas ligtas na ilagay mula sa mas luma patungo sa mas bago.

Bilang saklaw

Para sa magkakasunod na commit, may syntax ng saklaw. May bitag dito na nahuhulog halos lahat: ang A..B ay nangangahulugang "mga commit na naaabot mula sa B pero hindi mula sa A", kaya ang A mismo ay hindi kasama sa saklaw.

# Ililipat ang mga commit PAGKATAPOS ng A hanggang B kasama
git cherry-pick A..B

# Ililipat ang A at lahat hanggang B kasama
git cherry-pick A^..B

Kung gusto ninyong ilipat ang lahat ng nasa feature na wala sa main, kapaki-pakinabang ang git cherry-pick main..feature. Pero kung marami ang commit, pag-isipan muna: baka rebase o merge ang kailangan, hindi cherry-pick.

Mga kapaki-pakinabang na flag ng git cherry-pick

FlagAno ang ginagawaKailan kailangan
-xNagdaragdag ng linyang "(cherry picked from commit …)" sa mensaheKapag naglilipat ng ayos sa pagitan ng public branch, para makita ang pinagmulan
-n, --no-commitIna-apply ang pagbabago sa index at working directory nang walang commitKapag gusto ninyong pagsamahin ang ilang commit sa isa, o may ayusin pa bago mag-commit
-e, --editMagbubukas ng editor para ayusin ang mensaheKapag kailangang iakma ang mensahe sa target branch
-s, --signoffNagdaragdag ng linyang Signed-off-byMga project na may DCO requirement
-m 1Tinutukoy ang "pangunahing" parent ng merge commitPaglilipat ng merge commit
--ffInililipat pasulong ang branch kung HEAD ang parent ng napiling commitBihira; iniiwasan ang duplicate
--allow-emptyPinapayagan ang paglilipat ng mga commit na walang laman sa simulaMga technical na walang laman na commit

Bakit kailangan ang -x

Pagkalipas ng anim na buwan, may makakakita sa release branch ng ayos at gustong malaman kung saan ito galing. Ang linyang idinagdag ng -x ang diretsong sagot:

git cherry-pick -x a1b2c3d
git log -1
    Ayusin ang division by zero sa kuwenta ng diskuwento

    (cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)

Gamitin ang -x kapag nai-publish na ang orihinal na commit. Kung galing sa sarili ninyong lokal na branch na bubutasin din ninyo mamaya, walang kabuluhan ang reference, kaya hindi na kailangan ang flag.

Pagsamahin ang ilang commit sa isa: -n

git cherry-pick -n a1b2c3d 7c8d9e0
git status          # nasa index na ang pagbabago ng dalawang commit
git commit -m "Mga ayos sa kuwenta ng diskuwento"

Mga conflict sa cherry-pick at paano ayusin ang mga ito

Lumilitaw ang conflict kapag hindi tumutugma ang pagbabago ng commit sa kasalukuyang code: sa target branch, iba na ang itsura ng parehong mga linya. Hihinto ang Git at ipapaalam ito.

git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Ayusin ang division by zero sa kuwenta ng diskuwento
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".

Tatlong daan ang puwede ninyong piliin pagkatapos nito:

  1. Ayusin at ituloy. Buksan ang file, burahin ang mga marker na <<<<<<<, =======, >>>>>>>, at iwanan ang tamang bersyon. Pagkatapos, git add src/discount.js at git cherry-pick --continue.
  2. Laktawan ang commit. Kapag listahan ang inilipat, lalaktawan ng git cherry-pick --skip ang problemang commit at lilipat sa susunod.
  3. Kanselahin ang lahat. Ibinabalik ng git cherry-pick --abort ang branch sa estado bago ang operasyon.

May git cherry-pick --quit din: itinitigil nito ang operasyon pero iniiwan ang mga commit na nailapat na at ang kasalukuyang estado ng mga file. Kapaki-pakinabang kapag kalahati ng listahan ay nailipat na nang maayos at gusto ninyong magpatuloy nang manwal.

Kung paulit-ulit ang conflict (halimbawa, regular ninyong inililipat ang ayos sa ilang release branch), i-enable ang git config rerere.enabled true: tatandaan ng Git kung paano ninyo inayos ang conflict, at awtomatiko nitong ilalapat ang parehong solusyon sa susunod.

Paano ilipat ang merge commit

May dalawang parent ang merge commit, at hindi malalaman ng Git kung alin ang paghahambingan para sa diff. Kung walang paliwanag, makakakuha kayo ng error:

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

Sinasabi ng flag na -m 1: ihambing sa unang parent, karaniwan ang branch kung saan ito isinama. Sa ganitong paraan, mailipat ninyo sa isang commit ang lahat ng dala ng na-merge na branch.

git cherry-pick -m 1 5d6e7f8

Tandaan: pagkatapos nito, hindi ituturing ng Git na na-merge ang branch. Sa susunod na merge, maaari nitong subukang i-apply ulit ang parehong pagbabago.

git cherry-pick at git apply: ano ang pagkakaiba

Madalas banggitin ang git apply kasama ng cherry-pick, dahil parehong "naglalagay ng pagbabago". Pero magkaiba ang input nila.

git cherry-pickgit apply
PinagmulanCommit na nasa repositoryFile ng patch (diff)
Gumagawa ng commitOo (kung walang -n)Hindi, binabago lang ang mga file (kasama ang index na may --index)
Dala ang author at mensaheOoHindi, wala ito sa patch
ConflictThree-way merge na may markerDefault, tatanggi lang; may --3way, may marker
Kailangan ang shared repositoryOo, dapat available locally ang commitHindi, puwedeng ipasa ang patch sa kahit anong paraan

Halimbawa ng paggamit ng git apply kapag wala sa repository ninyo ang commit: nagpadala ang katrabaho ng diff bilang file:

# Ginagawa ng katrabaho
git diff main..fix-discount > fix.patch

# Kayo ang nagsusuri at nag-a-apply
git apply --check fix.patch   # tingnan kung kakasya ang patch
git apply fix.patch           # ilapat sa working directory
git apply --3way fix.patch    # kung may pagkakaiba, may marker ng conflict

Kung gusto ninyong ipasa ang buong commit, kasama ang author at mensahe, gamitin ang git format-patch at git am: sine-save ng una ang mga commit bilang file, at gumagawa ng commit ang ikalawa mula sa mga ito. Sa esensya, ito ang cherry-pick na "sa pamamagitan ng email".

Puwede ring mag-cherry-pick mula sa ibang repository: idagdag ito bilang remote, patakbuhin ang git fetch, at maa-access na ang mga commit gamit ang hash.

Kailan masamang ideya ang cherry-pick

Gumagawa ng duplicate ang cherry-pick: iisang pagbabago ang nabubuhay sa history sa ilalim ng dalawang hash. Ayos ito sa maliliit na dami, pero may mga sitwasyong nakakasama.

  • Paglilipat ng sampu-sampung commit. Kung halos buong branch ang ililipat, rebase o merge ang tama. Ang cherry-pick ay gagawa ng mahabang history ng duplicate at mas maraming conflict.
  • Paglilipat na paulit-ulit sa dalawang direksyon. Inilipat ang commit mula feature papuntang main, tapos isinama rin ang feature sa main. Kadalasan, nakakaya ito ng Git (magkapareho ang pagbabago), pero kapag binago ang mga linyang iyon pagkatapos ng paglilipat, magkakaroon ng conflict na walang dahilan.
  • Mga nakasalalay na commit. Gumagamit ang commit ng function na idinagdag dalawang commit bago nito. Ililipat lang ng cherry-pick ang mismong commit, at hindi bubuo ang code sa target branch. Laging suriin ang build at test pagkatapos ng paglilipat.

Magandang practice sa hotfix: gawin ang ayos sa pinakamatandang suportadong branch, at i-merge ito pataas sa mga bagong branch. Sa ganitong paraan, exception na lang ang cherry-pick.

Paano i-undo ang cherry-pick

Kung tumatakbo pa ang operasyon (may conflict): git cherry-pick --abort. Kung nagawa na ang commit at hindi pa naipapadala sa server, alisin ito:

git reset --hard HEAD~1

Kung naipadala na sa shared branch ang commit, huwag baguhin ang history: gumawa ng kabaligtarang commit:

git revert 4e5f6a7

At kung nag-reset kayo tapos nagbago ang isip, makikita ang nawalang commit sa git reflog.

Paano malaman kung nailipat na ang commit

Dahil magkaiba ang hash, hindi makakatulong ang karaniwang git branch --contains. Kayang ikumpara ng Git ang mga commit ayon sa nilalaman ng pagbabago (patch-id):

git cherry -v release-1.4 feature
- a1b2c3d Ayusin ang division by zero sa kuwenta ng diskuwento
+ 9f8e7d6 Idagdag ang bagong payment screen

Ang minus ay nangangahulugang may katumbas nang pagbabago sa release-1.4; ang plus ay wala pa. Alternatibo ang git log --cherry-pick --oneline release-1.4...feature, na nagtatago ng magkakambal na commit. Kung ginamit ninyo ang -x, puwede ring maghanap sa mensahe: git log --grep="cherry picked from commit a1b2c3d".

Buod

Ang git cherry-pick ay pang-tiyak na kasangkapan: ilipat ang hotfix sa release, kunin ang kapaki-pakinabang na commit mula sa inabandunang branch, o ayusin ang commit na nagawa sa maling branch. Tatlong bagay ang tandaan: bagong hash ang bagong commit, hindi kasama ang A sa saklaw na A..B, at para sa public na branch, idagdag ang -x. Kung hindi commit kundi diff mula sa file ang ililipat, gamitin ang git apply. Ang rebase, stash, cherry-pick, at tag ay itinuturo nang praktikal sa kursong Git namin.

Mga madalas itanong

Binabago ba ng cherry-pick ang orihinal na branch?

Hindi. Nananatili ang orihinal na commit, at may lalabas na kopya nito na may bagong hash sa kasalukuyang branch.

Puwede bang mag-cherry-pick ng commit mula sa remote branch?

Oo. Patakbuhin ang git fetch, at magiging accessible na ang commit sa pamamagitan ng hash o bilang origin/pangalan-ng-branch, at puwede na itong ibigay sa git cherry-pick.

Bakit iba ang hash ng commit pagkatapos ng cherry-pick?

Nakadepende ang hash sa parent, sa oras ng commit, at sa nilalaman ng tree. Iba ang parent ng kopya at iba rin ang committer date, kaya iba rin ang hash.

Nananatili ba ang author ng commit sa cherry-pick?

Oo, kinukuha ang author at petsa ng authorship mula sa orihinal na commit, at kayo ang nagiging committer na may kasalukuyang petsa.

Ano ang gagawin kapag sinabi ng cherry-pick na walang laman ang commit?

Ibig sabihin, nasa branch na ang mga pagbabagong iyon. Laktawan ito gamit ang git cherry-pick --skip, o i-commit nang walang laman gamit ang git commit --allow-empty.

Pag-aralan ito sa video

Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Git с нуля до уверенного разработчика”.

Pumunta sa kurso