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 تیز ہو جاتا ہے۔
انٹرایکٹو 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
نتیجہ: تین کمٹس (لاگ ان سکرین، توثیق، لے آؤٹ) ایک میں سمٹ جاتے ہیں اور تبصروں والا کمٹ حذف ہو جاتا ہے۔ یہ ڈرافٹ اور تصحیحات کے بغیر کوڈ جائزہ کے لیے صاف ستھری تاریخ جمع کروانے کی اجازت دیتا ہے۔ انٹرایکٹو rebase Pull Request سے پہلے فیچر برانچ تیار کرنے کا ایک معیاری ٹول ہے۔
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 کے خلاف خودکار تحفظ سرور سائیڈ ہکس کے ذریعے نافذ کیا جاتا ہے: 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