দূরবর্তী শাখা থেকে চেরি-পিক কীভাবে করবেন?


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
ধারণাগতভাবে সবকিছু ঠিক মনে হয়। আপনি কি নিশ্চিত যে আপনি কমিটের সঠিক হ্যাশ (আপনি যেমন এটি বলেছিলেন তেমন স্বাক্ষর) ব্যবহার করছেন? যাচাই করতে 'গিট শো <hash>' চেষ্টা করুন।
0xc0de

হাই, হ্যাঁ পজিটিভ - আমার দুটি শাখা গিথুবে রয়েছে এবং আমি সেগুলি কমিট পৃষ্ঠাগুলি খুঁজে পেতে ব্যবহার করতে পারি। যদি আমি বুঝতে পারি, স্থানীয়ভাবে আমার মেশিনের অবস্থা এমন যে গিট 'জেব্রা' থেকে হ্যাশটি 'মাস্টার' এর প্রসঙ্গে থাকতে পারে না। আমার কি কোনওভাবে এটি বলা দরকার যে 'জেব্রা' স্থানীয়ভাবে উপস্থিত রয়েছে?
ব্যবহারকারী 291701

ওহ এবং 'গিট শো xyz' করা একই ত্রুটি দেয় "মারাত্মক: খারাপ বিষয়"। (এবং আমি জাইজেডকে সঠিক হ্যাশ দিয়ে প্রতিস্থাপন করছি)।
ব্যবহারকারী 291701

এবং স্পষ্ট করার জন্য, আমি আমার 'xyz' হ্যাশটি ইস্যু ছাড়াই গিথুব সম্পর্কিত প্রতিশ্রুতি দেখার জন্য ব্যবহার করতে পারি, যেমন: " github.com/me/test/commit/xyz "।
ব্যবহারকারী 291701

উত্তর:


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
সংরক্ষণাগারভুক্ত লিঙ্ক: আর্কাইভ.মিয়েক.এনএল
ব্লগ

1
গিথুবের উপর একটি আপস্ট্রিম ফিক্স চেরি-পিক করার জন্য এই পদ্ধতির চেষ্টা করে দেখতে পেল যে চেক-আউট হ্যাশটি গিথুবের চেয়ে আলাদা ছিল। অতএব আমাকে চেক আউট করতে হয়েছিল, হ্যাশ এবং চেরি-বাছাই করতে হবে।
ডাস্ট ওল্ফ

1
চেরি-পিকের মতো রিমোটটি পাস করার জন্য এখানে সত্যিই একটি বিকল্প নেই: গিট চেরি-পিক <emote> <hash>
জারেড

রিমোট শাখা আনার পরে ভাল কাজ করেছে। ধন্যবাদ :)
অ্যাডিল

হ্যাঁ আমার জন্য আনার পরেও কাজ করেছিল। গিট চেরি-পিক সম্পর্কে আরও তথ্য atlassian.com/git/tutorials/cherry-pick এ
সতীশ এম

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

যেখানে এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স হ'ল কমিট you


হুম যখন আমি ইতিমধ্যে উজানের পতাকা ছাড়াই রেপো যুক্ত করেছি?
গব্লিন্স

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

প্রথমে আপনার লোকাল ড্রাইভে উভয় শাখার ডেটা টানতে হবে।

যা হচ্ছে তা হচ্ছে শাখা -১ থেকে শাখা-বি-তে চেরি-বাছাই করার চেষ্টা করা, যেখানে আপনি বর্তমানে শাখা-বি-তে রয়েছেন, কিন্তু শাখা -১ এর স্থানীয় কপিটি এখনও আপডেট হয়নি (আপনাকে গিট টানতে হবে উভয় শাখা প্রথমে)।

পদক্ষেপ:
- গিট চেকআউট শাখা-ক
- গিট পুলের মূল শাখা-ক
- গিট চেকআউট শাখা-বি
- গিট পুলের উত্স শাখা-বি
- গিট চেরি-পিক <hash>

আউটপুট:
[শাখা-বি <hash>] লগ ডেটা
লেখক: লেখক <লেখক
1 ফাইল পরিবর্তন হয়েছে, 1 টি সন্নিবেশ (+), 3 মুছে ফেলা (-)


1

টান অনুরোধ কমিট আইডি ট্যাব থেকে প্রতিশ্রুতি আইডি ব্যবহার করার পরে আমি এই ত্রুটিটি ফিরে পেয়েছি। সেই প্রতিশ্রুতিটি পরে স্কোয়াশ করা এবং একীভূত হয়েছিল। গিথব টান অনুরোধে, এই পাঠ্যটি সন্ধান করুন: কমিট ট্যাব থেকে কমিট আইডিগুলি ব্যবহার করার চেষ্টা করার পরিবর্তে "এইগুলিতে কমিট এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স ... একীভূত করুন"।


1

প্রতিশ্রুতি আপনার স্থানীয় উপস্থিত থাকতে হবে, ব্যবহার করে চেক git log

যদি প্রতিশ্রুতি উপস্থিত না থাকে তবে git fetchসর্বশেষতম রিমোট দিয়ে স্থানীয় আপডেট করার চেষ্টা করুন ।


0

এটি সোর্সট্রি দিয়ে সহজেই অর্জন করা যায়:

  • আপনার মাস্টার শাখা চেকআউট করুন
  • "লগ / ইতিহাস" ট্যাবটি খুলুন
  • 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>

অবশেষে গিট (চিরকুট) থেকে চেরি-পিক কল করুন -x হ'ল আপনার চেরি-পিক বার্তাটি মূলটিতে যুক্ত করা। "প্রতিশ্রুতি রেকর্ড করার সময়, এই পরিবর্তনটি যেটি চেরি-বাছাই করা হয়েছে তা নির্দেশ করার জন্য মূল প্রতিশ্রুতি বার্তায়" (চেরি কমিট থেকে নেওয়া ...) "বলে একটি লাইন যুক্ত করুন।

git cherry-pick -x <your hash commit to add to the current branch>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.