macOS-এ নির্ভরশীল কমিটগুলো চেরি-পিক করতে, প্রথমে পূর্বশর্ত হিসেবে প্রয়োজনীয় কমিটটি শনাক্ত করুন এবং যে কমিটটি এর ওপর নির্ভর করে তার আগে এটি প্রয়োগ করুন। Terminal-এ সোর্স ব্রাঞ্চের হিস্ট্রি পরীক্ষা করুন, ডেস্টিনেশন ব্রাঞ্চের ওয়ার্কিং ট্রি পরিষ্কার রয়েছে কি না তা নিশ্চিত করুন, তারপর নির্ভরতার ক্রম অনুযায়ী নির্বাচিত কমিট আইডিগুলো চেরি-পিক করুন। গিট প্রতিটি কমিটের পরিবর্তন প্রয়োগ করে এবং আপনি বর্তমানে যে ব্রাঞ্চটি চেকআউট করে রেখেছেন সেটিতে একটি নতুন কমিট তৈরি করে; আপনার ডেস্টিনেশনের কোন পরিবর্তনগুলো প্রয়োজন তা এটি নিজে থেকে নির্ধারণ করে না। Git-এর cherry-pick সংক্রান্ত ডকুমেন্টেশন

নির্ভরশীল কমিটগুলোর কোন ক্রম ব্যবহার করা উচিত?

নির্ভরশীল পরিবর্তনের আগে এর পূর্বশর্ত হিসেবে প্রয়োজনীয় পরিবর্তনটি প্রয়োগ করুন। উদাহরণস্বরূপ, যদি a1b2c3 কমিট একটি ফাংশন যোগ করে এবং d4e5f6 কমিট সেই ফাংশনটিকে কল করে, তবে প্রথমে a1b2c3 এবং পরে d4e5f6 পিক করুন। দ্বিতীয় কমিটটি যদি প্রথমটির দ্বারা যুক্ত হওয়া কোনো ফাইল, ইন্টারফেস বা আচরণের প্রত্যাশা করে, তবে তাদের ক্রম উল্টে দিলে কনফ্লিক্ট দেখা দিতে পারে বা ডেস্টিনেশনটি একটি অকার্যকর মধ্যবর্তী অবস্থায় চলে যেতে পারে।

আপনার শুরুর ভিত্তি হিসেবে সোর্স ব্রাঞ্চের প্যারেন্ট-টু-চাইল্ড ক্রম ব্যবহার করুন। গিটের ওয়ার্কফ্লো সংক্রান্ত নির্দেশিকায় কাজগুলোকে এমন যৌক্তিক কমিটে ভাগ করার পরামর্শ দেওয়া হয় যা সামঞ্জস্যপূর্ণ এবং স্বাধীনভাবে কাজ করতে পারে; বাস্তব হিস্ট্রি হয়তো সেই আদর্শের সাথে নাও মিলতে পারে, তাই নির্বাচিত প্রতিটি কমিট কী পরিবর্তন করে এবং কিসের ওপর নির্ভর করে তা পরীক্ষা করে দেখুন। চেরি-পিকিং প্রতিটি কমিটের পরিবর্তনকে পৃথকভাবে কপি করে, যেখানে মার্জিং পুরো ব্রাঞ্চের স্তরে পরিবর্তনগুলো নিয়ে আসে। আপনার যদি পুরো ব্রাঞ্চ এবং এর হিস্ট্রির প্রয়োজন হয়, তবে একটি একটি করে কমিট বেছে নেওয়ার চেয়ে মার্জ করা বেশি উপযুক্ত কি না তা বিবেচনা করুন। Git workflows সংক্রান্ত ডকুমেন্টেশন

Terminal-এ হিস্ট্রি পরীক্ষা করুন

আপনার ম্যাকে Terminal খুলুন, রিপোজিটরি ফোল্ডারে যান এবং আপনার বর্তমান অবস্থা পরীক্ষা করুন। উদ্ধৃতি চিহ্নের ভেতরের পাথটি আপনার রিপোজিটরির প্রকৃত পাথ দিয়ে প্রতিস্থাপন করুন; উদ্ধৃতি চিহ্ন ব্যবহার করলে ফোল্ডারের নামের মধ্যে স্পেস বা ফাঁকা জায়গা রাখা যায়।

cd "/path/to/your/repository"
git status --short --branch
git log --graph --oneline --decorate --all

প্রথম কমান্ডটি Terminal-এর ওয়ার্কিং ডিরেক্টরি পরিবর্তন করে। git status চেকআউট করা ব্রাঞ্চ এবং যেকোনো লোকাল পরিবর্তন দেখায়। গ্রাফ ভিউ আপনাকে দেখতে সাহায্য করে যে সোর্স ব্রাঞ্চে কোন কমিটগুলো রয়েছে এবং সেগুলোর ক্রম কী। macOS Terminal ডিফল্টভাবে zsh ব্যবহার করে, এবং উপরের কমান্ডগুলো সেখানে সমর্থিত সাধারণ শেল সিনট্যাক্স ব্যবহার করে। Apple-এর Terminal নির্দেশিকা

প্রয়োজনীয় ব্রাঞ্চটি যদি একটি রিমোট ট্র্যাকিং ব্রাঞ্চ হয় এবং এর সর্বশেষ অবস্থা স্থানীয়ভাবে উপস্থিত না থাকে, তবে তা পরীক্ষা করার আগে ফেচ করে নিন:

git fetch origin
git log --reverse --oneline origin/feature-name

