வழிகாட்டி

git cherry-pick: ஒரு commit-ஐ வேறொரு கிளைக்கு மாற்றுவது எப்படி

புதுப்பிக்கப்பட்டது: · Skillaria.Top

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-commitcommit செய்யாமல் மாற்றங்களை index-இலும் வேலை அடைவிலும் பயன்படுத்தும்பல commit-களை ஒன்றாக்க அல்லது commit-க்கு முன் திருத்த
-e, --editசெய்தியைத் திருத்த எடிட்டரைத் திறக்கும்இலக்குக் கிளைக்கேற்ப செய்தியைத் தெளிவாக்க
-s, --signoffSigned-off-by வரியைச் சேர்க்கும்DCO தேவைப்படும் திட்டங்கள்
-m 1இணைப்பு commit-க்கு "முதன்மை" பெற்றோரைக் குறிப்பிடும்இணைப்பு commit-ஐ மாற்ற
--ffHEAD தேர்ந்த 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".

அதன் பின் மூன்று வழிகள்:

  1. தீர்த்து தொடர்வது. கோப்பைத் திறந்து <<<<<<<, =======, >>>>>>> குறிகளை நீக்கி சரியான பதிப்பை வைத்திருங்கள், பின்னர் git add src/discount.js மற்றும் git cherry-pick --continue.
  2. commit-ஐத் தவிர்ப்பது. பட்டியலை மாற்றும்போது git cherry-pick --skip பிரச்சினைக்குரிய commit-ஐத் தவிர்த்து அடுத்ததற்குச் செல்லும்.
  3. எல்லாவற்றையும் ரத்து செய்வது. 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-pickgit apply
மூலம்களஞ்சியத்தில் உள்ள commitpatch கோப்பு (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> மூலம் காலியாகப் பதிவு செய்யலாம்.

இந்தத் தலைப்பை வீடியோவில் கற்றுக்கொள்ளுங்கள்

“கிட்: ஆரம்பம் முதல் நம்பிக்கையான டெவலப்பர் வரை” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.

பாடநெறிக்குச் செல்