গিট চেরি-পিক বলছে "… 38c74d একীভূত তবে কোনও-এম বিকল্প দেওয়া হয়নি"


518

আমি আমার মাস্টার শাখায় কিছু পরিবর্তন করেছি এবং সেগুলি প্রবাহিত করতে চাই। যখন আমি চেরি-বাছাই করে নিম্নলিখিত কমিট করি তবে আমি fd9f578 তে আটকে যাই যেখানে গিট বলে:

$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.

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

এগুলি সেই চুক্তি যা আমি প্রবাহে আনতে চাই।

e7d4cff added some comments...
23e6d2a moved static strings...
44cc65a incorporated test ...
40b83d5 whoops delete whitspace...
24f8a50 implemented global.c...
43651c3 cleaned up ...
068b2fe cleaned up version.c ...
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common
4172caa cleaned up comments in sessions.c ...

উত্তর:


606

চেরি-বাছাইয়ের কাজটি হ'ল পরিবর্তনের পরিবর্তনের প্রতিনিধিত্ব করে (সেই সময়ে কর্মক্ষম গাছ এবং তার পিতামাতার কার্যকারী গাছের মধ্যে পার্থক্য) গ্রহণ করে এবং এটি আপনার বর্তমান শাখায় প্রয়োগ করে।

সুতরাং, যদি কোন প্রতিশ্রুতিবদ্ধের দুটি বা ততোধিক বাবা-মা থাকে, তবে এটি দুটি বা আরও বেশি পার্থক্যের প্রতিনিধিত্ব করে - কোনটি প্রয়োগ করা উচিত?

আপনি চেরি বাছাই করার চেষ্টা করছেন fd9f578, এটি ছিল দুটি পিতা-মাতার সাথে একত্রীকরণ। সুতরাং আপনাকে চেরি-পিক কমান্ডটি বলতে হবে যে -mবিকল্পটি ব্যবহার করে কোনটির বিরুদ্ধে ডিফের গণনা করা উচিত । উদাহরণস্বরূপ, git cherry-pick -m 1 fd9f5781 হিসাবে বেস হিসাবে ব্যবহার করুন।

আপনার নির্দিষ্ট পরিস্থিতির জন্য আমি নিশ্চিত করে বলতে পারি না, তবে এর git mergeপরিবর্তে ব্যবহার git cherry-pickকরা সাধারণত পরামর্শ দেওয়া হয়। আপনি যখন চেরি-বাছাই মার্জ কমিট, এটি ভেঙে পড়লে সব পিতা বা মাতা মধ্যে করা পরিবর্তনগুলি আপনাকে নির্দিষ্ট করেন নি -mযে মধ্যে এক কমিট । আপনি তাদের সমস্ত ইতিহাস হারাবেন এবং তাদের সমস্ত বৈশিষ্ট্য একসাথে গ্লোম করুন। আপনার কল


3
@ উইফু আপনার সম্পর্কেও সম্ভবত শিখানো উচিত git rebase- এটি একীভূত হওয়ার মতো, তবে দুটি শাখা সংহত করার পরিবর্তে এটি একটিটিকে অন্যটির উপরে বসতে প্রতিস্থাপন করে।
বোরিলিড

91
প্যারেন্ট নম্বরটি আপনি কীভাবে জানেন?
অ্যান্ট্রপিক

66
@ অ্যান্ট্রোপিক 1 হ'ল "প্রথম পিতামাতা", 2 হ'ল "দ্বিতীয় পিতামাতা" এবং আরও অনেক কিছু। অর্ডারটি হ'ল যার মধ্যে তারা কমিটের তালিকাভুক্ত হয়েছে (যেমন দেখেছে git showএবং এর মতো)।
বোরিলাইড

2
@lkraav আপনি git reset --hard HEAD@{1}নিজের অনুপস্থিত প্রতিশ্রুতি ফিরিয়ে আনতে সবেমাত্র একটি কাজ করতে পারতেন । git resetইতিহাসে "পিছনে" সরে যেতে সীমাবদ্ধ নয়। git checkout -b mybranch HEAD@{1}কাজ করবে।
বোরিলিড

4
সতর্কতা: git mergeঅনিচ্ছাকৃত পরিণতি হতে পারে। এই কমান্ডটি প্যারেন্ট ব্রাঞ্চে থাকা সমস্ত অন্যান্য (পুরানো) কমিট যুক্ত করবে। সাধারণত লোকেরা চেরি-বাছাই করতে পছন্দ করে কারণ তারা অন্য কমিটগুলি চায় না। আপনি কেবলমাত্র যে পরিবর্তনগুলি চান তা বাস্তবায়ন করছেন তা নিশ্চিত হয়ে নিন!
কে ভি ভি

52

-m অভিভাবক সংখ্যা মানে।

গিট ডক থেকে:

