যেহেতু সময়টি git cherry-pick
একাধিক কমিট প্রয়োগ করতে সক্ষম হতে শিখেছে, তাই পার্থক্যটি কিছুটা বাস্তব হয়ে উঠেছে, তবে এটিকে অভিজাত বিবর্তন বলা যায় ;-)
সত্য পার্থক্য উভয় সরঞ্জাম তৈরি করার মূল উদ্দেশ্যতে নিহিত:
git rebase
এর কাজটি হ'ল কোনও বিকাশকারী তাদের প্রাইভেট ভাণ্ডারগুলিতে কিছু প্রবাহ শাখার সংস্করণ X এর বিপরীতে তৈরি করে একই শাখার (ওয়াই> এক্স) সংস্করণ ওয়াইয়ের এক ধারাবাহিক পরিবর্তনকে ফরওয়ার্ড-পোর্ট করা। এটি কার্যকরভাবে সেই সিরিজের কমিটগুলির ভিত্তি পরিবর্তন করে, তাই "রিবাজিং"।
(এটি বিকাশকারীকে যেকোন স্বেচ্ছাসেবী প্রতিশ্রুতিবদ্ধতায় একের পর এক কমিটের প্রতিশ্রুতি প্রতিস্থাপনের অনুমতি দেয়, তবে এটি কম সুস্পষ্ট ব্যবহারের নয়))
git cherry-pick
উন্নয়নের এক লাইন থেকে অন্য লাইনে একটি আকর্ষণীয় প্রতিশ্রুতি আনার জন্য। একটি ক্লাসিক উদাহরণ অস্থিতিশীল উন্নয়ন শাখায় করা একটি সুরক্ষা ফিক্সকে একটি স্থিতিশীল (রক্ষণাবেক্ষণ) শাখায় ব্যাকপোর্ট করা, যেখানে merge
কোনও অর্থ হয় না, কারণ এটি পুরোপুরি অযাচিত পরিবর্তন আনবে।
এটির প্রথম উপস্থিতির পরে, git cherry-pick
একযোগে একাধিক কমিট বেছে নিতে সক্ষম হয়েছে।
সুতরাং, সম্ভবত এই দুটি কমান্ডের মধ্যে সবচেয়ে উল্লেখযোগ্য পার্থক্য হ'ল তারা যে শাখায় কাজ করে তার সাথে কীভাবে আচরণ করে: git cherry-pick
সাধারণত অন্য কোথাও থেকে প্রতিশ্রুতি নিয়ে আসে এবং এটি আপনার বর্তমান শাখার শীর্ষে প্রয়োগ করে একটি নতুন প্রতিশ্রুতি রেকর্ড করে git rebase
, আপনার বর্তমান শাখা এবং পুনর্লিখনগুলি লেখার সময় এর নিজস্ব টিপগুলির একটি সিরিজ এক না কোনও উপায়ে কমিট করে। হ্যাঁ, git rebase
সাধারণ ধারণাটি ডুবে যাওয়ার চেষ্টা করার জন্য এটি কীভাবে কী করতে পারে তার একটি বিব্রত বিবরণ but
ব্যবহার করে git rebase
আলোচিত হওয়ার উদাহরণটি আরও ব্যাখ্যা করতে আপডেট করুন ।
এই পরিস্থিতি বিবেচনা করে,
বইটি বলেছে:
তবে, আরও একটি উপায় আছে: আপনি সি 3-এ চালু হওয়া প্যাচটি নিতে পারেন এবং সি 4 এর শীর্ষে এটি পুনরায় প্রয়োগ করতে পারেন। গিটকে একে রিবিসিং বলা হয়। রিবেস কমান্ডের সাহায্যে আপনি একটি শাখায় প্রতিশ্রুতিবদ্ধ সমস্ত পরিবর্তন নিতে পারেন এবং সেগুলি অন্য একটিতে প্রয়োগ করতে পারেন।
এই উদাহরণে, আপনি নিম্নলিখিত চালাতে চান:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
"ধরা" এখানে এই উদাহরণস্বরূপ, "পরীক্ষা" শাখাটি (প্রত্যাখ্যানের বিষয়) মূলত "মাস্টার" শাখাটি বন্ধ করে দেওয়া হয়েছিল, এবং তাই এটি C2 এর মাধ্যমে C0 এর সাথে ভাগ করে - কার্যকরভাবে "পরীক্ষা" হয় " এর উপরে সি 2 প্লাস কমিট করুন "সহ এবং অন্তর্ভুক্ত করুন"। (এটি সবচেয়ে সহজ সম্ভাব্য কেস; অবশ্যই, "পরীক্ষা-নিরীক্ষায়" এর মূল বেসের শীর্ষে কয়েক ডজন কমিট থাকতে পারে))
এখন "মাস্টার" git rebase
এর বর্তমান টিপটিতে "পরীক্ষা" পুনরায় চালু করতে বলা হয় এবং এটি git rebase
এরকম হয়:
- রান
git merge-base
কি গত উভয় "পরীক্ষা" এবং "মাস্টার" (, বেষ্টনী বিন্দু কি অন্য কথায়) দ্বারা ভাগ করা কমিট দেখতে। এটি সি 2
- ডাইভার্সন পয়েন্ট থেকে করা সমস্ত কমিটগুলি সরিয়ে দেয়; আমাদের খেলনা উদাহরণে, এটি কেবল সি 3।
- "মাস্টার" এর পরামর্শের দিকে ইঙ্গিত করতে হেডকে রিওয়াইন্ডস (যা "অপারেশনটি চালুর আগে" পরীক্ষার "টিপ প্রতিশ্রুতি দেখায়) - আমরা এটিতে প্রত্যাখ্যান করছি।
- সংরক্ষণ করা প্রতিটি কমিট (যেমনটি দিয়ে থাকে
git apply
) যাতে করে তা প্রয়োগ করার চেষ্টা করে । আমাদের খেলনা উদাহরণে এটি কেবল একটি প্রতিশ্রুতিবদ্ধ, সি 3। যাক এর অ্যাপ্লিকেশনটি একটি প্রতিশ্রুতিবদ্ধ C3 'উত্পন্ন করবে।
- যদি সবকিছু ঠিকঠাক হয় তবে "পরীক্ষামূলক" রেফারেন্সটি সর্বশেষ সংরক্ষিত প্রতিশ্রুতি (আমাদের ক্ষেত্রে সি 3) প্রয়োগ করার ফলে প্রতিশ্রুতিবদ্ধ প্রতি নির্দেশ করতে আপডেট করা হয়।
এখন আপনার প্রশ্ন ফিরে। আপনি দেখতে পাচ্ছেন যে, এখানে প্রযুক্তিগতভাবে git rebase
"পরীক্ষা" থেকে "মাস্টার" এর ডগায় একাধিক কমিটের প্রতিস্থাপন করা হয়েছে , যাতে আপনি সঠিকভাবে বলতে পারেন যে প্রক্রিয়াটিতে অবশ্যই "অন্য একটি শাখা" রয়েছে। তবে সংক্ষিপ্তসারটি হ'ল "পরীক্ষা" থেকে টিপ প্রতিশ্রুতিটি "পরীক্ষায়" নতুন টিপ প্রতিশ্রুতি হিসাবে শেষ হয়েছিল, এটি কেবল তার ভিত্তি পরিবর্তন করেছে:
আবার, প্রযুক্তিগতভাবে আপনি বলতে পারেন যে git rebase
এখানে "মাস্টার" থেকে কিছু কমিট অন্তর্ভুক্ত করা হয়েছে, এবং এটি একেবারে সঠিক।