تصور کنید همین حالا دکمه ثبت کامیت را فشار دادهاید و ناگهان متوجه میشوید که یک غلط املایی فاحش در پیام خود دارید یا فراموش کردهاید یکی از فایلهای مهم را به محیط استیج اضافه کنید.
در چنین شرایطی، ثبت یک کامیت جدید با پیامی مثل "Fix typo" یا "Add forgotten file" باعث شلوغی و غیرحرفهای به نظر رسیدن تاریخچه پروژه شما میشود.
در این درس، یاد میگیرید که چگونه با استفاده از سوییچ قدرتمند amend، آخرین کامیت خود را باز کنید، تغییرات لازم را در آن اعمال نمایید و دوباره آن را ببندید؛ به طوری که هیچکس متوجه اشتباه اولیه شما نشود.
تسلط بر این تکنیک به شما کمک میکند تا همیشه یک تاریخچه تمیز، استاندارد و بینقص از فعالیتهای خود در سرورهای شرکت به جای بگذارید.
آشنایی با دستور git commit --amend
سوییچ --amend مانند یک دکمه ویرایش برای آخرین کامیت شما عمل میکند. زمانی که متوجه میشوید در آخرین ثبت نهایی خود اشتباهی مرتکب شدهاید، به جای ایجاد یک کامیت جدید و شلوغ کردن تاریخچه پروژه، از این دستور برای اصلاح همان کامیت قبلی استفاده میکنید. این ابزار به شما قدرت میدهد تا اشتباهات ریز را قبل از اینکه کسی متوجه آنها شود، به سادگی بپوشانید.
جایگزینی به جای ویرایش
دقت کنید که گیت به لحاظ فنی یک کامیت موجود را «ویرایش» نمیکند، بلکه یک کامیت کاملاً جدید را جایگزین کامیت قبلی میکند. این تفاوت فنی بسیار مهم است؛ زیرا شناسهی کامیت (SHA Hash) شما تغییر خواهد کرد. با اجرای این دستور، گیت تغییرات جدید موجود در محیط استیج را با محتوای کامیت قبلی ترکیب کرده و یک نسخه اصلاحشده و تمیز ارائه میدهد.
قدرت در عین سادگی
مدیریت تاریخچه با این دستور به شما کمک میکند تا از ثبت پیامهای تکراری و بیارزشی مانند "Fix typo" جلوگیری کنید. برای استفاده از این قابلیت، کافی است پس از اعمال اصلاحات در فایلها و اضافه کردن آنها به محیط استیج، دستور زیر را در ترمینال وارد کنید:
git commit --amend
با اجرای این دستور، ویرایشگر متن باز میشود تا در صورت نیاز پیام کامیت را هم اصلاح کنید.
اصلاح پیام کامیت
اگر بلافاصله پس از ثبت کامیت متوجه شدید که پیام انتخابی شما دارای غلط املایی است یا نیاز به توضیحات دقیقتری دارد، نیازی به ثبت یک کامیت جدید نیست. سوییچ --amend به شما اجازه میدهد تا بدون تغییر در محتوای کدها، تنها شناسنامه یا همان پیام آخرین کامیت خود را ویرایش کنید.
برای انجام این کار، دستور زیر را در ترمینال بنویسید:
git commit --amend
با اجرای این دستور، ویرایشگر متن پیشفرض شما باز میشود و پیام قبلی را نمایش میدهد. کافی است متن را اصلاح کرده، فایل را ذخیره کرده و ببندید. گیت به طور خودکار یک کامیت جدید با همان تغییرات قبلی اما با پیام اصلاحشده ایجاد کرده و آن را جایگزین نسخه قبلی میکند. این کار باعث میشود تاریخچه پروژه شما همیشه حرفهای و بدون ایرادات نوشتاری باقی بماند.
اضافه کردن فایلهای فراموش شده
بسیار پیش میآید که پس از ثبت یک کامیت، متوجه شوید فراموش کردهاید یک فایل مهم یا تغییری کوچک را در آن بگنجانید. در چنین شرایطی، به جای ایجاد یک کامیت جدید که باعث شلوغی تاریخچه پروژه میشود، میتوانید آن فایل را به آخرین کامیت خود «سنجاق» کنید.
برای این کار، ابتدا فایل فراموش شده را با دستور زیر به محیط استیج اضافه کنید:
git add <نام_فایل>
سپس دستور زیر را در ترمینال اجرا نمایید:
git commit --amend --no-edit
استفاده از سوییچ --no-edit به گیت میگوید که پیام کامیت قبلی بدون تغییر باقی بماند و فقط محتوای جدید به آن اضافه شود. با این کار، گیت یک کامیت جدید با محتوای کامل (شامل فایل قبلی و جدید) ایجاد کرده و آن را جایگزین کامیت ناقص قبلی میکند.
دقت داشته باشید که این فرآیند باعث تغییر شناسهی کامیت میشود، بنابراین در واقع شما در حال بازنویسی تاریخچه هستید.
مفهوم بازنویسی تاریخچه
بازنویسی تاریخچه در گیت به معنای اصلاح یا جایگزینی کامیتهایی است که قبلاً در پایگاه داده ثبت شدهاند. کامیتها در گیت موجوداتی «تغییرناپذیر» (Immutable) هستند؛ یعنی پس از ثبت نهایی، محتوا و شناسهی آنها دیگر قابل ویرایش نخواهد بود.
وقتی از سوییچ amend استفاده میکنید، گیت در واقع یک کامیت جدید با شناسهی (SHA-1) متفاوت میسازد و آن را جایگزین نسخه قبلی میکند. این جایگزینی باعث میشود تاریخچه پروژه دقیقاً مطابق میل شما مرتب شود و اثری از اشتباهات اولیه باقی نماند.
بازنویسی تاریخچه ابزاری عالی برای اصلاح خط زمانی است، اما چون هویت کامیتها را تغییر میدهد، در پروژههای تیمی نیاز به رعایت قوانین خاصی دارد
قانون طلایی استفاده از Amend
دستور amend ابزاری بسیار قدرتمند است، اما استفاده نادرست از آن میتواند نظم کل تیم را به هم بریزد. یک قاعده کلیدی و حیاتی در مدیریت مخازن گیت وجود دارد: هرگز کامیتهایی را که قبلاً روی گیتهاب یا یک مخزن اشتراکی ارسال (Push) کردهاید، اصلاح نکنید.
وقتی یک کامیت را در سیستم محلی خود تغییر میدهید، شناسهی آن عوض میشود. تا زمانی که این تغییرات فقط روی کامپیوتر شخصی شما قرار دارد، هیچ مشکلی پیش نمیآید.
اما اگر آن کامیت را به سرور فرستاده باشید و همتیمیهای شما پروژه را دریافت (Pull) کرده باشند، نسخهای از کامیت با شناسهی قدیمی روی سیستم آنها وجود دارد.
اصلاح این کامیت و ارسال مجدد آن به سرور، باعث ایجاد تداخل در خط زمانی پروژه میشود. این کار اعضای تیم را هنگام دریافت تغییرات جدید با خطاهای پیچیدهای مواجه میکند و بازگرداندن پروژه به حالت پایدار، وقت زیادی از تیم فنی میگیرد.
سوییچ amend را فقط برای تغییراتی به کار ببرید که هنوز روی کامپیوتر شخصی شما قرار دارند و به مخزن اصلی فرستاده نشدهاند. برای کدهایی که قبلاً روی سرور آپلود شدهاند، ایجاد یک کامیت جدید جهت رفع اشکالات، همیشه مسیر امنتر و حرفهایتری است.