একটি ম্যাক-এ, টার্মিনাল বা কোড এডিটরে দ্বন্দ্বপূর্ণ প্রতিটি ফাইল এডিট করে, প্রস্তুত ফাইলগুলো git add দিয়ে স্টেজ করে, এবং git cherry-pick --continue চালিয়ে চেরি-পিক দ্বন্দ্ব সমাধান করুন। গিট সাময়িকভাবে থেমে যায় কারণ এটি কোনো কমিট নির্বিঘ্নে প্রয়োগ করতে পারেনি; আপনার বর্তমান ব্রাঞ্চ এখনও সেই কমিটটি পায়নি। এগিয়ে যাওয়ার আগে প্রতিটি দ্বন্দ্বের উভয় দিক পর্যালোচনা করুন, এবং যদি আপনি অগ্রসর না হওয়ার সিদ্ধান্ত নেন তবে git cherry-pick --abort ব্যবহার করুন। Git-এর cherry-pick সংক্রান্ত ডকুমেন্টেশন-এ এই স্থগিতাবস্থা এবং এটি পুনরায় চালু করার বিকল্পগুলো বর্ণনা করা হয়েছে।
১. প্রজেক্ট ফোল্ডারে টার্মিনাল খুলুন
Spotlight বা Finder-এর Applications > Utilities ফোল্ডার থেকে টার্মিনাল খুলুন। টার্মিনালে, cd এবং এর পাথ ব্যবহার করে রিপোজিটরি ফোল্ডারে যান। স্পেস বা ফাঁকা স্থানযুক্ত ফোল্ডার পাথের ক্ষেত্রে পাথটি কোটেশনের মধ্যে রাখুন, উদাহরণস্বরূপ cd "/Users/sam/Work/My Project"। আপনি শেষে একটি স্পেস দিয়ে cd টাইপ করতে পারেন, Finder থেকে প্রজেক্ট ফোল্ডারটি টেনে এনে টার্মিনাল উইন্ডোতে ছেড়ে দিতে পারেন, তারপর Return চাপতে পারেন। অ্যাপল টার্মিনালকে macOS-এর কমান্ড-লাইন ইন্টারফেস হিসেবে বর্ণনা করে; ডিফল্ট zsh শেল ব্যবহার করার সময় এর প্রম্পট প্রায়শই % দিয়ে শেষ হয়। অ্যাপলের টার্মিনাল গাইড-এ এটি কীভাবে খুলতে হয় এবং প্রম্পট কীভাবে চিনতে হয় তা ব্যাখ্যা করা হয়েছে।
ফাইল পরিবর্তন করার আগে আপনি রিপোজিটরিতে আছেন কিনা তা নিশ্চিত করুন এবং গিট কী রিপোর্ট করছে তা দেখুন:
git status
যদি আউটপুটে বলা হয় যে একটি চেরি-পিক প্রক্রিয়াধীন রয়েছে এবং দ্বন্দ্বযুক্ত পাথগুলোর নাম উল্লেখ থাকে, তবে নিচের ধাপগুলো অনুসরণ করুন। কোন রিপোজিটরি বা কমিট জড়িত সে সম্পর্কে আপনি যদি নিশ্চিত না হন, তবে কোনো কিছু সমাধান করার আগে থামুন এবং সেই তথ্য নিশ্চিত করুন। প্রথমটি স্থগিত থাকা অবস্থায় দ্বিতীয় কোনো চেরি-পিক শুরু করবেন না।
২. দ্বন্দ্বটি পরীক্ষা করুন এবং ফাইলটিতে কী থাকা উচিত তা নির্ধারণ করুন
আপনার এডিটরে প্রতিটি দ্বন্দ্বযুক্ত টেক্সট ফাইল খুলুন। যেসব অংশ গিট মেলাতে পারেনি, তার চারপাশে গিট মার্কার যুক্ত করে দেয়। একটি সাধারণ অংশ দেখতে এরকম হয়:
<<<<<<< HEAD
content on the current branch
=======
content from the commit being cherry-picked
>>>>>>> commit subject or identifier
HEAD হলো বর্তমান ব্রাঞ্চের সংস্করণ; অন্য অংশটি প্রয়োগ করা কমিট থেকে এসেছে। এই লেবেলগুলো এই অপারেশনের দুটি দিক বর্ণনা করে, তবে কোন সংস্করণটি সঠিক তা তারা আপনাকে বলে না। একটি দিক রাখবেন নাকি উভয়টি একত্রিত করবেন তা নির্ধারণ করতে আশেপাশের কোড, উদ্দিষ্ট পরিবর্তন এবং কমিটের উদ্দেশ্য বিবেচনা করুন। গিটের ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে যে দ্বন্দ্বযুক্ত ফাইলগুলোতে মার্কার থাকে এবং যেসব পাথ নির্বিঘ্নে প্রয়োগ করা হয়েছে সেগুলো ইতিমধ্যে আপডেট হয়ে থাকতে পারে। Git cherry-pick
ফাইলটি এমনভাবে এডিট করুন যাতে এটি উদ্দিষ্ট ফলাফল ধারণ করে, এবং দ্বন্দ্ব-মার্কারের সমস্ত লাইন মুছে ফেলুন। সেই ফাইলের প্রতিটি দ্বন্দ্ব পরীক্ষা করুন, এটি সেভ করুন এবং git status-এ তালিকাভুক্ত প্রতিটি পাথের জন্য এই প্রক্রিয়ার পুনরাবৃত্তি করুন। কোনো বাইনারি ফাইল বা এমন কোনো দ্বন্দ্ব যার কাঙ্ক্ষিত ফলাফল স্পষ্ট নয়, সেক্ষেত্রে অনুমান করবেন না: কোনো একটি সংস্করণ বেছে নেওয়ার আগে পরিবর্তনের লেখক বা প্রজেক্ট নির্দেশিকার পরামর্শ নিন। কেবল দ্বন্দ্ব দূর করার উদ্দেশ্যে পুরো ফাইলটিকে একপাশের সংস্করণ দিয়ে প্রতিস্থাপন করা এড়িয়ে চলুন; এতে বৈধ পরিবর্তনগুলো বাতিল হয়ে যেতে পারে।
৩. সমাধানগুলো স্টেজ করুন এবং সেগুলো পর্যালোচনা করুন
একটি ফাইল সমাধানের পর, ফাইলটি স্টেজ করে গিটকে জানান যে এর দ্বন্দ্ব সমাধান করা হয়েছে। git status দ্বারা দেখানো হুবহু পাথ ব্যবহার করুন; যেসব পাথে স্পেস রয়েছে সেগুলো কোটেশনের মধ্যে রাখুন:
git add "Sources/Example File.swift"
প্রতিটি সমাধান করা পাথের জন্য এটি পুনরাবৃত্তি করুন। git add ফাইলের বর্তমান বিষয়বস্তুকে স্টেজ করে, তাই আপনি কী স্টেজ করছেন তা পর্যালোচনা করে নিন যদি এতে সম্পর্কহীন কোনো এডিট থাকে। গিটের git-add ম্যানুয়াল নির্দেশ করে যে এটি ফাইলের বিষয়বস্তুকে ইনডেক্সে যুক্ত করে, যা পরবর্তী কমিটের জন্য ব্যবহৃত স্টেজিং এলাকা। Git add
কোনো দ্বন্দ্ব অবশিষ্ট আছে কিনা তা পরীক্ষা করুন এবং স্টেজ করা সমাধানটি পরিদর্শন করুন:
git status
git diff --cached
git status-এ আর কোনো অসমাধানকৃত পাথ তালিকাভুক্ত থাকা উচিত নয়। স্টেজ করা ডিফারেন্স (diff) পড়ুন এবং নিশ্চিত করুন যে উদ্দিষ্ট পরিবর্তনটি বিদ্যমান রয়েছে এবং দ্বন্দ্বের মার্কার বা অনিচ্ছাকৃত কোনো এডিট অনুপস্থিত রয়েছে। git diff --cached স্টেজ করা পরিবর্তনগুলো দেখায়; Git diff-এ এই পর্যালোচনা বিকল্পটি নথিভুক্ত রয়েছে। আপনি যদি কোনো ভুল খুঁজে পান, ফাইলটি এডিট করুন, এটি পুনরায় স্টেজ করুন এবং ডিফারেন্সটি আরও একবার পর্যালোচনা করুন।
৪. চেরি-পিক চালিয়ে যান
সমস্ত দ্বন্দ্ব সমাধান এবং স্টেজ করা হয়ে গেলে চালান:
git cherry-pick --continue
গিট স্থগিত অপারেশনটি পুনরায় শুরু করে এবং সফল হলে, চেরি-পিক করা পরিবর্তনটি একটি নতুন কমিট হিসেবে রেকর্ড করে। গিট যদি কমিট বার্তার জন্য একটি এডিটর খোলে, তবে সেই এডিটরের সাধারণ নিয়ন্ত্রণগুলো ব্যবহার করে এটি সংরক্ষণ করুন এবং বন্ধ করুন। তারপর git status পরীক্ষা করুন এবং প্রয়োজনে সর্বশেষ কমিটটি পর্যালোচনা করুন:
git status
git log -1 --oneline
ধারাবাহিক কয়েকটি চেরি-পিক কমিটের ক্ষেত্রে, --continue অপারেশনটি চালিয়ে যায়; পরবর্তী কোনো কমিটও দ্বন্দ্বের কারণে থামতে পারে। একইভাবে সেই কমিটের দ্বন্দ্বগুলো সমাধান এবং স্টেজ করুন। গিট ব্যর্থ চেরি-পিক পুনরায় শুরু করার জন্য --continue এবং বর্তমান কমিট বাদ দেওয়ার জন্য --skip ব্যবহারের নির্দেশ দেয়। অসমাধানকৃত ফাইলের শর্টকাট হিসেবে নয়, কেবল তখনই --skip ব্যবহার করুন যখন আপনি ইচ্ছাকৃতভাবে সেই কমিটের পরিবর্তনটি বাদ দিতে চান। Git cherry-pick options
আপনি যদি এর পরিবর্তে প্রক্রিয়াটি থামাতে চান
আপনি যদি সিদ্ধান্ত নেন যে চেরি-পিকটি আর অগ্রসর হওয়া উচিত নয়, তবে git cherry-pick --abort চালান। গিট এটিকে অপারেশন বাতিল করা এবং প্রক্রিয়া শুরু হওয়ার আগের অবস্থায় ফিরে যাওয়া হিসেবে নথিভুক্ত করেছে। শুরু করার আগে যদি আপনার কোনো স্থানীয় কাজ করা থাকে, তবে পরে git status দিয়ে তা পরীক্ষা করে দেখুন; বর্তমান অবস্থা বোঝার বিকল্প হিসেবে কোনো ধ্বংসাত্মক রিসেট কমান্ড ব্যবহার করবেন না। Git cherry-pick
থামার একটি কার্যকর নিয়ম খুব সহজ: দ্বন্দ্বপূর্ণ প্রতিটি ফাইলের কাঙ্ক্ষিত বিষয়বস্তু বুঝতে পারার পর এবং স্টেজ করা ফলাফল পর্যালোচনা করার পরেই কেবল এগিয়ে যান। কোডের উদ্দেশ্য যদি অস্পষ্ট হয়, তবে স্থগিত অবস্থা বজায় রাখুন এবং কমিট তৈরির আগে প্রজেক্ট-নির্দিষ্ট নির্দেশনার জন্য সাহায্য চান।
তথ্যসূত্র
Open or quit Terminal on Mac — Apple Support