एक दूरस्थ शाखा से चेरी-पिक कैसे करें?


135

मुझे चेरी-पिक करने में परेशानी हो रही है। अपनी स्थानीय मशीन पर, मैं वर्तमान में अपनी "मास्टर" शाखा पर हूं। मैं "ज़ेबरा" नाम की एक अन्य शाखा से एक कमिटमेंट में चेरी-पिक करना चाहता हूं। "ज़ेबरा" शाखा एक दूरस्थ शाखा है।

तो स्थिति

# On branch master
nothing to commit (working directory clean)

ठीक है, अब मैं अपनी इच्छा के अनुसार चेरी को लेने की कोशिश करता हूं:

git cherry-pick xyz
fatal: bad object xyz

जहां "xyz" उस कमिटमेंट पर हस्ताक्षर करता है जिसमें मैं दिलचस्पी रखता हूं, जो कि शाखा "ज़ेबरा" पर हुआ।

तो पहला स्पष्ट सवाल यह है कि मैं जिस संदर्भ का उल्लेख कर रहा हूं उसे क्यों नहीं खोज सकते? मैं वास्तव में यह नहीं समझता कि ईमानदार होने के लिए पहली जगह में यह कैसे काम कर रहा है। क्या अन्य सभी शाखाओं के लिए, मेरे वर्किंग डायरेक्टरी में स्थानीय रूप से कमिट्स के डेटाबेस की तरह कुछ स्टोर होता है? जब चेरी-पिक कमांड को निष्पादित करते हैं, तो क्या वह उस स्थानीय डेटाबेस को खोजता है और उस प्रतिबद्ध को ढूंढता है जिसके बारे में मैं बात कर रहा हूं?

चूंकि "ज़ेबरा" एक दूरस्थ शाखा है, मैं सोच रहा था कि मेरे पास इसका डेटा स्थानीय स्तर पर नहीं है। इसलिए मैंने शाखाओं को बदल दिया:

git checkout zebra
Switched to branch 'zebra'

इसलिए अब अपनी स्थानीय मशीन पर, मैं देख सकता हूं कि निर्देशिका में फाइलें ज़ेबरा की स्थिति को सही ढंग से दर्शाती हैं। मैं मास्टर पर वापस जाता हूं, फिर से चेरी लेने की कोशिश करता हूं (उम्मीद है कि अभी कमिट डेटा उपलब्ध है), लेकिन मुझे भी यही समस्या है।

मुझे यहां जो कुछ चल रहा है, उसकी एक गलतफहमी मिली है, कोई भी मदद बहुत अच्छी होगी।


2
वैचारिक रूप से सब कुछ सही लगता है। क्या आप सुनिश्चित हैं कि आप सही हैश (हस्ताक्षर के रूप में आप इसे कहते हैं) का उपयोग कर रहे हैं? सत्यापित करने के लिए 'git show <हैश>' आज़माएँ।
0xc0de

हाय, हाँ सकारात्मक - मेरी दोनों शाखाएँ गितुब पर हैं, और मैं उन्हें इस तरह से प्रतिबद्ध पृष्ठों को खोजने के लिए उपयोग कर सकता हूं। अगर मुझे समझ में आता है, तो स्थानीय रूप से मेरी मशीन की स्थिति ऐसी है कि 'मास्टर' के संदर्भ में git को 'ज़ेबरा' से हैश नहीं मिल सकता है। क्या मुझे किसी तरह यह बताने की जरूरत है कि 'ज़ेबरा' स्थानीय स्तर पर भी मौजूद है?
user291701

ओह और 'git show xyz' करना एक ही त्रुटि "घातक: बुरी वस्तु" देता है। (और मैं सही हैश के साथ xyz की जगह ले रहा हूं)।
user291701

और स्पष्ट करने के लिए, मैं अपने 'xyz' हैश का उपयोग बिना मुद्दे के गीथब पर प्रतिबद्ध देखने के लिए कर सकता हूं, जैसे: " github.com/me/test/commit/xyz "।
user291701

जवाबों:


195

चूंकि "ज़ेबरा" एक दूरस्थ शाखा है, मैं सोच रहा था कि मेरे पास इसका डेटा स्थानीय स्तर पर नहीं है।

आप सही हैं कि आपके पास सही डेटा नहीं है, लेकिन इसे गलत तरीके से हल करने का प्रयास किया गया है। दूरस्थ स्रोत से स्थानीय रूप से डेटा एकत्र करने के लिए, आपको उपयोग करने की आवश्यकता है git fetch। जब आपने git checkout zebraउस शाखा की स्थिति पर स्विच किया था, तो आखिरी बार जब आप लाए थे। इसलिए पहले दूरस्थ से प्राप्त करें:

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz

1
संग्रहीत लिंक: archive.miek.nl/blog/archives/2011/12/13/...
brianpeiris

1
जीथुब पर एक अपस्ट्रीम फिक्स को चेरी-पिक करने के लिए इस दृष्टिकोण की कोशिश की और यह पता चला कि चेक-आउट हैश गिथूब पर एक से अलग था। इसलिए मुझे जांच करनी पड़ी, हैश और चेरी चुनें।
डस्टवॉल्फ

1
वास्तव में यहाँ चेरी-पिक में रिमोट पास करने का एक विकल्प याद आ रहा है जैसे: git चेरी-पिक <रिमोट> <हैश>
Jared

दूरस्थ शाखा लाने के बाद अच्छी तरह से काम किया। धन्यवाद :)
Adeel

हाँ मेरे लिए भी लाने के बाद काम किया। Git cherry-pick के बारे में अधिक जानकारी के लिए उपलब्ध है atlassian.com/git/tutorials/cherry-pick
Satheesh M

