Git Conflict উদাহরণ (Conflict Example)
Git-এ Merge Conflict তখন ঘটে যখন দুটি ব্রাঞ্চের মধ্যে একই ফাইলে একে অপরের সাথে বিরোধপূর্ণ পরিবর্তন করা হয়। এই অবস্থায়, Git জানে না কোন পরিবর্তনটি রাখতে হবে, ফলে কনফ্লিক্ট তৈরি হয়।
এই পর্বে আমরা বিভিন্ন ধরনের কনফ্লিক্টের উদাহরণ দেখব এবং কীভাবে সেগুলো সমাধান করা যায় তা শিখব।
১. এক লাইনে দুটি ভিন্ন পরিবর্তন (Conflict - Same Line)
ধরা যাক, আমাদের দুটি ব্রাঞ্চ রয়েছে: main এবং feature। এদের মধ্যে একটি ফাইল index.html এ একে অপরের সাথে বিরোধপূর্ণ পরিবর্তন করা হয়েছে।
Main ব্রাঞ্চ:
<h1>Welcome to My Website</h1><h1>Welcome to My Website</h1>Feature ব্রাঞ্চ:
<h1>Welcome to Our Website</h1><h1>Welcome to Our Website</h1>এখন, যদি আমরা feature ব্রাঞ্চটি main ব্রাঞ্চের সাথে মর্জ করি, Git কনফ্লিক্ট দেখাবে, কারণ একই লাইনে দুটি ভিন্ন পরিবর্তন রয়েছে।
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এখানে <<<<<<< HEAD হলো আপনার বর্তমান ব্রাঞ্চের পরিবর্তন, এবং >>>>>>> feature হলো মার্জ করা ব্রাঞ্চের পরিবর্তন। ======= এর মধ্যে পার্থক্য দেখানো হয়েছে।
সমাধান:
এখানে আপনি দুটি পরিবর্তন মিশিয়ে নতুন একটি পরিবর্তন তৈরি করতে পারেন:
<h1>Welcome to My Amazing Website!</h1><h1>Welcome to My Amazing Website!</h1>এবং তারপর git add এবং git commit ব্যবহার করে এই পরিবর্তনটি স্টেজ ও কমিট করতে হবে।
২. একটি ফাইল মুছে ফেলা এবং অন্য একটি পরিবর্তন করা (Conflict - File Deleted vs Edited)
ধরা যাক, একটি ফাইল app.css দুটি ব্রাঞ্চে ভিন্নভাবে সংশোধন করা হয়েছে:
- Main ব্রাঞ্চ: ফাইলটি মুছে ফেলেছে।
- Feature ব্রাঞ্চ: ফাইলটিতে কিছু নতুন CSS স্টাইল যোগ করেছে।
এখন, যদি আপনি feature ব্রাঞ্চটি main ব্রাঞ্চের সাথে মার্জ করেন, Git জানবে না কি করতে হবে। একে অপরের সাথে বিরোধপূর্ণ দুটি পরিবর্তন রয়েছে—একটি ফাইল মুছে ফেলা এবং অন্যটি পরিবর্তন করা।
Main ব্রাঞ্চ (app.css মুছে ফেলা):
git rm app.cssgit rm app.cssFeature ব্রাঞ্চ (app.css পরিবর্তন করা):
body {
background-color: #f0f0f0;
}body {
background-color: #f0f0f0;
}Git কনফ্লিক্ট এমন দেখতে হবে:
error: The following untracked working tree files would be overwritten by checkout:
app.css
Please move or remove them before you can switch branches.
Abortingerror: The following untracked working tree files would be overwritten by checkout:
app.css
Please move or remove them before you can switch branches.
Abortingসমাধান:
এখানে আপনার সিদ্ধান্ত নিতে হবে:
- যদি আপনি
app.cssফাইলটি রাখতে চান, তাহলেgit add app.cssব্যবহার করে ফাইলটি আবার স্টেজ করুন। - যদি আপনি ফাইলটি মুছে ফেলতে চান, তাহলে
git rm app.cssব্যবহার করে মুছে দিন।
৩. একই ফাইলের নাম পরিবর্তন করা (Conflict - Renamed vs Edited)
ধরা যাক, দুটি ব্রাঞ্চে একই ফাইল app.js ভিন্নভাবে পরিবর্তিত হয়েছে:
- Main ব্রাঞ্চ: ফাইলটির নাম পরিবর্তন করেছে।
- Feature ব্রাঞ্চ: ফাইলটিতে কিছু নতুন কোড যোগ করেছে।
এখন, আপনি যখন feature ব্রাঞ্চটি main ব্রাঞ্চের সাথে মর্জ করবেন, Git জানে না কোনটি রাখতে হবে—ফাইলের নাম পরিবর্তন করা বা ফাইলের মধ্যে পরিবর্তন করা।
Main ব্রাঞ্চ (ফাইলের নাম পরিবর্তন করা):
git mv app.js main.jsgit mv app.js main.jsFeature ব্রাঞ্চ (app.js এ পরিবর্তন করা):
console.log('Hello World');console.log('Hello World');Git কনফ্লিক্ট এভাবে দেখাবে:
error: The following untracked working tree files would be overwritten by checkout:
app.js
Please move or remove them before you can switch branches.
Abortingerror: The following untracked working tree files would be overwritten by checkout:
app.js
Please move or remove them before you can switch branches.
Abortingসমাধান:
এখানে আপনি ম্যানুয়ালি একে অপরের পরিবর্তনগুলিকে একত্রিত করতে পারেন:
git mv app.js main.jsদিয়ে নাম পরিবর্তন করুন এবং ফাইলটিতে নতুন কোড যোগ করুন।- এরপর
git addব্যবহার করে পরিবর্তনগুলো স্টেজ করুন।
৪. একটি ব্রাঞ্চে ফাইলের মধ্যে পরিবর্তন এবং অন্যটিতে একই ফাইলের নাম পরিবর্তন করা
ধরা যাক, file.txt ফাইলটি দুটি ব্রাঞ্চে আলাদা আলাদা ভাবে পরিবর্তিত হয়েছে:
- Main ব্রাঞ্চ: ফাইলটি মুছে ফেলেছে।
- Feature ব্রাঞ্চ: ফাইলটির কিছু অংশে পরিবর্তন করেছে।
এখন আপনি যখন এই দুটি ব্রাঞ্চ একত্রিত করবেন, Git মর্জ কনফ্লিক্ট তৈরি করবে, কারণ এক ব্রাঞ্চে ফাইলটি মুছে ফেলা হয়েছে এবং অন্যটিতে তা পরিবর্তন করা হয়েছে।
Main ব্রাঞ্চ (file.txt মুছে ফেলা):
git rm file.txtgit rm file.txtFeature ব্রাঞ্চ (file.txt পরিবর্তন):
This is a modified file.This is a modified file.সমাধান:
এখানে আপনাকে সিদ্ধান্ত নিতে হবে:
- যদি আপনি ফাইলটি মুছে ফেলতে চান, তবে
git rm file.txtব্যবহার করুন। - যদি আপনি ফাইলটির পরিবর্তন রাখতে চান, তবে
git add file.txtদিয়ে স্টেজ করুন।
৫. একাধিক ফাইলের কনফ্লিক্ট
অনেক সময় একাধিক ফাইলে কনফ্লিক্ট হতে পারে। ধরুন, আপনি feature ব্রাঞ্চে কাজ করছেন এবং main ব্রাঞ্চ থেকে কয়েকটি ফাইল মার্জ করতে যাচ্ছেন। যদি আপনি একাধিক ফাইলের মধ্যে পরিবর্তন করে থাকেন, তবে সেগুলির কনফ্লিক্ট একসাথে সমাধান করতে হবে।
প্রক্রিয়া:
- প্রথমে
git statusদিয়ে কনফ্লিক্টের ফাইলগুলো চেক করুন। - তারপর, প্রতিটি কনফ্লিক্টেড ফাইল খুলে এগুলোর মধ্যে পার্থক্য দেখে, কোন অংশ রাখবেন তা সিদ্ধান্ত নিন।
- শেষে,
git addদিয়ে সেগুলো স্টেজ করেgit commitদিয়ে কনফ্লিক্ট সমাধান করুন।
⚡️ কনফ্লিক্টের মধ্যে Avoid করার কৌশল
- নিয়মিত Pull করুন:
git pullকরে সর্বশেষ আপডেট নিয়ে আসুন। এতে কনফ্লিক্ট কম হবে। - ফিচার ব্রাঞ্চ ব্যবহার করুন: মূল ব্রাঞ্চে সরাসরি কাজ না করে, ফিচার ব্রাঞ্চে কাজ করুন।
- কনফ্লিক্ট শনাক্তকরণে মনোযোগ দিন: কোনো পরিবর্তন করলে প্রথমে
git statusচেক করুন। - কনফ্লিক্ট সমাধানকারী টুল ব্যবহার করুন: যেসব IDE গুলি Git সমর্থন করে, সেগুলি কনফ্লিক্ট সমাধানের জন্য সহায়ক টুল সরবরাহ করে।
🎯 সারাংশ
Git-এ Merge Conflict এমন একটি অবস্থা যেখানে দুটি ব্রাঞ্চের মধ্যে একই ফাইলের উপর পরিবর্তন থাকে। আপনি যখন দুটি ব্রাঞ্চ একত্রিত করবেন, Git জানে না কোন পরিবর্তনটি রাখতে হবে এবং কনফ্লিক্ট তৈরি হয়। তবে, ম্যানুয়ালি এই কনফ্লিক্ট সমাধান করা সম্ভব এবং বিভিন্ন ধাপে এই প্রক্রিয়া সম্পন্ন করা যায়।