সাধারণত আপনি মার্জটি চেরি বাছাই করতে পারবেন না কারণ আপনি জানেন না যে মার্জটির কোন দিকটি মূললাইন হিসাবে বিবেচনা করা উচিত। এই বিকল্পটি মূল লাইনের প্যারেন্ট নম্বর (1 থেকে শুরু করে) নির্দিষ্ট করে এবং চেরি-পিকটিকে নির্দিষ্ট পিতামাতার সাথে সম্পর্কিত পরিবর্তনটি পুনরায় খেলতে দেয়।

উদাহরণস্বরূপ, যদি আপনার প্রতিশ্রুতিবদ্ধ গাছটি নীচের মতো হয়:

- A - D - E - F -   master
   \     /
    B - C           branch one

তাহলে git cherry-pick Eআপনার মুখোমুখি সমস্যাটি তৈরি হবে।

git cherry-pick E -m 1মানে ব্যবহার করা D-E, যখন git cherry-pick E -m 2ব্যবহার করা মানে B-C-E


32

@ বোরিলিডের উত্তরটি সঠিক, তবে মনে করুন যে আপনি কোনও শাখার সঠিক মার্জিং ইতিহাস সংরক্ষণ করার বিষয়ে চিন্তা করেন না এবং কেবল এটির একটি রৈখিক সংস্করণ চেরি-বেছে নিতে চান। এটি করার জন্য এখানে একটি সহজ এবং নিরাপদ উপায়:

প্রারম্ভিক অবস্থা: আপনি শাখায় রয়েছেন X, এবং আপনি কমিটগুলি চেরি-বাছাই করতে চান Y..Z

  1. git checkout -b tempZ Z
  2. git rebase Y
  3. git checkout -b newX X
  4. git cherry-pick Y..tempZ
  5. (ঐচ্ছিক) git branch -D tempZ

কি এই আছে একটি শাখা তৈরি করা tempZউপর ভিত্তি করে Z, কিন্তু ইতিহাস থেকে সঙ্গে Yঅনওয়ার্ড একরৈখিক, এবং তারপর চেরি-বাছাই করে একটি কপি সম্মুখের এর Xনামক newX। (এটি পরিবর্তনের পরিবর্তে কোনও নতুন শাখায় এটি করা নিরাপদ X)) অবশ্যই চতুর্থ ধাপে দ্বন্দ্ব থাকতে পারে, যা আপনাকে সাধারণ উপায়ে সমাধান করতে হবে ( সে ক্ষেত্রে cherry-pickখুব বেশি কাজ rebaseকরে)। শেষ পর্যন্ত এটি অস্থায়ী tempZশাখা মুছে দেয় ।

যদি পদক্ষেপ 2 বার্তা দেয় "বর্তমান শাখা টেমপ্যাড আপ টু ডেট", তবে Y..Zইতিমধ্যে লিনিয়ার ছিল, তাই কেবলমাত্র সেই বার্তাটিকে উপেক্ষা করুন এবং 3 ধাপ এগিয়ে এগিয়ে যান।

তারপরে পর্যালোচনা করুন newXএবং দেখুন যে এটি আপনি যা চেয়েছিলেন তা করেছে কিনা।

(দ্রষ্টব্য: git rebase Xশাখায় থাকাকালীন এটি সাধারণের মতো Zনয়, কারণ এটি কোনওরকম সম্পর্কের উপর নির্ভর করে না Xএবং Yসাধারণ পূর্বপুরুষের মধ্যেও চুক্তি হতে পারে এবং Yআপনি চাননি))


1
git rebase YবলেছেনCurrent branch tempZ is up to date
বাসিলিভস

আমি মনে করি এর অর্থ Y..Zইতিমধ্যে রৈখিক ছিল। সুতরাং আপনি এই বার্তাটি উপেক্ষা করতে পারেন এবং 3 এবং 4 ধাপে এগিয়ে যেতে পারেন
ডায়রা হপউড

1
আকর্ষণীয় ধারণা, আমি কি কৃতজ্ঞ = ডি চালু ছিল সম্পূর্ণরূপে কাগজে তে এটি আঁকা ছিল
ক্রিস

2
উজ্জ্বল। পুরো রেঞ্জের জন্য গিট চেরি-পিক এই অভিযোগ করেছে যে-এম বিকল্পটি অনুপস্থিত বা এটি সরবরাহ করা হয়েছে। আপনার সমাধানটি সোনার ছিল। (একটি পরামর্শ: এর পরে টেমপ্লেড শাখাটি মুছুন)
ওথিয়াস

1
এটা চমৎকার! আমি চেরি বাছাইয়ের সাথে লড়াই করে যাচ্ছি এবং কেবল এই বোধগম্য। চিঠিগুলি বাছাই করে আমি কিছুটা সমস্যায় পড়েছি (কিছু শাখা এবং কমিট মূলধনী পত্র এবং কিছু শাখা ছোট হাতের অক্ষর)
pcarvalho

19

সহজতর করা. কমিটিকে চেরি-পিক করুন। মার্জটি চেরি-বাছাই করবেন না।

স্বীকৃত উত্তরের পুনর্লিখনটি এখানে সম্ভাব্য পদ্ধতির সুবিধাগুলি / ঝুঁকিগুলি আদর্শভাবে ব্যাখ্যা করে:

আপনি fd9f578 বাছাই করার চেষ্টা করছেন, এটি ছিল দুটি পিতা-মাতার সাথে একত্রীকরণ।

চেরি-বাছাইয়ের পরিবর্তে মার্জ, সহজ জিনিস হ'ল চ্যারিটি আপনি যে মার্জগুলিতে প্রকৃতপক্ষে চান সেই প্রতিশ্রুতিগুলি বেছে নিন।

যেহেতু আপনি ইতিমধ্যে মার্জ হয়ে গেছেন, সম্ভবত আপনার সমস্ত কাঙ্ক্ষিত কমিটগুলি আপনার তালিকায় রয়েছে। সরাসরি তাদের চেরি-বাছাই করুন এবং আপনার মার্জ কমিটের সাথে গণ্ডগোলের দরকার নেই।

ব্যাখ্যা

চেরি-বাছাইয়ের কাজটি হ'ল পরিবর্তনটি প্রতিনিধিত্বকারী ভিন্নতা (সেই সময়ে কার্যক্ষম গাছ এবং তার পিতামাতার কার্যকরী গাছের মধ্যে পার্থক্য) গ্রহণ করে এবং আপনার বর্তমান শাখায় পরিবর্তনটি প্রয়োগ করে।

যদি কোন প্রতিশ্রুতিবদ্ধতার দুটি বা ততোধিক পিতামাত থাকে তবে যেমন একত্রীকরণের ক্ষেত্রে, সেই প্রতিশ্রুতিও দুটি বা আরও বেশি বিভেদগুলিকে উপস্থাপন করে। ত্রুটিটি ঘটেছিল কারণ অনিশ্চয়তার কারণে কোনটি ভিন্ন হয় apply

বিকল্প

যদি আপনি নির্ধারণ করেন যে আপনাকে সংযুক্ত বনাম চেরি-বাছাই সম্পর্কিত কমিটগুলি অন্তর্ভুক্ত করতে হবে, আপনার কাছে দুটি বিকল্প রয়েছে:

  1. (আরও জটিল এবং অস্পষ্ট; ইতিহাসকে ত্যাগ করে) আপনি কোন পিতামাতার প্রয়োগ করা উচিত তা আপনি নির্দেশ করতে পারেন।

    • এটি -mকরার জন্য বিকল্পটি ব্যবহার করুন । উদাহরণস্বরূপ, git cherry-pick -m 1 fd9f578বেস হিসাবে একীভূত তালিকাভুক্ত প্রথম পিতামাতা ব্যবহার করবেন।

    • এছাড়াও যে বিবেচনা যখন আপনি চেরি-বাছাই মার্জ কমিট, এটি ভেঙে পড়লে সব পিতা বা মাতা মধ্যে করা পরিবর্তনগুলি আপনাকে নির্দিষ্ট করেন নি -mযে মধ্যে এক কমিট । আপনি তাদের সমস্ত ইতিহাস হারাবেন এবং তাদের সমস্ত বৈশিষ্ট্য একসাথে গ্লোম করুন। আপনার কল

  2. (সহজ এবং আরও পরিচিত; ইতিহাস সংরক্ষণ করে) আপনি এর git mergeপরিবর্তে ব্যবহার করতে পারেন git cherry-pick

    • যেমনটি যথারীতি git merge, এটি আপনি যে শাখায় মার্জ হয়ে যাচ্ছেন সেখানে উপস্থিত সমস্ত প্রতিশ্রুতি প্রয়োগ করার চেষ্টা করবে এবং এগুলি আপনার গিট লগে পৃথকভাবে তালিকাভুক্ত করবে।

2

একক প্রতিশ্রুতি বাছাই করার জন্য @ দাইরা হপউড পদ্ধতির সরলকরণ good কোন অস্থায়ী শাখা প্রয়োজন।

লেখকের ক্ষেত্রে:

  • জেড প্রতিশ্রুতিবদ্ধ (fd9f578)
  • ওয়াই এর আগে প্রতিশ্রুতিবদ্ধ
  • এক্স বর্তমান কার্যকারী শাখা

তারপরে:

git checkout Z   # move HEAD to wanted commit
git reset Y      # have Z as changes in working tree
git stash        # save Z in stash
git checkout X   # return to working branch
git stash pop    # apply Z to current branch
git commit -a    # do commit

2
এটি অবশ্যই মূল অঙ্গীকারের সাথে যুক্ত মেটাডেটা হারাবে। আমি অনুমান করি যে এটি সহজ কিনা তা মতের একটি বিষয়। আমি কখনও কখনও এটি ব্যবহার করি যখন আমি মেটাডেটাটি হারাতে চাই এবং কেবল সামগ্রিক কোড পরিবর্তন রাখি। মনে রাখবেন যে ওয়াই জেডের তাত্ক্ষণিক অভিভাবক না হলেও এটি কাজ করে (এই ক্ষেত্রে পরিবর্তনগুলি স্কোয়াশ করা হবে)।
দাইরা হপউড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.