Git-এ Merge Conflict কী?
Git-এ Merge Conflict তখন ঘটে যখন দুটি ব্রাঞ্চকে মার্জ (merge) করার সময় Git স্বয়ংক্রিয়ভাবে পরিবর্তনগুলো একত্রিত করতে পারে না। এটি সাধারণত ঘটে যখন দুটি ব্রাঞ্চ একই ফাইলের একই অংশে আলাদা আলাদা পরিবর্তন করে, অথবা একটি ব্রাঞ্চ একটি ফাইল মুছে ফেলে এবং অন্যটি একই ফাইলটি পরিবর্তন করে।
Merge conflict অনেকসময় বিরক্তিকর হতে পারে, কিন্তু এটি Git ব্যবহার করার একটি স্বাভাবিক অংশ। এটি সঠিকভাবে বোঝা এবং সমাধান করার জন্য কিছু পদ্ধতি জানা প্রয়োজন।
🧠 Merge Conflict কিভাবে ঘটে?
Merge Conflict হওয়ার সাধারণ কারণ:
একই লাইনে দুটি আলাদা পরিবর্তন:
- যখন দুটি ব্রাঞ্চ একই লাইনে ভিন্ন ভিন্ন পরিবর্তন করে, Git তা একত্রিত করতে পারে না।
একটি ফাইল একটি ব্রাঞ্চে মুছে ফেলা, অন্যটিতে পরিবর্তন করা:
- যখন একটি ব্রাঞ্চ একটি ফাইল মুছে ফেলে এবং অন্যটি সেই ফাইলের মধ্যে পরিবর্তন করে, Git জানে না কি করা উচিত—ফাইলটি মুছে ফেলবে না কি পরিবর্তন গুলি রাখবে?
কনফ্লিক্টিং রিনেমস:
- যদি একটি ব্রাঞ্চ একটি ফাইলের নাম পরিবর্তন করে এবং অন্যটি সেই ফাইলটি পরিবর্তন করে, Git সেই পরিবর্তনগুলোর মধ্যে কনফ্লিক্ট হতে পারে।
উদাহরণ:
ধরা যাক আমাদের দুটি ব্রাঞ্চ আছে:
Main ব্রাঞ্চ-এ app.js
ফাইলের কোড এমন:
const greeting = "Hello, World!";
const greeting = "Hello, World!";
Feature/Add-feature ব্রাঞ্চ**-এ একই app.js
ফাইলটি এভাবে পরিবর্তিত হয়েছে:
const greeting = "Hi, World!";
const greeting = "Hi, World!";
এখন যদি আপনি feature/add-feature
ব্রাঞ্চটি main
ব্রাঞ্চের সাথে মর্জ করেন, Git জানতে পারবে না যে "Hello, World!" রাখা হবে না কি "Hi, World!" রাখা হবে, এবং এটি কনফ্লিক্টের সৃষ্টি করবে।
📋 Merge Conflict চেক করা
যখন কনফ্লিক্ট হবে, Git আপনাকে জানাবে এবং মার্জ প্রক্রিয়াটি থামিয়ে দেবে। উদাহরণস্বরূপ:
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
কিভাবে Git কনফ্লিক্ট মার্ক করে?
Git কনফ্লিক্ট সনাক্ত করার জন্য বিশেষ মার্কার ব্যবহার করে:
ফাইল app.js
কনফ্লিক্টে থাকলে, এটি এমন দেখাবে:
<<<<<<< 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
: মার্জ করা ব্রাঞ্চের কোড।
এখন আপনাকে ফাইলটি ম্যানুয়ালি এডিট করতে হবে এবং কনফ্লিক্ট সমাধান করতে হবে।
🛠️ Merge Conflict সমাধান
Step-by-Step প্রক্রিয়া:
কনফ্লিক্ট চেক করুন:
কনফ্লিক্ট পরবর্তী সময়ে Git স্ট্যাটাস চেক করুন:
bashgit status
git status
আপনি দেখবেন যে কনফ্লিক্টেড ফাইলগুলো "unmerged" হিসেবে মার্ক করা হয়েছে:
bashboth modified: app.js
both modified: app.js
কনফ্লিক্টেড ফাইল খুলুন:
উদাহরণস্বরূপ,
app.js
ফাইলটি খুলুন, সেখানে কনফ্লিক্ট মার্কার থাকবে।ফাইলটি এডিট করুন এবং কনফ্লিক্ট সমাধান করুন:
আপনি কনফ্লিক্ট মার্কারগুলো মুছে ফেলুন এবং নিজের পছন্দমত কোড রাখুন:
javascriptconst greeting = "Hello, World! and Hi, World!";
const greeting = "Hello, World! and Hi, World!";
অথবা আপনি সিদ্ধান্ত নিতে পারেন যে, শুধুমাত্র একটি পরিবর্তন রাখবেন:
javascriptconst greeting = "Hello, World!";
const greeting = "Hello, World!";
ফাইলটি স্টেজ করুন:
কনফ্লিক্ট সমাধান করার পর, ফাইলটি আবার স্টেজ করতে হবে:
bashgit add app.js
git add app.js
কমিট করুন:
তারপর আপনি কনফ্লিক্ট সমাধান করা ফাইলটি কমিট করুন:
bashgit commit
git commit
Git স্বয়ংক্রিয়ভাবে একটি মার্জ কমিট মেসেজ জেনারেট করবে, কিন্তু আপনি সেটি পরিবর্তন করতে পারেন।
🛑 Merge Conflict এর ধরন
1. কনটেন্ট কনফ্লিক্ট (একই অংশে পরিবর্তন):
এটি সবচেয়ে সাধারণ কনফ্লিক্ট, যেখানে দুটি ব্রাঞ্চ একই অংশে আলাদা পরিবর্তন করে।
উদাহরণ:
- Main ব্রাঞ্চ:
app.js
ফাইলে একটি লাইন যুক্ত করে। - Feature ব্রাঞ্চ:
app.js
ফাইলে সেই একই লাইনটি পরিবর্তন করে।
Git জানে না কোনটি রাখতে হবে এবং কনফ্লিক্ট হয়।
2. ফাইল মুছে ফেলা কনফ্লিক্ট:
একটি ব্রাঞ্চ একটি ফাইল মুছে ফেলে এবং অন্য ব্রাঞ্চ সেই ফাইলটিতে কিছু পরিবর্তন করে।
উদাহরণ:
- Main ব্রাঞ্চ:
app.css
ফাইলটি মুছে ফেলে। - Feature ব্রাঞ্চ:
app.css
ফাইলটির মধ্যে নতুন স্টাইল যোগ করে।
এখন, যখন আপনি মর্জ করবেন, Git জানবে না কি করতে হবে—ফাইলটি মুছে ফেলবে না কি পরিবর্তনগুলো রাখতে হবে।
3. বাইনারি ফাইল কনফ্লিক্ট:
বাইনারি ফাইল (যেমন: ইমেজ, পিডিএফ, ইত্যাদি) মর্জ করা যায় না, তাই সেগুলিতে কনফ্লিক্ট হলে Git সেই কনফ্লিক্ট দেখাবে।
🛠️ Merge Conflict এভয়েড করার কৌশল
1. প্রতিনিয়ত কমিট করুন:
ছোট ছোট পরিবর্তন নিয়ে সারা দিনে বারবার কমিট করুন, যাতে বড় কনফ্লিক্ট এড়ানো যায়।
2. নিয়মিত Pull করুন:
আপনি যখনই নতুন কিছু কাজ শুরু করবেন, নিয়মিত রিপোজিটরি থেকে Pull করুন, যাতে আপনি অন্যদের পরিবর্তনগুলির সাথে আপডেট থাকতে পারেন।
git pull origin main
git pull origin main
3. ফিচার ব্রাঞ্চ ব্যবহার করুন:
কখনও সরাসরি main
ব্রাঞ্চে কাজ করবেন না। প্রতিটি নতুন ফিচারের জন্য নতুন ব্রাঞ্চ তৈরি করুন, যাতে অন্যান্য ব্রাঞ্চের সাথে মার্জ করার সময় কনফ্লিক্ট কম হবে।
4. টিমের সাথে যোগাযোগ করুন:
টিমের সদস্যদের সাথে যোগাযোগ রাখুন এবং একসাথে কাজ না করা জায়গায় পরিবর্তন করতে চেষ্টা করুন।
🎯 উদাহরণ
Scenario 1: Same Line Modified Conflict
Main ব্রাঞ্চ:
javascriptconst greeting = "Hello, World!";
const greeting = "Hello, World!";
Feature ব্রাঞ্চ:
javascriptconst greeting = "Hi, World!";
const greeting = "Hi, World!";
মর্জ করার পর, ফাইলের মধ্যে কনফ্লিক্ট দেখা যাবে:
javascript<<<<<<< HEAD const greeting = "Hello, World!"; ======= const greeting = "Hi, World!"; >>>>>>> feature
<<<<<<< HEAD const greeting = "Hello, World!"; ======= const greeting = "Hi, World!"; >>>>>>> feature
Scenario 2: File Deletion Conflict
- Main ব্রাঞ্চ: মুছে ফেলেছে
app.js
- Feature ব্রাঞ্চ: পরিবর্তন করেছে
app.js
এখন আপনি যখন মর্জ করবেন, Git জানবে না কি করতে হবে—ফাইলটি মুছে ফেলবে না কি ফিচার ব্রাঞ্চের পরিবর্তনগুলো রাখবে।
💡 সারাংশ
- Merge Conflict তখন ঘটে যখন Git একসাথে দুটি পরিবর্তন মর্জ করতে পারে না।
- এটি সাধারণত ঘটে যখন একাধিক ব্রাঞ্চ একই ফাইলের একই অংশে আলাদা আলাদা পরিবর্তন করে।
- কনফ্লিক্ট সমাধান করতে, আপনাকে ম্যানুয়ালি ফাইলটি এডিট করে, কনফ্লিক্ট মার্কার সরিয়ে কোডকে সঠিকভাবে যুক্ত করতে হবে।
- কনফ্লিক্ট এড়ানোর জন্য নিয়মিত Pull, ছোট ছোট কমিট, এবং ফিচার ব্রাঞ্চ ব্যবহার করা ভালো।
Git-এ কনফ্লিক্ট একটি সাধারণ ব্যাপার হলেও, এটি সঠিকভাবে সমাধান করলে কাজটি অনেক সহজ হয়ে যায়।