ریبیس تعاملی گیت اونقدرها هم ترسناک نیست
خلاصهٔ کاملتر
نویسنده که خودش تازه اول مسیر حرفهایشه، تو این پست میگه یکی از عجیبترین چیزهایی که تو کار دیده، ترس گستردهٔ برنامهنویسها — حتی آدمهایی که بهمراتب باتجربهتر از خودشن — از دستور git rebase -i هست. حرف اصلی پست اینه که این دستور کار مرموزی نمیکنه: فقط یه فایل متنی باز میکنه با فهرست کامیتهایی که قراره دوباره پخش بشن.
مثلاً git rebase -i HEAD~4 چیزی شبیه این نشون میده:
pick a1b2c3d Add user model
pick e4f5g6h Fix typo in user model
pick i7j8k9l Add login endpoint
pick m0n1o2p WIP debugging loginهر خط یه دستوره و میتونی قاطیشون کنی: pick یعنی کامیت همونطور بمونه، r (reword) یعنی وایسه تا پیام کامیت رو عوض کنی، s (squash) یعنی با کامیت قبلی ادغام بشه، f (fixup) مثل squash ولی بدون نگهداشتن پیام، و d (drop) یعنی کامیت کلاً حذف بشه — که پاککردن خودِ خط هم همین کارو میکنه.
r a1b2c3d Add user model
pick e4f5g6h Fix typo in user model
pick i7j8k9l Add login endpoint
d m0n1o2p WIP debugging loginنتیجهٔ این نقشه سه کامیت بهجای چهارتاست، در حالی که دوتای وسطی دستنخورده موندن. نویسنده تأکید میکنه تا وقتی فایل رو ذخیره نکردی هنوز هیچی اجرا نشده و با git rebase --abort شاخه دقیقاً برمیگرده سر جای اولش.
دلیل دومی که به گفتهٔ نویسنده گمکردن کار سخته، مدل ذهنی درست از ریبیسه: ریبیس کامیتهای قدیمی رو ویرایش نمیکنه، کامیتهای تازه میسازه و فقط اشارهٔ شاخه رو جابهجا میکنه. کامیتهای قبلی تا مدتی بدون ارجاع ولی سالم تو دیتابیس آبجکتهای گیت میمونن. سوم هم رفلاگه؛ با git reflog میشه ورودی قبل از ریبیس رو پیدا کرد و با یه ریست سخت به همونجا برگشت. راه سادهترش هم ساختن یه شاخهٔ پشتیبان قبل از شروعه.
دربارهٔ تعارضها هم میگه چیز تازهای نیست: گیت وایمیسه، تعارض رو مثل مرج حل میکنی، فایلها رو git add میکنی و با git rebase --continue ادامه میدی. به نظر اون حل تعارض موقع ریبیس حتی راحتتره، چون هر بار فقط با یه کامیت طرفی نه کل شاخه. توصیهٔ عملیش اینه که آدم شاخههای خودشو آزادانه ریبیس کنه و موقع پوش از --force-with-lease استفاده کنه که اگه کس دیگهای پوش کرده باشه جلوشو میگیره.
نکات کلیدی:
- git rebase -i اولش فقط یه نقشهٔ متنی باز میکنه، نه یه عمل برگشتناپذیر
- دستورهای اصلی: pick، reword، squash، fixup و drop
- git rebase --abort شاخه رو دقیقاً به حالت قبل برمیگردونه
- ریبیس کامیت قدیمی رو پاک نمیکنه، کامیت جدید میسازه و رفلاگ مسیر برگشت رو نگه میداره
- برای پوش بعد از ریبیس، --force-with-lease امنتر از فورس معمولیه




