Rebase — بازنویسی تاریخچه برای خط تمیز
انتقال کامیتها به پایه جدید با git rebase، تفاوت با merge و قانون طلایی استفاده امن از rebase.
Rebase چیست؟
git rebase کامیتهای شاخه شما را برمیدارد و دوباره روی یک پایه جدید مینویسد (re-base = باز-پایهگذاری). نتیجه: تاریخچه خطی و تمیز بدون کامیتهای merge زیاد.
مشکلی که rebase حل میکند
شاخه شما از main جدا شده، اما main هم پیش رفته. حالا میخواهید شاخهتان آخرین تغییرات main را داشته باشد:
وضعیت فعلی:
A---B---C---D (main)
\
E---F (feature)
دو راه:
راه ۱: merge (که بلدید)
git switch feature
git merge main
# کامیت merge ساخته میشود:
A---B---C---D---------M (feature)
\ /
E---F---
کار میکند، اما تاریخچه پر از کامیتهای merge میشود.
راه ۲: rebase (تمیزتر)
git switch feature
git rebase main
# Successfully rebased and updated refs/heads/feature.
کامیتهای E و F انگار از D جدا شدهاند:
A---B---C---D (main)
\
E"---F" (feature)
تاریخچه کاملاً خطی شد! (E" و F" کپیهای جدید با شناسه متفاوتاند)
rebase در عمل
# ۱. به شاخهای بروید که میخواهد rebase شود:
git switch feature
# ۲. rebase روی main:
git rebase main
# ۳. اگر تعارض شد:
# فایلها را حل کنید، بعد:
git add .
git rebase --continue
# یا فرار از کل rebase:
git rebase --abort
تعارض در rebase
برخلاف merge که یکجا تعارض میدهد، rebase کامیت به کامیت جلو میرود و ممکن است چند بار تعارض ببینید:
CONFLICT (content): Merge conflict in app.py
error: could not apply E... کامیت اول feature
hint: Resolve all conflicts manually, mark them as resolved with "git add"
برای هر کامیت: حل کنید → git add . → git rebase --continue
Interactive Rebase — قدرتمندترین ابزار
با -i میتوانید کامیتهای شاخه را بازآرایی کنید:
git rebase -i main
ویرایشگر لیست کامیتها را نشان میدهد:
pick a1b2c3d کامیت اول
pick e5f6g7h کامیت دوم
pick i9j0k1l کامیت سوم
با تغییر pick به:
| دستور | کار |
|---|---|
pick | همانطور که هست نگه دار |
squash | با کامیت قبلی یکی کن (ادغام!) ⭐ |
reword | فقط پیام را عوض کن |
drop | حذف کامیت |
edit | توقف برای ویرایش محتوا |
مثال معروف: ۵ کامیت «کار نیمهکاره» را در یک کامیت تمیز squash کنید قبل از PR!
⚠️ قانون طلایی Rebase
قانون عملی:
- ✅ rebase شاخه محلی شخصی روی main — عالی
- ✅ rebase شاخه شخصیتان که فقط خودتان رویش کار میکنید
- ❌ rebase شاخه main یا هر شاخه تیمی مشترک
merge یا rebase؟
| ویژگی | merge | rebase |
|---|---|---|
| تاریخچه | واقعی (همانطور که بود) | خطی و تمیز (بازنویسیشده) |
| کامیت اضافه | کامیت merge میسازد | نه |
| امنیت برای شاخه عمومی | ✅ | ❌ |
| تعارض | یکجا | ممکن است چند بار |
| ترفند حفظ | «واقعیت را نگه دار» | «تمیزی را نگه دار» |
خلاصه
- rebase کامیتها را روی پایه جدید بازنویسی میکند — تاریخچه خطی
git rebase mainشاخه فعلی را روی main میبرد-iبرای squash و مرتبسازی کامیتها قبل از PR- قانون طلایی: شاخه عمومی push شده را rebase نکن!
این مبحث بخشی از دوره آموزش کامل Git است.