আগের Merging lesson branch একসাথে করার একটা উপায় কভার করেছে। Rebasing একই লক্ষ্য অর্জন করে — একটা branch-কে আরেকটার সাথে আপডেট রাখা — সত্যিকারভাবে ভিন্ন একটা mechanism দিয়ে, ভিন্ন ফলাফল সহ।
দুটো history জোড়া দেওয়া একটা merge commit তৈরি করার বদলে, rebase একটা branch-এর commit একটা করে অন্য branch-এর সবচেয়ে সাম্প্রতিক commit-এর উপরে আবার চালায় — history-কে এমনভাবে পুনর্লিখন করে যেন branch-টা সবসময় সেই নতুন পয়েন্ট থেকে তৈরি হয়েছিল।
git switch feature-login
git rebase main
# feature-login-এর commit এখন main-এর সবচেয়ে সাম্প্রতিক commit-এর উপরে আবার চলে| git merge | git rebase |
|---|---|
| ঠিক যা ঘটেছে তা সংরক্ষণ করে, branch কোথায় জুড়েছে তা দেখানো একটা merge commit সহ | History-কে একটা একক পরিষ্কার, linear লাইনে পুনর্লিখন করে — কোনো merge commit না |
| বিদ্যমান commit-এর hash কখনো বদলায় না | প্রতিটা rebase করা commit-এর hash বদলায় — এরা সম্পূর্ণ নতুন commit হয়ে যায় |
| যেকোনো branch-এ নিরাপদ, shared হোক বা না হোক | শুধু কেউ ইতিমধ্যে pull করেনি এমন একটা branch-এ নিরাপদ |
কখনো shared history rebase করবেন না
ইতিমধ্যে push হয়ে অন্য কারো সাথে শেয়ার হওয়া একটা commit কখনো rebase করবেন না। Rebase commit history পুনর্লিখন করে — যে teammate ইতিমধ্যে পুরনো commit pull করেছে তার একটা repository হয়ে যায় যা বাকি সবার থেকে diverge করেছে বলে মনে হয়, আর এটা সমাধান করা সত্যিকারভাবে কষ্টকর। একটা local, unshared branch অবাধে rebase করুন; কখনো main, বা অন্য কেউও কাজ করছে এমন একটা branch rebase করবেন না।
# একটা pull request খোলার আগে, বেশ কয়েকটা ছোট "wip" commit
# কম, অর্থপূর্ণ commit-এ squash করুন — নিরাপদ কারণ branch এখনো shared না
git rebase -i HEAD~5| পরিস্থিতি | যুক্তিসঙ্গত পছন্দ |
|---|---|
| একটা shared branch, বা ইতিমধ্যে-push করা commit | git merge — এগুলো কখনো rebase করবেন না |
| একটা local, এখনো-push-না-করা feature branch, একটা পরিষ্কার history চাওয়া | git rebase main একটা common, নিরাপদ পছন্দ |