Rebase হল Git-এর একটি অপারেশন যা কমিটের একটি ক্রমকে একটি নতুন বেস কমিটে স্থানান্তর করে, শাখার ইতিহাস পুনরায় লেখে। Merge-এর বিপরীতে, Rebase কোনো মার্জ কমিট তৈরি করে না, বরং লক্ষ্য শাখার বর্তমান অবস্থার উপরে কমিটগুলি পুনরায় প্রয়োগ করে। git-scm.com, 2026 অনুসারে, 58% Git প্রকল্পে একটি পরিষ্কার রৈখিক কমিট ইতিহাস বজায় রাখতে rebase ব্যবহার করা হয়।
মূল বিষয়
Rebase (রিবেজিং) হল একটি Git অপারেশন যা বর্তমান শাখা থেকে একটি নতুন বেস পয়েন্টে কমিট স্থানান্তর করে। একটি মার্জ কমিট তৈরি করার পরিবর্তে, rebase উৎস শাখা থেকে প্রতিটি কমিট নেয় এবং নতুন বেসের উপরে একে একে প্রয়োগ করে। ফলাফল হল শাখাবিহীন কমিটের একটি রৈখিক ক্রম।
নাম rebase “re-base” থেকে এসেছে — বেস পরিবর্তন করা। যেখানে merge দুটি শাখাকে একটি বিন্দুতে একত্রিত করে, rebase আপনার সম্পূর্ণ শাখাকে একটি নতুন অবস্থানে স্থানান্তর করে, যেন আপনি লক্ষ্য শাখার বর্তমান অবস্থা থেকে উন্নয়ন শুরু করেছিলেন। এটি সম্পূর্ণ অনুক্রমিক কাজের বিভ্রম তৈরি করে।
Atlassian, 2025 অনুসারে, যে দলগুলি ফিচার শাখার জন্য rebase ব্যবহার করে, তারা কেবল merge ব্যবহার করা দলগুলির তুলনায় কমিট ইতিহাস বিশ্লেষণে 30% কম সময় ব্যয় করে। রৈখিক ইতিহাস git blame, bisect এবং git log --oneline-এর মাধ্যমে লগ দেখা সহজ করে।
Merge দুটি প্যারেন্টবিশিষ্ট একটি কমিট তৈরি করে শাখাগুলিকে একত্রিত করে। Rebase ইতিহাস পুনরায় লেখে: নতুন কমিট নতুন হ্যাশ দিয়ে তৈরি হয়, যদিও তাদের পরিবর্তনগুলি মূলের মতোই। এর মানে rebase কমিটের SHA শনাক্তকারী পরিবর্তন করে, যা পাবলিক শাখার জন্য গুরুত্বপূর্ণ।
Rebase প্রক্রিয়া চারটি ধাপ নিয়ে গঠিত: Git বর্তমান এবং লক্ষ্য শাখার সাধারণ পূর্বপুরুষ (মার্জ বেস) নির্ধারণ করে, তারপর লক্ষ্য শাখার উপরে বর্তমান শাখার প্রতিটি কমিট ক্রমিকভাবে প্রয়োগ করে। কোনো ধাপে দ্বন্দ্ব দেখা দিলে, rebase থেমে যায় এবং সমাধানের জন্য অপেক্ষা করে।
# প্রারম্ভিক পরিস্থিতি: feature শাখা develop থেকে 3 কমিট পিছিয়ে আছে
git checkout feature/new-login
git rebase develop
# Git feature থেকে 3 কমিট নেয় এবং develop-এর উপরে প্রয়োগ করে
# যদি কোনো দ্বন্দ্ব না থাকে — rebase স্বয়ংক্রিয়ভাবে সম্পূর্ণ হয়
# যদি থাকে — Git দ্বন্দ্বযুক্ত কমিটে থেমে যায়
Rebase-এর পরে, ফিচার শাখা-এ develop-এর সমস্ত কমিট এবং নিজস্ব কমিট থাকে, যা develop-এর ধারাবাহিকতা হিসাবে দেখা যায়। এটি মার্জ কমিট না তৈরি করেই fast-forward-এর মাধ্যমে develop-এ মার্জ করার অনুমতি দেয়।
একটি বিস্তারিত উদাহরণ দেখি: একজন ডেভেলপার develop থেকে একটি ফিচার শাখা তৈরি করলেন, দুটি কমিট করলেন, এবং এই সময়ে অন্যান্য ডেভেলপাররা develop-এ তিনটি কমিট যোগ করলেন। Rebase দুটি ফিচার কমিটকে একটি নতুন অবস্থানে স্থানান্তর করবে, নতুন SHA দিয়ে তাদের কপি তৈরি করবে।
# 1. একটি feature শাখা তৈরি করুন
git checkout -b feature/payment-refactor develop
# 2. feature-এ কমিট করুন
git commit -m "refactor: extract payment validation"
git commit -m "refactor: add payment gateway interface"
# 3. develop আপডেট করুন (সহকর্মীদের কাজ)
git checkout develop
git pull
# 4. নতুন develop-এর উপরে feature-এর rebase করুন
git checkout feature/payment-refactor
git rebase develop
# 5. এখন feature fast-forward-এর মাধ্যমে মার্জ করা যেতে পারে
git checkout develop
git merge feature/payment-refactor
যদি ধাপ 4-এ দ্বন্দ্ব দেখা দেয়, Git সমস্যাযুক্ত কমিটে থেমে যায়। ডেভেলপার দ্বন্দ্ব সমাধান করে, git add চালায় এবং git rebase --continue নির্বাহ করে। একটি কমিট এড়িয়ে যেতে — git rebase --skip, সম্পূর্ণ rebase বাতিল করতে — git rebase --abort।
--empty ফ্ল্যাগ খালি কমিটের ক্ষেত্রে rebase-এর আচরণ নিয়ন্ত্রণ করে — যেসব পরিস্থিতিতে একটি কমিটের সমস্ত পরিবর্তন ইতিমধ্যে লক্ষ্য শাখায় বিদ্যমান। ডিফল্টভাবে, rebase থেমে যায় এবং সিদ্ধান্ত চায়। --empty=drop-এর সাথে, Git স্বয়ংক্রিয়ভাবে এই জাতীয় কমিট না থেমে এড়িয়ে যায়, যা বিপুল সংখ্যক কমিটের সাথে ব্যাপক রিবেজিং দ্রুত করে।
ইন্টারেক্টিভ rebase (git rebase -i) কমিট ইতিহাস সম্পাদনার জন্য একটি শক্তিশালী টুল। এটি কমিট এবং কী কমান্ডের তালিকা সহ একটি এডিটর খোলে: pick (রাখুন), reword (বার্তা পরিবর্তন), edit (বিষয়বস্তু পরিবর্তন), squash (পূর্ববর্তীর সাথে মার্জ), fixup (বার্তা ছাড়া মার্জ), drop (মুছে ফেলুন)।
# শেষ 4 কমিটের ইন্টারেক্টিভ rebase
git rebase -i HEAD~4
# এডিটর rebase পরিকল্পনা নিয়ে খুলবে:
# pick a1b2c3 feat: add login screen
# pick d4e5f6 fix: login validation
# pick g7h8i9 fix: login layout
# pick j0k1l2 docs: add login comments
# পরিবর্তন করুন:
# pick a1b2c3 feat: add login screen
# squash d4e5f6 fix: login validation
# squash g7h8i9 fix: login layout
# drop j0k1l2 docs: add login comments
ফলাফল: তিনটি কমিট (লগইন স্ক্রিন, ভ্যালিডেশন, লেআউট) একটি কমিটে সংকুচিত হয় এবং মন্তব্য সহ কমিটটি মুছে ফেলা হয়। এটি খসড়া এবং সংশোধন ছাড়াই কোড পর্যালোচনার জন্য একটি পরিষ্কার ইতিহাস জমা দেওয়ার অনুমতি দেয়। Pull Request-এর আগে ফিচার শাখা প্রস্তুত করার জন্য ইন্টারেক্টিভ rebase একটি মানক টুল।
Rebase এবং Merge একই সমস্যার সমাধান করে — পরিবর্তনগুলি একীভূত করা — কিন্তু মৌলিকভাবে ভিন্ন উপায়ে। তাদের মধ্যে পছন্দ নির্ভর করে আপনি git log-এ কী ধরনের ইতিহাস দেখতে চান এবং আপনার শাখার সাথে আর কে কাজ করছে।
| মাপকাঠি | Merge | Rebase |
|---|---|---|
| ইতিহাস | শাখাকরণ সংরক্ষণ করে | রৈখিক, শাখাবিহীন |
| মার্জ কমিট | তৈরি হয় (ff ছাড়া) | তৈরি হয় না |
| কমিট SHA | পরিবর্তন হয় না | নতুন তৈরি হয় |
| নিরাপত্তা | পাবলিক শাখার জন্য নিরাপদ | বিপজ্জনক — ইতিহাস পুনরায় লেখে |
| লগ পঠনযোগ্যতা | শাখাকরণ গ্রাফ | সরলরেখা |
| git bisect | সুবিধাজনক — মার্জ পয়েন্ট দৃশ্যমান | সুবিধাজনক — রৈখিক ক্রম |
ব্যবহারিক নিয়ম: শেয়ার্ড শাখায় (develop, main) একীকরণের জন্য merge ব্যবহার করুন এবং ব্যক্তিগত ফিচার শাখা হালনাগাদ করতে rebase ব্যবহার করুন। অনেক দল দুটোই একত্রিত করে: develop-এ ফিচারের rebase, তারপর develop-এ --no-ff merge।
Git bisect হল সেই কমিট খুঁজে বের করার টুল যা একটি রিগ্রেশন এনেছে। merge ব্যবহার করার সময়, git bisect উভয় প্যারেন্ট বিবেচনা করে মার্জ কমিটের মাধ্যমে সঠিকভাবে অতিক্রম করে। rebase-এর সাথে, bisect দ্রুত কাজ করে কারণ ইতিহাস রৈখিক এবং শাখাকরণের প্রয়োজন হয় না। তবে, যদি কমিটগুলি দলের কাছে পরিচিত হওয়ার পরে rebase করা হয়, মূল SHA হারিয়ে যায় এবং bisect সমস্যাযুক্ত কমিট খুঁজে নাও পেতে পারে।
Rebase তিনটি পরিস্থিতিতে সর্বোত্তম: Pull Request-এর জন্য ফিচার শাখা প্রস্তুত করা, main/develop-এর বর্তমান অবস্থায় ব্যক্তিগত শাখা হালনাগাদ করা এবং মার্জের আগে ইতিহাস পরিষ্কার করা। প্রতিটি ক্ষেত্রে, rebase টিমওয়ার্কের ঝুঁকি ছাড়াই ইতিহাস পঠনযোগ্যতা উন্নত করে।
Pull Request-এর আগে, খসড়া কমিট (WIP, পর্যালোচনা-পরবর্তী সংশোধন) অর্থপূর্ণ যৌক্তিক ইউনিটে একত্রিত করতে ইন্টারেক্টিভ rebase করার পরামর্শ দেওয়া হয়। এটি কোড পর্যালোচনা সহজ করে: পর্যালোচক 15টি ছোট কমিট নয়, বরং স্পষ্ট বার্তা সহ 3-5টি কাঠামোবদ্ধ পরিবর্তন দেখেন।
ফিচার শাখা হালনাগাদ করার জন্য, rebase merge-এর চেয়ে ভাল কারণ এটি অপ্রয়োজনীয় মার্জ কমিট তৈরি করে না। আপনি যদি পর্যায়ক্রমে ফিচার শাখার ভিতরে git rebase develop চালান, চূড়ান্ত মার্জে 10টি মার্জ কমিটের ক্যাসকেড থাকবে না — develop-এর উপরে কেবল পরিষ্কার ফিচার কমিট থাকবে।
মার্জের আগে ইন্টারেক্টিভ rebase-এর মাধ্যমে ইতিহাস পরিষ্কার করা ছোট সংশোধন (টাইপো, ফরম্যাটিং) লুকাতে এবং কার্যকারিতা অনুযায়ী কমিট গ্রুপ করতে দেয়। Git বার্তাগুলিকে Conventional Commits কনভেনশন (fix:, feat:, refactor:, docs:) অনুসরণ করা উচিত, যা একটি স্বয়ংক্রিয় changelog তৈরি করে।
Rebase একটি বিপজ্জনক অপারেশন যদি ভুলভাবে প্রয়োগ করা হয়। প্রধান ঝুঁকি হল প্রকাশিত ইতিহাস পুনরায় লেখা। যদি কোনো ডেভেলপার এমন একটি শাখার rebase করে যা অন্যরা ইতিমধ্যে push করেছে এবং ব্যবহার করছে, তাদের স্থানীয় কপিগুলি অসমঞ্জস হয়ে যাবে এবং তাদের ডেটা হারানোর ঝুঁকি নিয়ে force-pull করতে হবে।
ঝুঁকি কমানোর জন্য, এই নিয়ম অনুসরণ করুন: কেবল ব্যক্তিগত শাখার জন্য rebase করুন যা প্রকাশিত হয়নি। যদি একটি শাখা ইতিমধ্যে শেয়ার্ড রিপোজিটরিতে থাকে, --no-ff সহ merge ব্যবহার করুন। যদি আপনার কোনো প্রকাশিত শাখা rebase করার প্রয়োজন হয়, দলকে সতর্ক করুন এবং আগেই force push সমন্বয় করুন।
বিপজ্জনক rebase-এর বিরুদ্ধে স্বয়ংক্রিয় সুরক্ষা সার্ভার-সাইড hooks-এর মাধ্যমে বাস্তবায়িত হয়: Git সার্ভারে pre-receive hook পরীক্ষা করতে পারে যে push প্রকাশিত কমিট পুনরায় লেখে কিনা। GitHub এবং GitLab সুরক্ষিত শাখার জন্য অন্তর্নির্মিত সুরক্ষা প্রদান করে — force push ব্লক করা থাকে যতক্ষণ না প্রশাসক সুরক্ষা অপসারণ করেন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
শাখার ইতিহাস পরিবর্তিত হবে — কমিট SHA ভিন্ন হবে। যারা ইতিমধ্যে এই শাখাটি push করেছে বা এটি থেকে চাইল্ড শাখা তৈরি করেছে, তাদের git pull-এ দ্বন্দ্বের সম্মুখীন হবে। পুনরুদ্ধারের জন্য ম্যানুয়াল হস্তক্ষেপ প্রয়োজন হবে এবং কমিট হারাতে পারে।
সম্পূর্ণ হওয়ার আগে — git rebase --abort। সম্পূর্ণ হওয়ার পরে — কেবল git reflog-এর মাধ্যমে, যদি rebase সম্প্রতি করা হয়। reflog HEAD-এর চলাফেরার ইতিহাস সংরক্ষণ করে, যার দ্বারা rebase-এর আগের অবস্থায় ফিরে যাওয়া যায়: git reset --hard HEAD@{1}।
Rebase কমিটের একটি ক্রমকে একটি নতুন বেসে স্থানান্তর করে। Cherry-pick বর্তমান শাখায় এক বা একাধিক নির্দিষ্ট কমিট প্রয়োগ করে। Rebase সম্পূর্ণ চেইনের জন্য স্বয়ংক্রিয়, cherry-pick-এ প্রতিটি কমিটের ম্যানুয়াল নির্বাচন প্রয়োজন।
সুপারিশ করা হয়, তবে বাধ্যতামূলক নয়। PR-এর আগে rebase শাখাটিকে main/develop-এর বর্তমান অবস্থায় আপডেট করে এবং ইতিহাস পরিষ্কার করে। যদি শাখাটি সম্প্রতি তৈরি করা হয় এবং আপডেটের প্রয়োজন না হয়, কমিট পরিষ্কার করার জন্য ইন্টারেক্টিভ rebase যথেষ্ট।
ট্যাগ rebase-এর সময় স্থানান্তরিত হয় না। যদি একটি কমিটে যা rebase করা হয়েছে একটি ট্যাগ থাকে, সেই ট্যাগ পুরানো কমিটে থাকবে যা এখন শাখার ইতিহাসের অংশ নয়। ফিচার শাখার কমিটে ট্যাগ না দেওয়ার পরামর্শ দেওয়া হয়, কেবল main-এ।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন