চেরি-পিক কাজের পরে গিট কীভাবে একীভূত হবে?


190

আসুন কল্পনা করুন যে আমাদের একটি masterশাখা রয়েছে।

তারপরে আমরা একটি তৈরি করি newbranch

git checkout -b newbranch

এবং দুটি নতুন কমিট করুন newbranch: কমিট 1 এবং কমিট 2

তারপরে আমরা মাস্টার এবং মেক এ স্যুইচ করি cherry-pick

git checkout master
git cherry-pick hash_of_commit1

আমরা অনুসন্ধান করে gitkদেখি যে কমিট 1 এবং এর চেরি-বাছাই করা সংস্করণটির আলাদা আলাদা হ্যাশ রয়েছে, তাই প্রযুক্তিগতভাবে সেগুলি দুটি পৃথক কমিট its

অবশেষে আমরা একত্রীকরণ newbranchমধ্যে master:

git merge newbranch

এবং দেখুন যে বিভিন্ন হ্যাশ সহ এই দুটি কমিটগুলি সমস্যা ছাড়াই একত্রিত করা হয়েছে যদিও তারা বোঝায় যে একই পরিবর্তনগুলি দুটিবার প্রয়োগ করা উচিত, সুতরাং তাদের মধ্যে একটি ব্যর্থ হওয়া উচিত।

গিটটি যখন মার্জ হওয়ার সময় কমিটের সামগ্রীর বিশদ বিশ্লেষণ করে এবং সিদ্ধান্ত নেয় যে পরিবর্তনগুলি দু'বার প্রয়োগ করা উচিত নয় বা এই কমিটিগুলি অভ্যন্তরীণভাবে একত্রে লিঙ্কিত হিসাবে চিহ্নিত করা হয়েছে?

উত্তর:


131

সংক্ষিপ্ত উত্তর

চিন্তা করবেন না, গিট এটি পরিচালনা করবে।

দীর্ঘ উত্তর

যেমন SVN 1 এর বিপরীতে , গিট ডেল্টা ফর্ম্যাটে কমিটগুলি সঞ্চয় করে না, তবে স্ন্যাপশট-ভিত্তিক 2,3 । যদিও এসভিএন নির্বিকারভাবে প্রতিটি মার্জ কমিটিকে প্যাচ হিসাবে প্রয়োগ করার চেষ্টা করবে (এবং আপনি যে সঠিক কারণে বর্ণনা করেছেন ব্যর্থ হন), গিট সাধারণত এই দৃশ্য পরিচালনা করতে সক্ষম হয়।

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

সোর্স

সাবট্রিশনে 1 স্কিপ-ডেল্টাস
2 গিট বেসিকস
3 গিট অবজেক্ট মডেল


40
প্রকৃতপক্ষে, আমি বলব যে আপনার মার্জ হওয়ার বিষয়ে চিন্তা করা উচিত এবং "গিট এটি পরিচালনা করবে" এটি থাম্বের একটি ভাল নিয়ম নয়।
ক্রেগক্স

4
আসলে একীভূত হতে পারে কিছু ক্ষেত্রে সদৃশ সামগ্রী তৈরি হতে পারে। গিট মাঝে মাঝে এটি পরিচালনা করে তবে কখনও কখনও তা করে না।
ডনকুইক্সোট

এটা মারাত্মক ভুল। সমস্ত প্রচলিত ফর্মগুলিতে ফাইল ফাইলগুলি বেশ সঞ্চয় করে। এবং আমি যদি সঠিকভাবে স্মরণ করি তবে এসভিএন স্ন্যাপশট সংরক্ষণ করার জন্য ব্যবহৃত হত।
he_the_great

2
@ তিনি_গ্রাহ্য, না এসভিএন-এর স্কিপ-ডেল্টা স্টোরেজ ফর্ম্যাটটি (! = স্ন্যাপশটগুলি) ম্যানুয়ালটিতে ভালভাবে নথিবদ্ধ । এবং আমি সত্যিই আপনি দ্বারা কি বোঝাতে চেয়েছেন পাবেন না condevable । আমি নেটিভ স্পিকার নই, তবে আমি নিশ্চিত যে এটি আসল শব্দ নয়।
হেলমার্ট

