Git-এ Conflict সমাধান (Resolve Conflict)
Git-এ Merge Conflict একে অপরের পরিবর্তনকে একত্রিত করতে না পারার কারণে ঘটে। যখন দুটি ব্রাঞ্চের মধ্যে একে অপরের সঙ্গে সাদৃশ্যপূর্ণ পরিবর্তন থাকে, তখন Git জানে না কোনটা ব্যবহার করতে হবে। এই অবস্থায় Git আপনাকে কনফ্লিক্ট সমাধান করতে বলে।
এখন, আসুন দেখে নিই কীভাবে Git-এ কনফ্লিক্ট সমাধান করতে হয় এবং এর সাথে সম্পর্কিত উদাহরণ।
🚨 Merge Conflict কীভাবে ঘটবে?
Merge Conflict তখন ঘটে যখন দুইটি ব্রাঞ্চ একই ফাইলের একই অংশে আলাদা আলাদা পরিবর্তন করে, এবং Git জানে না কোনটি মর্জ করতে হবে।
এটা হতে পারে:
- একই লাইনে পরিবর্তন – দুটি ব্রাঞ্চ একই কোড লাইনে পরিবর্তন করেছে।
- একটি ফাইল মুছে ফেলা এবং অন্যটি পরিবর্তন করা – একটি ব্রাঞ্চ একটি ফাইল মুছে ফেললে, অন্যটি সেই ফাইলের মধ্যে কিছু পরিবর্তন করে।
- একই ফাইলের নাম পরিবর্তন – এক ব্রাঞ্চে ফাইলের নাম পরিবর্তন করা হয়, আর অন্য ব্রাঞ্চে ফাইলটি পরিবর্তিত হয়।
📝 Conflict সমাধানের ধাপ:
কনফ্লিক্ট চেক করুন:
প্রথমেই, কনফ্লিক্ট ঘটেছে কি না, তা চেক করতে
git statusকমান্ড ব্যবহার করুন। এটি আপনাকে কনফ্লিক্টেড ফাইলগুলো দেখাবে।
git status git statusএর আউটপুট যেমন হতে পারে:
both modified: app.jsboth modified: app.jsএখানে app.js ফাইলটি কনফ্লিক্টে রয়েছে। এটি একটি "both modified" কনফ্লিক্ট, যা মানে হচ্ছে দুইটি ব্রাঞ্চ একই ফাইলে পরিবর্তন করেছে।
কনফ্লিক্টেড ফাইল খুলুন:
কনফ্লিক্টেড ফাইলটি খুললে আপনি কনফ্লিক্টের জন্য Git দ্বারা স্বয়ংক্রিয়ভাবে নির্ধারিত মার্কার দেখতে পাবেন:
javascript<<<<<<< HEAD const greeting = "Hello, World!"; ======= const greeting = "Hi, World!"; >>>>>>> feature/add-feature<<<<<<< HEAD const greeting = "Hello, World!"; ======= const greeting = "Hi, World!"; >>>>>>> feature/add-feature<<<<<<< HEAD: বর্তমান ব্রাঞ্চের কোড।=======: পরিবর্তনগুলোর মধ্যে পার্থক্য।>>>>>>> feature/add-feature: মর্জ করার ব্রাঞ্চের কোড।
কনফ্লিক্ট সমাধান করুন:
আপনি কনফ্লিক্ট মার্জারের মার্কারগুলো মুছে দিয়ে কোডের একটি সঠিক সংস্করণ রাখতে হবে। আপনি দুইটি পরিবর্তনের মধ্যে পছন্দ করতে পারেন, অথবা উভয়ের মধ্যে একটি মিলিত সংস্করণ তৈরি করতে পারেন।
উদাহরণস্বরূপ, যদি আপনি দুটো পরিবর্তন মিশিয়ে একটি নতুন সংস্করণ তৈরি করতে চান:
javascriptconst greeting = "Hello and Hi, World!";const greeting = "Hello and Hi, World!";অথবা, আপনি একটি পরিবর্তন রাখতে পারেন, যেমন:
javascriptconst greeting = "Hello, World!";const greeting = "Hello, World!";ফাইল স্টেজ করুন:
কনফ্লিক্ট সমাধান করার পর, ফাইলটি আবার স্টেজ করুন:
bashgit add app.jsgit add app.jsকমিট করুন:
এরপর, মার্জ কমিট করতে হবে:
bashgit commitgit commitGit সাধারণত একটি মার্জ কমিট মেসেজ তৈরি করবে, তবে আপনি এটি কাস্টমাইজও করতে পারেন।
🔧 Conflict সমাধান করার উদাহরণ:
1. কনফ্লিক্ট - এক লাইনে দুটি ভিন্ন পরিবর্তন:
ধরা যাক index.html ফাইলের মধ্যে:
Main ব্রাঞ্চ:
html<h1>Welcome to My Website!</h1><h1>Welcome to My Website!</h1>Feature ব্রাঞ্চ:
html<h1>Welcome to Our Website!</h1><h1>Welcome to Our Website!</h1>
এখন আপনি যখন ব্রাঞ্চ দুটি মর্জ করবেন, তখন Git কনফ্লিক্ট তৈরি করবে। ফাইলটি এমন দেখাবে:
<<<<<<< HEAD
<h1>Welcome to My Website!</h1>
=======
<h1>Welcome to Our Website!</h1>
>>>>>>> feature<<<<<<< HEAD
<h1>Welcome to My Website!</h1>
=======
<h1>Welcome to Our Website!</h1>
>>>>>>> featureএখন আপনাকে সিদ্ধান্ত নিতে হবে:
- আপনি কোন একটিকে রাখতে চান,
- অথবা দুটি পরিবর্তন মিশিয়ে একটি নতুন সংস্করণ তৈরি করতে পারেন।
যেমন:
<h1>Welcome to My Amazing Website!</h1><h1>Welcome to My Amazing Website!</h1>2. ফাইল মুছে ফেলা এবং অন্যটিতে পরিবর্তন করা:
ধরা যাক, আপনার app.css ফাইলটি দুটি ব্রাঞ্চের মধ্যে ভিন্নভাবে এডিট করা হয়েছে।
- Main ব্রাঞ্চ: ফাইলটি মুছে ফেলেছে।
- Feature ব্রাঞ্চ: ফাইলটিতে নতুন কিছু CSS স্টাইল যোগ করেছে।
এখন যদি আপনি feature ব্রাঞ্চটি main ব্রাঞ্চের সাথে মার্জ করেন, Git জানবে না কি করতে হবে—ফাইলটি মুছে ফেলবে না কি ফিচার ব্রাঞ্চের পরিবর্তনগুলো রাখবে।
এক্ষেত্রে আপনাকে ম্যানুয়ালি সিদ্ধান্ত নিতে হবে:
- যদি ফাইলটি মুছে ফেলতে চান, তাহলে
git rm app.cssব্যবহার করতে পারেন। - যদি পরিবর্তনগুলো রাখতে চান, তাহলে
git add app.cssদিয়ে ফাইলটি আবার স্টেজ করুন।
3. কনফ্লিক্ট - একে অপরের সাথে একই ফাইলের নাম পরিবর্তন:
ধরা যাক, দুটি ব্রাঞ্চে app.js ফাইলটি আলাদা আলাদা ভাবে পরিবর্তিত হয়েছে:
- Main ব্রাঞ্চ: ফাইলটির নাম
app.jsথেকেmain.jsতে পরিবর্তন করেছে। - Feature ব্রাঞ্চ:
app.jsফাইলটি পরিবর্তন করেছে।
এখন আপনি যখন feature ব্রাঞ্চটি main ব্রাঞ্চের সাথে মার্জ করবেন, Git কনফ্লিক্টের মধ্যে পড়বে এবং জানবে না কোন ফাইলটি রাখা উচিত—নাম পরিবর্তন করা ফাইলটি না কি মূল ফাইলটি।
এক্ষেত্রে আপনি ম্যানুয়ালি কাজ করতে পারেন:
- যদি
main.jsরাখতে চান, তবেgit add main.jsকমান্ড ব্যবহার করুন। - যদি
app.jsরাখতে চান, তবে পুরনো নামটি রেখে ফেলুন এবং মার্জ কমিট করুন।
⚡️ Conflict এ Avoid করার কৌশল
প্রতিদিন Pull করুন: মার্জ কনফ্লিক্ট এড়ানোর জন্য নিয়মিত মূল ব্রাঞ্চ থেকে Pull করুন, যাতে আপনি সর্বশেষ পরিবর্তনগুলির সাথে আপডেট থাকতে পারেন।
bashgit pull origin maingit pull origin mainফিচার ব্রাঞ্চ ব্যবহার করুন: সরাসরি
mainব্রাঞ্চে কাজ করার পরিবর্তে, প্রতিটি নতুন ফিচারের জন্য আলাদা ব্রাঞ্চ তৈরি করুন।টিমের সাথে যোগাযোগ বজায় রাখুন: আপনার টিমের অন্য সদস্যদের সাথে নিয়মিত যোগাযোগ রাখুন, যাতে একই ফাইলের একাধিক অংশে কাজ করার সময় কনফ্লিক্ট এড়ানো যায়।
কমিট ভাঙুন: ছোট ছোট পরিবর্তন করে কোডটিকে কমিট করুন। বড় পরিবর্তন একসাথে না করে, ছোট ছোট কমিটে ভাগ করুন। এতে কনফ্লিক্টের সম্ভাবনা কমে যাবে।
💡 সারাংশ
Git-এ Merge Conflict একটি সাধারণ বিষয়, তবে সঠিকভাবে সমাধান করলে এটি দ্রুত এবং সহজ হয়ে যায়। কনফ্লিক্ট সমাধান করার জন্য আপনাকে ম্যানুয়ালি ফাইলটি এডিট করতে হবে, মার্কারগুলো মুছে ফেলতে হবে, এবং তারপর স্টেজ ও কমিট করতে হবে। নিয়মিত Pull, ফিচার ব্রাঞ্চ ব্যবহার এবং টিমের সাথে যোগাযোগ রাখলে কনফ্লিক্টের পরিমাণ অনেক কমে যায়।
Merge Conflict সমাধানের এই প্রক্রিয়া শিখলে, আপনি Git-এ আরও দক্ষ হয়ে উঠবেন এবং আপনার কাজ আরও মসৃণ হবে।