12

ओपी के लिए एक परिशिष्ट के रूप में स्वीकृत उत्तर:

अगर आप के साथ समस्या है

fatal: bad object xxxxx

ऐसा इसलिए है क्योंकि आपके पास उस कमिट तक पहुंच नहीं है। जिसका अर्थ है कि आपके पास स्थानीय रूप से संग्रहीत रेपो नहीं है। फिर:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

जहाँ xxxxxxx आप चाहते हैं प्रतिबद्ध हैश है।


हम्म जब मैं पहले से ही ऊपर के झंडे के बिना रेपो जोड़ दिया?
गोबलींस

10

रिमोट रेपो ("फू" के रूप में) जोड़ना जिससे हम चेरी-पिक करना चाहते हैं

$ git remote add foo git://github.com/foo/bar.git

उनकी शाखाओं को प्राप्त करें

$ git fetch foo

उनके कमिट्स की सूची बनाएं (यह सभी कमिटेड को लिस्ट में लाना चाहिए foo)

$ git log foo/master

चेरी-आप की जरूरत प्रतिबद्ध उठाओ

$ git cherry-pick 97fedac

5

एक विकास शाखा को मास्टर करने के लिए विलय के बाद, मैं आमतौर पर विकास शाखा को हटा देता हूं। हालांकि, अगर मैं विकास शाखा में कमिट्स को चेरी करना चाहता हूं, तो मुझे "खराब ऑब्जेक्ट" त्रुटि से बचने के लिए मर्ज कमिट हैश का उपयोग करना होगा।


3

पहले अपने स्थानीय ड्राइव पर दोनों शाखा डेटा खींचने की जरूरत है।

क्या हो रहा है, आप शाखा-ए से शाखा-बी में चेरी-पिक करने की कोशिश कर रहे हैं, जहां आप वर्तमान में शाखा-बी पर हैं, लेकिन शाखा-ए की स्थानीय प्रतिलिपि अभी तक अपडेट नहीं की गई है (आपको एक गिट पुल पर प्रदर्शन करने की आवश्यकता है दोनों शाखाएं पहले)।

चरण:
- गिट चेकआउट शाखा-ए
- गिट पुल मूल शाखा-ए
- गिट चेकआउट शाखा-बी
- गिट पुल मूल शाखा-बी
- गिट चेरी-पिक <हैश>

आउटपुट:
[ब्रांच-बी <हैश>] लॉग डेटा
लेखक: लेखक <लेखक
१ फ़ाइल बदली, १ प्रविष्टि (+), ३ विलोपन (-)


1

मुझे यह त्रुटि एक पुल अनुरोध कमेट आईडी आईडी से प्रतिबद्ध आईडी का उपयोग करने के बाद लौटा दी गई थी। बाद में उस प्रतिबद्ध को हटा दिया गया और विलय कर दिया गया। जीथब पुल अनुरोध में, इस पाठ को देखें: "कमिटेड xxxxxxx इन ..." के बजाय कमिट टैब से कमिट आईडी का उपयोग करने का प्रयास करें।


1

प्रतिबद्ध आपके स्थानीय में मौजूद होना चाहिए, का उपयोग करके जांचें git log

यदि कमिट मौजूद नहीं है, तो git fetchस्थानीय को नवीनतम रिमोट से अपडेट करने का प्रयास करें।


0

यह भी आसानी से SourceTree के साथ हासिल किया जा सकता है:

  • अपनी मास्टर शाखा को चेकआउट करें
  • "लॉग / इतिहास" टैब खोलें
  • xyz कमिट का पता लगाएं और उस पर राइट क्लिक करें
  • "मर्ज ..." पर क्लिक करें

किया हुआ :)


यह गलत है। क्योंकि अब आप केवल चयनित कमिट्स के बजाय मास्टर ऑफ हेड को ज़ेबरा में विलय कर रहे हैं।
शेफ फिरौन

0

यदि आप प्राप्त कर चुके हैं, फिर भी यह अभी भी होता है, निम्नलिखित एक कारण हो सकता है।

ऐसा हो सकता है कि आप जिस कमिटमेंट को चुनने की कोशिश कर रहे हैं, वह अब किसी शाखा से संबंधित नहीं है। ऐसा तब हो सकता है जब आप रिबेट करते हैं।

ऐसे मामले में, दूरस्थ रेपो में:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

फिर अपने रेपो में, फिर से लाओ। उस प्रतिबद्ध सहित नई शाखा को लाया जाएगा।


0

मैं चेरी लेने के लिए प्रतिबद्ध के साथ शाखा पर जाकर इस मुद्दे को हल किया।

git checkout <branch With Commit To Cherry-Pick>

प्रतिबद्ध हैश खोजने के लिए लॉग का उपयोग करें

git log

जब आपने अपना हैश कट और नोट पैड पर चिपका दिया हो। यदि कमांड का उपयोग करते हुए बस हैश प्राप्त करने के लिए स्क्रॉल करें, तो उस शाखा की जांच करें जिसे आप कमिट में रखना चाहते हैं।

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

आखिरकार git (नोट) से चेरी-पिक को बुलाओ -x अपने चेरी-पिक संदेश को मूल में जोड़ना है। "कमिट करते समय, एक पंक्ति को जोड़ते हैं जो कहती है" (चेरी को कमिट से उठाया गया ...) "मूल प्रतिबद्ध संदेश में यह इंगित करने के लिए कि यह परिवर्तन चेरी से चुना गया था।"

git cherry-pick -x <your hash commit to add to the current branch>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.