আগের পর্বে আমরা শিখেছি কীভাবে branch তৈরি করে একাধিক কাজ আলাদাভাবে পরিচালনা করা যায়। কিন্তু একটি branch-এর কাজ শেষ হলে সেটাকে তো main branch-এর সাথে একত্র করতে হবে — এই কাজটাই করে Merge।
Merge কী?
Merge হলো দুটি branch-এর পরিবর্তন একসাথে করার প্রক্রিয়া। ধরো তুমি
feature-navbar
branch-এ navbar তৈরি করেছ, এখন সেটা main
branch-এ যুক্ত করতে চাও। এজন্য প্রথমে main branch-এ যেতে হবে, তারপর merge
command চালাতে হবে:
git switch main git merge feature-navbar
এই command চালালে feature-navbar
branch-এর সব commit main branch-এ যুক্ত হয়ে যাবে।
Fast-forward Merge
যদি main branch-এ, feature branch তৈরি হওয়ার পর থেকে কোনো নতুন commit না হয়ে থাকে, তাহলে Git খুব সহজভাবে merge করে ফেলে — একে বলে Fast-forward merge। এখানে Git শুধু main branch-এর pointer-টিকে সামনের দিকে সরিয়ে দেয়, নতুন কোনো commit তৈরি করে না।
আগে:
main ──●
\
feature ●──●──●
পরে (Fast-forward):
main ──●────●──●──●
3-way Merge
কিন্তু যদি feature branch তৈরি হওয়ার পর main branch-এও নতুন commit যুক্ত হয়ে থাকে (যেমন অন্য কেউ push করেছে), তখন Git দুটো branch-এর common history বিবেচনা করে একটি নতুন merge commit তৈরি করে। একে বলে 3-way merge।
main ──●────●──────● (merge commit)
\ /
feature ●──●──●
এই merge commit-এ দুটো parent থাকে — একটি main-এর সর্বশেষ commit, আরেকটি feature branch-এর সর্বশেষ commit। এভাবে দুটো branch-এর history একসাথে সংরক্ষিত থাকে।
Merge Conflict কী এবং কেন হয়?
Merge conflict তখন হয়, যখন দুটো branch-এ একই file-এর একই line ভিন্নভাবে পরিবর্তন করা হয়েছে। তখন Git বুঝতে পারে না কোন পরিবর্তনটা রাখা উচিত, তাই সে মানুষকে সিদ্ধান্ত নিতে বলে।
উদাহরণ: ধরো main branch-এ কেউ একটি heading পরিবর্তন করেছে, আর একই সময়ে তোমার feature branch-এও সেই একই heading অন্যভাবে পরিবর্তন করা হয়েছে। Merge করার সময় Git এই দুটো পরিবর্তনের মধ্যে সিদ্ধান্ত নিতে পারবে না।
Conflict হলে কেমন দেখতে হয়?
Merge করার সময় conflict হলে Git terminal-এ জানিয়ে দেয়:
CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
আর যে file-এ conflict হয়েছে, সেখানে Git বিশেষ চিহ্ন দিয়ে দুটো ভার্সন দেখিয়ে দেয়:
<<<<<<< HEAD <h1>আমাদের প্রজেক্টে স্বাগতম</h1> ======= <h1>স্বাগতম আমার নতুন ওয়েবসাইটে</h1> >>>>>>> feature-navbar
এখানে—
-
<<<<<<< HEADথেকে=======পর্যন্ত — main branch-এর version -
=======থেকে>>>>>>>পর্যন্ত — feature branch-এর version
Conflict সমাধান করার ধাপ
Conflict সমাধান করা মূলত কয়েকটি ধাপে করতে হয়:
- Conflict হওয়া file-টি text editor-এ খোলো
- কোন version রাখবে (নাকি দুটোই মিলিয়ে নতুন কিছু লিখবে) তা ঠিক করো
-
<<<<<<<,=======,>>>>>>>চিহ্নগুলো সম্পূর্ণভাবে মুছে ফেলো - চূড়ান্ত সঠিক content রেখে file save করো
উদাহরণস্বরূপ, উপরের conflict-টি এভাবে সমাধান করা যেতে পারে:
<h1>স্বাগতম আমাদের নতুন ওয়েবসাইটে</h1>
File ঠিক করার পর সেটাকে stage করে commit করতে হবে:
git add index.html git commit -m "Resolve merge conflict in heading"
টিপস: conflict সমাধান করার সময় ঘাবড়ানোর কিছু নেই — Git কোনো কাজ হারিয়ে ফেলে না, শুধু মানুষের সিদ্ধান্তের জন্য অপেক্ষা করে।
Conflict এড়ানোর ভালো অভ্যাস
- Branch-গুলো বেশিদিন আলাদা না রেখে নিয়মিত main-এর সাথে sync রাখা
- একটি branch-এ ছোট, নির্দিষ্ট কাজ রাখা (বড় branch বেশি conflict তৈরি করে)
- Team-এ কাজ করলে কে কোন অংশ নিয়ে কাজ করছে তা আগে থেকে জানিয়ে রাখা
- Merge করার আগে
git pullদিয়ে সর্বশেষ পরিবর্তন এনে নেওয়া
Pull Request-এর ধারণা
এতক্ষণ আমরা যে merge শিখলাম, সেটা আমরা নিজের computer-এ (local-এ) করেছি। কিন্তু GitHub-এ team-এর সাথে কাজ করার সময় সরাসরি merge না করে Pull Request (PR) ব্যবহার করা হয়।
Pull Request হলো GitHub-এ একটি অনুরোধ, যেখানে তুমি বলো — "আমার এই branch-এর পরিবর্তনগুলো main branch-এ যুক্ত করতে চাই, দয়া করে review করো।" এতে team-এর অন্য সদস্যরা—
- Code পড়ে দেখতে পারে (Review)
- Comment বা প্রশ্ন করতে পারে
- পরিবর্তনের সাথে একমত হলে Approve করতে পারে
- Approve হলে GitHub-এর website থেকেই merge করা যায়
এভাবে সরাসরি main branch-এ কেউ চাইলেই কিছু push করতে পারে না — প্রতিটি পরিবর্তন review-এর মধ্য দিয়ে যায়, যা project-এর মান ভালো রাখতে সাহায্য করে। Pull Request নিয়ে বিস্তারিত ও হাতে-কলমে অনুশীলন আমরা করব পরের পর্বে।
আজকের কমান্ডগুলো এক নজরে
git switch main → merge করার আগে main-এ যাওয়া git merge branch-নাম → branch merge করা git add ফাইলের-নাম → conflict সমাধানের পর stage করা git commit → merge commit সম্পন্ন করা
Practice Task
এখন নিজে হাতে নিচের কাজগুলো করে দেখো:
- একটি নতুন branch তৈরি করে সেখানে একটি file পরিবর্তন করে commit করো।
- main branch-এ ফিরে গিয়ে ইচ্ছাকৃতভাবে সেই একই line অন্যভাবে পরিবর্তন করে commit করো।
- এখন
git mergeচালিয়ে conflict তৈরি করো। - Conflict marker দেখে file-টি ঠিক করো এবং merge সম্পন্ন করো।
আজ আমরা শিখলাম কীভাবে branch merge করতে হয়, merge conflict কেন হয় এবং কীভাবে সেটা সমাধান করতে হয়, আর Pull Request কী তার প্রাথমিক ধারণাও পেলাম। পরের পর্বে, এই সিরিজের শেষ পর্বে, আমরা fork করা, Pull Request পাঠানো এবং GitHub Issues নিয়ে হাতে-কলমে একটি mini project সম্পূর্ণভাবে Git দিয়ে ট্র্যাক করে GitHub-এ push করব।