git cherry-pick: ஒரு commit-ஐ வேறொரு கிளைக்கு மாற்றுவது எப்படி
git cherry-pick குறிப்பிட்ட commit-இன் மாற்றங்களை எடுத்து நடப்புக் கிளையில் அதே diff மற்றும் செய்தியுடன், வேறு hash கொண்ட புதிய commit-ஐ உருவாக்குகிறது. இலக்குக் கிளைக்குச் சென்று git cherry-pick <hash> இயக்கவும்; முரண்பாடு வந்தால் கோப்புகளைச் சரிசெய்து git add, பின்னர் git cherry-pick --continue.
git cherry-pick ஒரு குறிப்பிட்ட commit-இன் மாற்றங்களை நடப்புக் கிளைக்கு மாற்றுகிறது; முழுக் கிளையையும் இணைப்பதில்லை. Git தேர்ந்த commit-இன் diff-ஐ அதன் பெற்றோருடன் ஒப்பிட்டுக் கணக்கிடுகிறது, அதை உங்கள் HEAD-க்குப் பயன்படுத்தி புதிய commit உருவாக்குகிறது — அதே செய்தி மற்றும் ஆசிரியருடன், ஆனால் வேறு hash-உடன், ஏனெனில் அதன் பெற்றோர் வேறு.
வழக்கமான சூழ்நிலை: feature கிளையில் ஒரு பிழையைச் சரிசெய்தீர்கள், அந்தத் திருத்தம் அவசரமாக release கிளைக்குத் தேவை, அங்கே feature இன்னும் தயாராகவில்லை. முழுக் கிளையை இணைக்க முடியாது, ஒரு commit-ஐ மட்டும் மாற்றலாம்.
ஒரு commit-ஐ வேறு கிளைக்கு மாற்றுவது
முதலில் தேவையான commit-இன் hash-ஐக் கண்டுபிடியுங்கள்; பின்னர் அதை எங்கு மாற்ற வேண்டுமோ அந்தக் கிளைக்குச் சென்று cherry-pick இயக்குங்கள்.
# 1. Находим коммит в ветке feature
git log --oneline feature
a1b2c3d Исправить деление на ноль в расчёте скидки
9f8e7d6 Добавить новый экран оплаты
# 2. Переходим в целевую ветку
git switch release-1.4
# 3. Переносим коммит
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Исправить деление на ноль в расчёте скидки
Date: Mon Oct 5 14:12:03 2026 +0300
1 file changed, 3 insertions(+), 1 deletion(-)
கவனியுங்கள்: புதிய commit 4e5f6a7 hash-ஐப் பெற்றது, a1b2c3d அல்ல. இவை ஒரே மாற்றங்களைக் கொண்ட இரண்டு வெவ்வேறு பொருட்கள். மூலக் கிளை feature மாறவில்லை.
Hash-க்குப் பதிலாக commit-ஐச் சுட்டும் எந்தக் குறிப்பையும் கொடுக்கலாம்: git cherry-pick feature கிளையின் கடைசி commit-ஐ எடுக்கும், git cherry-pick feature~2 கடைசியிலிருந்து மூன்றாவதை எடுக்கும்.
பல commit-களை மாற்றுவது
பட்டியலாகக் கொடுப்பது
Hash-களை பட்டியலாகக் கொடுக்கலாம் — Git அவற்றை குறிப்பிட்ட வரிசையில் பயன்படுத்தி அதே எண்ணிக்கையில் புதிய commit-களை உருவாக்கும்.
git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6
வரிசை முக்கியம்: இரண்டாவது commit முதலாவதைச் சார்ந்திருந்தாலும் நீங்கள் அவற்றை மாற்றிக் கொடுத்தால், முரண்பாடு அல்லது உடைந்த குறியீடு வரும். பழையதிலிருந்து புதியதற்கு வரிசையாகக் கொடுப்பது பாதுகாப்பானது.
வரம்பாகக் கொடுப்பது
அடுத்தடுத்த commit-களுக்கு வரம்புத் தொடரியல் பயன்படுத்தப்படுகிறது. இங்கே கிட்டத்தட்ட அனைவரும் தடுமாறும் ஒரு பொறி உள்ளது: A..B என்றால் "B-இலிருந்து அடையக்கூடியவை, ஆனால் A-விலிருந்து அல்லாதவை", அதாவது A தானே வரம்பில் சேராது.
# Перенесёт коммиты ПОСЛЕ A вплоть до B включительно
git cherry-pick A..B
# Перенесёт A и всё до B включительно
git cherry-pick A^..B
feature-இல் உள்ள, main-இல் இல்லாத அனைத்தையும் மாற்ற git cherry-pick main..feature வசதியானது. ஆனால் commit-கள் பல என்றால் சிந்தியுங்கள்: உங்களுக்கு rebase அல்லது merge தேவைப்படலாம், cherry-pick அல்ல.
cherry-pick-இன் பயனுள்ள கொடிகள்
| கொடி | என்ன செய்கிறது | எப்போது தேவை |
|---|---|---|
-x | செய்தியில் «(cherry picked from commit …)» வரியைச் சேர்க்கும் | பொது கிளைகளுக்கு இடையே திருத்தங்களை மாற்றும்போது — மூலம் தெரியும் |
-n, --no-commit | commit செய்யாமல் மாற்றங்களை index-இலும் வேலை அடைவிலும் பயன்படுத்தும் | பல commit-களை ஒன்றாக்க அல்லது commit-க்கு முன் திருத்த |
-e, --edit | செய்தியைத் திருத்த எடிட்டரைத் திறக்கும் | இலக்குக் கிளைக்கேற்ப செய்தியைத் தெளிவாக்க |
-s, --signoff | Signed-off-by வரியைச் சேர்க்கும் | DCO தேவைப்படும் திட்டங்கள் |
-m 1 | இணைப்பு commit-க்கு "முதன்மை" பெற்றோரைக் குறிப்பிடும் | இணைப்பு commit-ஐ மாற்ற |
--ff | HEAD தேர்ந்த commit-இன் பெற்றோராக இருந்தால் கிளையை முன்னோக்கி நகர்த்தும் | அரிதாக; நகல் உருவாகாமல் தடுக்க |
--allow-empty | ஆரம்பத்திலேயே காலியான commit-களை மாற்ற அனுமதிக்கும் | சேவை நோக்கத்திற்கான காலி commit-கள் |
-x ஏன் தேவை
ஆறு மாதங்கள் கழித்து யாரோ release கிளையில் ஒரு திருத்தத்தைப் பார்த்து அது எங்கிருந்து வந்தது என்று அறிய விரும்புவார்கள். -x சேர்க்கும் வரி நேரடி பதிலைத் தரும்:
git cherry-pick -x a1b2c3d
git log -1
Исправить деление на ноль в расчёте скидки
(cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)
மூலக் commit ஏற்கனவே பொதுவில் இருந்தால் -x பயன்படுத்துங்கள். நீங்கள் பின்னர் நீக்கப் போகும் உங்கள் உள்ளூர் கிளையிலிருந்து மாற்றினால் குறிப்பு எங்கும் செல்லாது — அங்கே கொடி தேவையில்லை.
பல commit-களை ஒன்றாக்குவது: -n
git cherry-pick -n a1b2c3d 7c8d9e0
git status # изменения обоих коммитов в индексе
git commit -m "Исправления расчёта скидки"
cherry-pick-இல் முரண்பாடுகள் மற்றும் அவற்றின் தீர்வு
Commit-இன் மாற்றங்கள் தற்போதைய குறியீட்டுடன் பொருந்தாதபோது முரண்பாடு வரும்: இலக்குக் கிளையில் அதே வரிகள் ஏற்கனவே வேறு விதமாக இருக்கும். Git நின்று அதைத் தெரிவிக்கும்.
git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Исправить деление на ноль в расчёте скидки
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
அதன் பின் மூன்று வழிகள்:
- தீர்த்து தொடர்வது. கோப்பைத் திறந்து
<<<<<<<,=======,>>>>>>>குறிகளை நீக்கி சரியான பதிப்பை வைத்திருங்கள், பின்னர்git add src/discount.jsமற்றும்git cherry-pick --continue. - commit-ஐத் தவிர்ப்பது. பட்டியலை மாற்றும்போது
git cherry-pick --skipபிரச்சினைக்குரிய commit-ஐத் தவிர்த்து அடுத்ததற்குச் செல்லும். - எல்லாவற்றையும் ரத்து செய்வது.
git cherry-pick --abortகிளையை செயல்பாட்டுக்கு முந்தைய நிலைக்குத் திருப்பும்.
இன்னும் git cherry-pick --quit உள்ளது: அது செயல்பாட்டை நிறுத்தும், ஆனால் ஏற்கனவே பயன்படுத்தப்பட்ட commit-களையும் தற்போதைய கோப்பு நிலையையும் வைத்திருக்கும். பட்டியலில் பாதியை வெற்றிகரமாக மாற்றி மீதியை கைமுறையாகச் செய்ய விரும்பும்போது பயனுள்ளது.
முரண்பாடுகள் மீண்டும் மீண்டும் வந்தால் (எ.கா. பல release கிளைகளுக்கு அடிக்கடி திருத்தங்களை மாற்றினால்), git config rerere.enabled true இயக்குங்கள் — Git நீங்கள் முரண்பாட்டை எப்படித் தீர்த்தீர்கள் என்று நினைவில் வைத்து அடுத்த முறை தானாக அதே தீர்வைப் பயன்படுத்தும்.
இணைப்பு commit-ஐ மாற்றுவது
இணைப்பு commit-க்கு இரண்டு பெற்றோர்கள் உண்டு; எதற்கு எதிராக diff கணக்கிடுவது என்று Git அறியாது. குறிப்பு இல்லாவிட்டால் பிழை வரும்:
git cherry-pick 5d6e7f8
error: commit 5d6e7f8 is a merge but no -m option was given.
-m 1 கொடி சொல்கிறது: முதல் பெற்றோருடன் ஒப்பிட்டு மாற்றங்களைக் கணக்கிடு — பொதுவாக இணைக்கப்பட்ட கிளையைக் குறிக்கும் பெற்றோர். அப்போது இணைக்கப்பட்ட கிளை பெற்ற அனைத்து மாற்றங்களும் ஒரே commit-ஆக வரும்.
git cherry-pick -m 1 5d6e7f8
இதன் பின் Git அந்தக் கிளையை இணைக்கப்பட்டதாகக் கருதாது: எதிர்கால merge-இல் அதே மாற்றங்களை மீண்டும் பயன்படுத்த முயலலாம்.
git cherry-pick மற்றும் git apply: வேறுபாடு
git apply அடிக்கடி cherry-pick-உடன் நினைவுகூரப்படுகிறது, ஏனெனில் இரண்டும் "மாற்றங்களைப் பொருத்துகின்றன". ஆனால் அவை வேறுபட்ட உள்ளீடுகளுடன் வேலை செய்கின்றன.
| git cherry-pick | git apply | |
|---|---|---|
| மூலம் | களஞ்சியத்தில் உள்ள commit | patch கோப்பு (diff) |
| commit உருவாக்குகிறதா | ஆம் (-n இல்லாவிட்டால்) | இல்லை, கோப்புகளை மட்டும் மாற்றும் (--index உடன் index-உம்) |
| ஆசிரியர் மற்றும் செய்தியைப் பாதுகாக்கிறதா | ஆம் | இல்லை, patch-இல் அவை இல்லை |
| முரண்பாடுகள் | குறிகளுடன் மூன்று-பக்க இணைப்பு | இயல்பாக வெறும் மறுப்பு; --3way உடன் குறிகள் |
| பொது களஞ்சியம் தேவையா | ஆம், commit உள்ளூரில் கிடைக்க வேண்டும் | இல்லை, patch-ஐ எப்படியும் அனுப்பலாம் |
Commit உங்கள் களஞ்சியத்தில் இல்லாதபோது git apply எடுத்துக்காட்டு — சக ஊழியர் diff-ஐ கோப்பாக அனுப்பியிருக்கிறார்:
# Коллега делает
git diff main..fix-discount > fix.patch
# Вы проверяете и применяете
git apply --check fix.patch # проверить, ляжет ли патч
git apply fix.patch # применить к рабочей директории
git apply --3way fix.patch # при расхождениях — с маркерами конфликтов
Commit-ஐ ஆசிரியர் மற்றும் செய்தியுடன் முழுமையாக அனுப்ப வேண்டுமென்றால், git format-patch மற்றும் git am ஜோடியைப் பயன்படுத்துங்கள்: முதலாவது commit-களை கோப்புகளாகச் சேமிக்கும், இரண்டாவது அவற்றிலிருந்து commit-களை உருவாக்கும். இது அடிப்படையில் "மின்னஞ்சல் வழியாக cherry-pick".
மற்றொரு களஞ்சியத்திலிருந்தும் cherry-pick செய்யலாம்: அதை remote ஆகச் சேர்த்து git fetch இயக்குங்கள், commit-கள் hash மூலம் கிடைக்கும்.
cherry-pick எப்போது கெட்ட யோசனை
Cherry-pick நகல்களை உருவாக்குகிறது: ஒரே மாற்றம் வரலாற்றில் இரண்டு hash-களுடன் வாழ்கிறது. சிறிய அளவில் இது இயல்பானது, ஆனால் சில சூழ்நிலைகளில் அது கேடு விளைவிக்கும்.
- டஜன் கணக்கான commit-களை மாற்றுவது. கிளையின் கிட்டத்தட்ட முழுவதையும் மாற்றினால் அது rebase அல்லது merge. Cherry-pick நீண்ட நகல் வரலாற்றையும் அதிக முரண்பாடுகளையும் தரும்.
- இரு திசைகளில் மாற்றங்கள். ஒரு commit feature-இலிருந்து main-க்கு மாற்றப்பட்டு, பின்னர் feature main-உடன் இணைக்கப்பட்டால், Git பொதுவாக சமாளிக்கும் (மாற்றங்கள் ஒன்றாக இருக்கும்). ஆனால் மாற்றிய பின் அதே வரிகள் திருத்தப்பட்டிருந்தால், எதிர்பாராத இடத்தில் முரண்பாடு வரும்.
- சார்ந்த commit-கள். ஒரு commit, இரண்டு commit-களுக்கு முன் சேர்க்கப்பட்ட செயல்பாட்டைப் பயன்படுத்துகிறது. Cherry-pick அந்த commit-ஐ மட்டும் மாற்றும், இலக்குக் கிளையில் குறியீடு build ஆகாது. மாற்றிய பின் எப்போதும் build மற்றும் சோதனைகளைச் சரிபாருங்கள்.
Hotfix-களுக்கு நல்ல பழக்கம்: திருத்தத்தை ஆதரிக்கப்படும் பழமையான கிளையிலேயே உடனே செய்து, அதைப் புதிய கிளைகளுக்கு "மேலே" இணையுங்கள். அப்போது cherry-pick விதிவிலக்காக மட்டுமே தேவைப்படும்.
cherry-pick-ஐ ரத்து செய்வது
செயல்பாடு இன்னும் நடந்துகொண்டிருந்தால் (முரண்பாடு) — git cherry-pick --abort. Commit ஏற்கனவே உருவாகி சேவையகத்திற்கு அனுப்பப்படவில்லையென்றால், அதை அகற்றுங்கள்:
git reset --hard HEAD~1
Commit ஏற்கனவே பகிரப்பட்ட கிளைக்கு அனுப்பப்பட்டிருந்தால் வரலாற்றை மீண்டும் எழுதக் கூடாது — எதிர் commit உருவாக்குங்கள்:
git revert 4e5f6a7
நீங்கள் reset செய்து மனம் மாறினால், தொலைந்த commit-ஐ git reflog மூலம் கண்டுபிடிக்கலாம்.
Commit ஏற்கனவே மாற்றப்பட்டுவிட்டதா என்று சரிபார்ப்பது
Hash-கள் வேறுபடுவதால், சாதாரண git branch --contains உதவாது. Git மாற்றங்களின் உள்ளடக்கத்தின் அடிப்படையில் (patch-id) commit-களை ஒப்பிட முடியும்:
git cherry -v release-1.4 feature
- a1b2c3d Исправить деление на ноль в расчёте скидки
+ 9f8e7d6 Добавить новый экран оплаты
கழித்தல் குறி என்றால் release-1.4-இல் சமமான மாற்றம் ஏற்கனவே உள்ளது; கூட்டல் குறி என்றால் இன்னும் இல்லை. மாற்று: git log --cherry-pick --oneline release-1.4...feature இரட்டைக் commit-களை மறைக்கும். -x பயன்படுத்தியிருந்தால், செய்தியின் மூலம் தேடலாம்: git log --grep="cherry picked from commit a1b2c3d".
சுருக்கம்
git cherry-pick ஒரு துல்லியமான கருவி: ஒரு hotfix-ஐ release-க்கு மாற்ற, கைவிடப்பட்ட கிளையிலிருந்து பயனுள்ள commit-ஐ எடுக்க, தவறான கிளையில் செய்த commit-ஐ சரிசெய்ய. மூன்று விஷயங்களை நினைவில் வையுங்கள்: புதிய commit புதிய hash பெறும், A..B வரம்பு A-ஐ உள்ளடக்காது, பொது கிளைகளுக்கு -x சேர்ப்பது நல்லது. Commit அல்ல, கோப்பிலிருந்து diff-ஐ மாற்ற வேண்டுமென்றால் git apply-ஐ எடுங்கள். Rebase, stash, cherry-pick மற்றும் tag-கள் Git பாடநெறியில் நடைமுறையில் விரிவாக விளக்கப்பட்டுள்ளன.
அடிக்கடி கேட்கப்படும் கேள்விகள்
Cherry-pick மூலக் கிளையை மாற்றுமா?
இல்லை. மூல commit அப்படியே இருக்கும்; நடப்புக் கிளையில் புதிய hash-உடன் அதன் நகல் தோன்றும்.
தொலைநிலைக் கிளையிலிருந்து commit-ஐ cherry-pick செய்ய முடியுமா?
முடியும். <code>git fetch</code> இயக்குங்கள்; பின்னர் commit hash மூலமோ <code>origin/கிளை-பெயர்</code> மூலமோ கிடைக்கும், அதை <code>git cherry-pick</code>-க்குக் கொடுக்கலாம்.
cherry-pick-க்குப் பிறகு commit-இன் hash ஏன் வேறு?
Hash பெற்றோர், commit நேரம் மற்றும் மரத்தின் உள்ளடக்கத்தைச் சார்ந்தது. நகலுக்குப் பெற்றோரும் commiter நேரமும் வேறு என்பதால் hash-உம் வேறு.
cherry-pick-இல் commit-இன் ஆசிரியர் மாறுமா?
இல்லை, ஆசிரியர் மற்றும் ஆசிரியர் தேதி மூல commit-இலிருந்து வரும்; committer ஆக நீங்கள் இன்றைய தேதியுடன் இருப்பீர்கள்.
cherry-pick கூறினால் commit காலியானது என்றால் என்ன செய்வது?
அந்த மாற்றங்கள் கிளையில் ஏற்கனவே உள்ளன. <code>git cherry-pick --skip</code> மூலம் தவிர்க்கலாம், அல்லது <code>git commit --allow-empty</code> மூலம் காலியாகப் பதிவு செய்யலாம்.
“கிட்: ஆரம்பம் முதல் நம்பிக்கையான டெவலப்பர் வரை” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.
பாடநெறிக்குச் செல்