git history؛ دستور گمنام گیت برای تمیزکاری کامیتها
خلاصهٔ کاملتر
نویسندهٔ این پست میگه کار موازی روی چندتا تغییر تو گیت واقعاً اذیتکنندهست: مدام باید برنچ و کامیت رو جابهجا کنی و rebase -i بزنی که یه سوتی کوچیک هم میتونه درختت رو نصفهکاره و خراب کنه. به گفتهٔ اون این روزها خیلیها jj (یه سیستم کنترل نسخهٔ جایگزین گیت) رو به عنوان راهحل معرفی میکنن، ولی خودش یک سال و نیمه هر سه ماه یه بار امتحانش کرده و هر بار برگشته سر گیت.
راهحلی که پیشنهاد میده git history هست، یه دستور آزمایشی که تو دو نسخه اومده: ۲.۵۴ (آوریل، زیردستورهای reword و split) و ۲.۵۵ (ژوئن، زیردستور fixup). نویسنده میگه روز انتشار هر کدوم سروصدا کرد و بعدش تقریباً فراموش شد، در حالی که بخشی از خود گیته و برای امتحانش لازم نیست هیچی نصب کنی.
git history fixup یه کامیت قدیمی رو که مشکل داره درست میکنه. اصلاح رو مثل همیشه با git add استیج میکنی، بعد دستور رو روی همون کامیت میزنی تا تغییرات توش تا بخوره. فرقش با git rebase --update-refs اینه که اون فقط ref هایی رو جابهجا میکنه که داخل بازهٔ ریبیسان، ولی این یکی هر برنچ محلیای که از اون کامیت اومده رو پیدا و بازنویسی میکنه. در عوض با merge commit کار نمیکنه که برای بعضی جریانهای کاری بازدارندهست.
git history reword فقط پیام یه کامیت قدیمی رو عوض میکنه و بقیهٔ استک رو خودش دوباره روش میسازه. git history split هم دیف یه کامیت رو هانکبههانک جلوت میذاره و دو تیکهش میکنه، چیزی شبیه git add -p ولی بدون بندبازی با ریبیس. این دوتا اصلاً به index و working tree دست نمیزنن و فقط روی گراف کامیتها کار میکنن، یعنی میتونی کامیت یه برنچی رو که چکاوت نکردی عوض کنی بدون اینکه کار نصفهت به هم بریزه.
مهمترین خاصیت هر سه دستور اینه که اتمیکان و هیچوقت درختت رو نصفهکاره ول نمیکنن. راهش هم سادهست: هر عملیاتی که ممکنه کانفلیکت بسازه رو کلاً رد میکنن. نویسنده قبول داره این از jj ضعیفتره، چون jj کانفلیکت رو درجهیک میبینه و میتونه حالت کانفلیکتدار رو با خودش تو ریبیس ببره. ولی مستندات گیت گفتن این محدودیت عمدیه و اگه روزی گیت کانفلیکت درجهیک یاد بگیره، برداشته میشه. به نظر نویسنده git history هنوز جای jj رو پر نمیکنه، ولی قدم بزرگیه اونم تو ابزاری که هر روز باهاش کار میکنیم.
نکات کلیدی:
- git history یه دستور آزمایشی تو هستهٔ گیته؛ reword و split تو نسخهٔ ۲.۵۴ و fixup تو ۲.۵۵ اومدن
- fixup برخلاف git rebase --update-refs همهٔ برنچهای محلی پاییندست اون کامیت رو آپدیت میکنه، با گزینهای برای محدود کردنش به برنچ فعلی
- هر سه زیردستور اتمیکان و هر عملیاتی که ممکنه کانفلیکت بده رو رد میکنن
- fixup با merge commit کار نمیکنه
- reword و split به index و working tree دست نمیزنن
- چیزهایی که jj داره و git history نداره: operation log با undo آسون، مدلکردن working copy به شکل کامیت، و عبور دادن کانفلیکت از ریبیس