2
@ তিনি_ত_গ্রেট তবে সম্পূর্ণ ফাইলের জন্য ফাইলের ফলাফলের জন্য যে কোনও হ্যাশকে প্যাকফিল করে। হ্যাঁ এটি ডেল্টাস ব্যবহার করে সংকুচিত করে, তবে এটি কোনও কমিটের পরিবর্তনের জন্য একটি ব-দ্বীপ নয়, পরিবর্তে কোনও ফাইলের জন্য হ্যাশগুলির মধ্যে একটি ব-দ্বীপ। প্রতিশ্রুতিবদ্ধ অবজেক্টটি যতটা উদাসীন, এটি এমন একটি গাছকে উল্লেখ করছে যা একটি সম্পূর্ণ ফাইলের জন্য হ্যাশটিকে রেফারেন্স করে। এটি হুডের নীচে ডেটা সংকুচিত হয় যা গিট কাজ করার পদ্ধতিতে প্রভাব ফেলে না। প্রতিশ্রুতি হিসাবে গিট স্টোরগুলি সম্পূর্ণ ফাইলগুলি সঞ্চয় করে, এসভিএন কমেন্টের জন্য ডেল্টাসগুলি বোঝে।
পিটার ওলসন

43

এই জাতীয় সংযোজনের পরে আপনার ইতিহাসে চেরি-বাছাই করা কমিট হতে পারে।

সমাধানটি আমি নিবন্ধ থেকে উদ্ধৃত করার উদ্ধৃতি যা ডুপ্লিকেট (চেরি-বাছাই করা) সহ শাখার জন্য সুপারিশ করে মার্জ করার আগে পুনরায় ব্যবহারের আদেশ দেয়:

গিট চেরি-পিকের পরে গিট মার্জ: সদৃশ কমিটিকে এড়ানো

কল্পনা করুন আমাদের মাস্টার শাখা এবং একটি শাখা রয়েছে:

   o---X   <-- master
    \
     b1---b2---b3---b4   <-- b

এখন আমাদের জরুরিভাবে মাস্টারটিতে বি 1 এবং বি 3 করার দরকার রয়েছে, তবে খ-এ করা বাকী কমিটগুলি নয়। সুতরাং আমরা যা করি তা মাস্টার শাখাটি চেকআউট করা এবং চেরি-পিক বি 1 এবং বি 3 করে:

$ git checkout master
$ git cherry-pick "b1's SHA"
$ git cherry-pick "b3's SHA"

ফলাফলটি হবে:

   o---X---b1'---b3'   <-- master
    \
     b1---b2---b3---b4   <-- b

ধরা যাক আমরা মাস্টার সম্পর্কে আরও একটি প্রতিশ্রুতিবদ্ধ এবং আমরা পেয়েছি:

   o---X---b1'---b3'---Y   <-- master
    \
     b1---b2---b3---b4   <-- b

আমরা যদি এখন শাখা বিকে মাস্টারের সাথে একীভূত করব:

$ git merge b

আমরা নিম্নলিখিত পেতে হবে:

   o---X---b1'---b3'---Y--- M  <-- master
     \                     /
      b1----b2----b3----b4   <-- b

তার মানে বি 1 এবং বি 3 দ্বারা প্রবর্তিত পরিবর্তনগুলি ইতিহাসে দু'বার প্রদর্শিত হবে। এটি এড়াতে আমরা সংযুক্তির পরিবর্তে পুনরায় শোধ করতে পারি:

$ git rebase master b

যা ফল দেয়:

   o---X---b1'---b3'---Y   <-- master
                        \
                         b2'---b4'   <-- b

অবশেষে:

$ git checkout master
$ git merge b

আমাদের দেয়:

   o---X---b1'---b3'---Y---b2'---b4'   <-- master, b

ডেভিড লেমন এর মন্তব্য দ্বারা অনুমিত EDIT সংশোধন


1
রিবেস সম্পর্কে দুর্দান্ত ইঙ্গিত! এটি সমস্ত চেরি-বাছাই করা কমিটি স্বয়ংক্রিয়ভাবে 'এড়িয়ে যাবে'।
আইটেক

2
সত্যি বলতে, এটি সত্য বলে মনে হয়েছে, এটি আমার চোখ দিয়ে দেখতে হবে। পুনর্বাসনের মাধ্যমে কমিটসকে পরিবর্তন করা হয়, আপনার শেষ সময়রেখাটি হওয়া উচিত---Y---b2'---b4'
ডেভিড লেমন

পুরোপুরি কাজ করে। আপনি চেরি-বাছাই করা ইতিহাসে দু'বার কমিট করতে না চাইলে খুব সহায়ক।
ব্যবহারকারী 2350644

1
এটিকে লক্ষ করা উচিত নয় যে রিবেসটি সুন্দর হওয়ার সাথে সাথে এটি ব্যবহারের বিপদটি হ'ল পুরাতন খ থেকে তৈরি কোনও কাঁটাচামচ বা শাখাগুলি সিঙ্কের বাইরে চলে যাবে এবং ব্যবহারকারীদের গিট রিসেট --হাড় এবং গিটের মতো জিনিসগুলি অবলম্বন করতে হতে পারে ধাক্কা -ফ?
জেএইচএইচ

1
@ জেএইচএইচ আমরা এখানে কেন স্থানীয় শাখাটি
প্রত্যাখ্যান করব তা জানায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.