origin/feature-name অংশটিকে প্রকৃত রিমোট ব্রাঞ্চের নাম দিয়ে প্রতিস্থাপন করুন। রিভার্স অপশনটি কমিটগুলোকে সবচেয়ে পুরোনো থেকে নতুন ক্রমে প্রদর্শন করে। বড় হিস্ট্রির ক্ষেত্রে, একটি পরিচিত সাধারণ বেসের পরের কমিটগুলোতে লগ সীমাবদ্ধ করুন, যেমন git log --reverse --oneline base-commit..origin/feature-name। ফলাফলের সাবজেক্টগুলো পড়ুন, তারপর git show COMMIT_ID দিয়ে সম্ভাব্য পরিবর্তনগুলো পরীক্ষা করুন। পর্যালোচনার জন্য কমিটের রেঞ্জ সুবিধাজনক, তবে ধরে নেবেন না যে রেঞ্জ আর্গুমেন্টটি নিজেই আপনার প্রয়োজনীয় কাস্টম নির্ভরতার ক্রম নিশ্চিত করবে: সুনির্দিষ্ট কমিট আইডি ব্যবহারের মাধ্যমে কাঙ্ক্ষিত ক্রম স্পষ্ট হয়।

পূর্বশর্তের ক্রম অনুযায়ী চেরি-পিক করুন

শুরু করার আগে, লোকাল পরিবর্তনগুলো কমিট করুন অথবা নিরাপদে সরিয়ে রাখুন। সাধারণ চেরি-পিক অপারেশনের জন্য একটি পরিষ্কার ওয়ার্কিং ট্রি প্রয়োজন, এবং কোনো কিছু প্রয়োগ করার আগে আপনার ডেস্টিনেশন ব্রাঞ্চটি নিশ্চিত করা উচিত। উদাহরণের আইডিগুলোকে পূর্বশর্ত থেকে নির্ভরশীল ক্রমে সাজিয়ে প্রকৃত পূর্ণাঙ্গ বা সংক্ষিপ্ত কমিট আইডি দিয়ে প্রতিস্থাপন করুন:

git switch destination-branch
git status --short --branch
git cherry-pick a1b2c3 d4e5f6

প্রদত্ত ক্রম অনুসারে প্রতিটি নির্বাচিত পরিবর্তনের জন্য গিট একটি নতুন কমিট তৈরি করে। আউটপুটটি মনোযোগ সহকারে পরীক্ষা করুন: যদি কোনো পরিবর্তন ইতিমধ্যে অন্য কোনো উপায়ে অন্তর্ভুক্ত হয়ে থাকে, অথবা ডেস্টিনেশন ব্রাঞ্চে ভিন্নতা তৈরি হয়ে থাকে, তবে গিট একটি খালি পরিবর্তনের তথ্য দিতে পারে বা কনফ্লিক্টের কারণে থেমে যেতে পারে। পরে, git log --oneline -n 5 এবং git status দিয়ে পরিবর্তিত হিস্ট্রি ও ওয়ার্কিং ট্রি পরীক্ষা করুন। ফলাফলের ওপর নির্ভর করার আগে প্রকল্পের প্রাসঙ্গিক পরীক্ষাগুলো চালান; একটি ঝামেলাহীন চেরি-পিকের অর্থ কেবল এই যে গিট পরিবর্তনগুলো প্রয়োগ করেছে, এটি এমন নয় যে ফিচারটি কাঙ্ক্ষিতভাবে কাজ করছে।

কোনো কমিটে কনফ্লিক্ট দেখা দিলে

চেরি-পিকের সময় কোনো কনফ্লিক্ট দেখা দিলে, গিট সেই কমিটে এসে সাময়িকভাবে থেমে যায়। ক্ষতিগ্রস্ত ফাইলগুলো পরীক্ষা করুন এবং ডেস্টিনেশন ব্রাঞ্চের বর্তমান উপাদানের সাথে কাঙ্ক্ষিত সোর্স পরিবর্তনটি একত্রিত করে প্রতিটি কনফ্লিক্ট সমাধান করুন। git add দিয়ে সমাধান করা ফাইলগুলো স্টেজ করুন এবং প্রক্রিয়াটি চালিয়ে যান:

git add "path/to/resolved-file"
git cherry-pick --continue

বর্তমান প্রক্রিয়াটি বাতিল করতে এবং এটি শুরু হওয়ার আগের অবস্থায় ফিরে যেতে git cherry-pick --abort ব্যবহার করুন। শুধুমাত্র তখনই git cherry-pick --skip ব্যবহার করুন যখন আপনি সিদ্ধান্ত নিয়েছেন যে বর্তমান কমিটের পরিবর্তনটি বাদ দেওয়া উচিত; পরবর্তী কমিটগুলো এর ওপর নির্ভর করতে পারে, তাই এটি এড়িয়ে গেলে সেই পরিবর্তনগুলো ব্যর্থ হতে পারে বা তাদের কার্যকারিতা হারাতে পারে। চলমান অপারেশন নিয়ন্ত্রণের জন্য গিট continue, skip এবং abort-এর ব্যবহারের বিবরণ দেয়। Git cherry-pick সিকোয়েন্সার অপশনসমূহ

কোনো মার্জ কমিটের ক্ষেত্রে, সেটি নির্বাচন করার আগে বিরতি নিন: গিটের জন্য একটি মেইনলাইন প্যারেন্ট বেছে নেওয়ার প্রয়োজন হয় কারণ মার্জের একাধিক প্যারেন্ট থাকে। একইভাবে, আগের পরিবর্তনের দীর্ঘ ধারা ছাড়া যদি পরবর্তী কমিটগুলো বোধগম্য না হয়, তবে কেবল কয়েকটি নির্বাচন করলে তা সামঞ্জস্যপূর্ণ ফলাফল নাও দিতে পারে। নির্ভরতাগুলো পরীক্ষা করুন এবং সবচেয়ে ছোট সম্পূর্ণ ধারাটি বেছে নিন যা তাদের বজায় রাখে।

সূত্রসমূহ