اگر مدت زیادی با گیت (Git) کار کردهاید، احتمالاً با برخی از مشکلات رایج مانند کند شدن عملیات بهمرور زمان با بزرگتر شدن مخازن، بازنویسی تصادفی تغییرات هنگام تغییر شاخهها، یا مواجهه با چالشهای مخازن بسیار بزرگ (monorepos) برخورد کردهاید.
خوشبختانه، مانند هر ابزار دیگری، گیت نیز به طور مداوم در حال تکامل است و ویژگیهای جدیدی اضافه میکند تا کار ما را سادهتر کند. اگرچه برخی از این دستورات جدید نیستند، اما همچنان جزو نکات کمتر شناختهشدهای هستند که میتوانند به طور قابل توجهی جریان کاری شما را بهبود دهند. اگر با نکات و ترفندهای اصلی گیت آشنا هستید، این مقاله شما را با ده فرمان جدید آشنا میکند که میتوانند مهارتهای گیت شما را به سطح بالاتری ارتقا دهند.
1. git switch
– راهی امنتر برای تغییر شاخهها
قبل از نسخه 2.23 گیت، دستور git checkout
فرمان اصلی برای تغییر شاخهها بود، اما کاربردهای بیشتری هم داشت. میتوانستید از آن برای بازیابی فایلها، ایجاد شاخههای جدید یا بررسی کامیتهای خاص استفاده کنید. این امر آن را قدرتمند اما گاهی گیجکننده میکرد – بهویژه زمانی که فقط میخواستید شاخهای را تغییر دهید بدون اینکه به فایلها دست بزنید.
به همین دلیل، نسخه 2.23 گیت دستور git switch
را بهعنوان جایگزینی متمرکزتر برای عملیات مربوط به شاخهها معرفی کرد. با استفاده از git switch
، میتوانید تنها روی مدیریت شاخهها تمرکز کنید:
# Move to another branch
git switch feature-branch
# Create and switch to a new branch
git switch -c new-branch
این وضوح باعث کاهش ریسک بازنویسی تصادفی فایلها یا انجام تغییرات ناخواسته میشود. اگر تا به حال در استفاده از git checkout
مردد بودهاید به دلیل ترس از انجام کار اشتباه، git switch
فرآیند را سادهتر میکند.
2. git restore
– ایمنتر تغییرات را لغو کنید
لغو تغییرات اغلب شامل استفاده از git checkout
برای بازگرداندن فایلها یا git reset
برای انتقال HEAD شاخه میشد. اما هر دو دستور میتوانستند در صورت استفاده نادرست، وضعیت شاخه شما را تغییر دهند:
git reset
میتوانست HEAD شاخه را حرکت دهد.git checkout
میتوانست شاخهها را تغییر دهد یا کامیت متفاوتی را بررسی کند و وضعیت شاخه فعلی را مختل کند.
نسخه 2.23 گیت دستور git restore
را معرفی کرد تا صرفاً بر لغو تغییرات فایلها متمرکز شود. این دستور روشی امنتر و سرراستتر برای بازگرداندن تغییرات در دایرکتوری کاری یا ناحیه استیجینگ فراهم میکند و عملیات مربوط به فایل را بهوضوح از وظایف مدیریت شاخه جدا میکند:
# Discard working directory changes
git restore main.js
# Unstage changes from the index
git restore --staged main.js
این ویژگی بهویژه برای مبتدیان یا در موقعیتهای حساس که دقت اهمیت دارد، مفید است. میتوانید تغییرات را بدون نگرانی از تغییر تصادفی شاخهها یا بازنشانی کامیتها لغو کنید.
3. git maintenance
– بهینهسازی خودکار سلامت مخزن
با رشد مخازن، عملکرد آنها ممکن است کاهش یابد. عملیاتهایی مانند git fetch
، git status
یا git log
ممکن است کند شوند و دادههای غیرضروری میتوانند مخزن شما را بههمریخته کنند. پیش از نسخه 2.29 گیت، باید بهصورت دستی دستوراتی مانند git gc
(جمعآوری زباله) یا git repack
را برای بهینهسازی مخزن اجرا میکردید.
نسخه 2.29 گیت دستور git maintenance
را معرفی کرد که این وظایف را بهصورت خودکار انجام میدهد:
# Enable automatic maintenance
git maintenance start
# Run cleanup tasks immediately
git maintenance run
چه اتفاقی در پشت صحنه رخ میدهد؟
- جمعآوری زباله (Garbage Collection): اشیاء غیرقابل دسترسی مانند کامیتهایی که طی ریبیسها یا حذف شاخهها کنار گذاشته شدهاند را حذف میکند.
- بستهبندی مجدد (Repacking): فایلهای بستهای پراکنده را برای بهبود بهرهوری ذخیرهسازی یکپارچه میکند.
- بهروزرسانی گراف کامیت: تاریخچه کامیتها را برای سرعتبخشیدن به دستوراتی مانند
git log
وgit blame
بهینه میکند.
استفاده از git maintenance
باعث میشود مخزن شما بدون نیاز به تلاش دستی سالم باقی بماند.
4. git sparse-checkout
– مدیریت کارآمد مخازن بزرگ
مونوریپوها (Monorepos) برای مدیریت چندین پروژه عالی هستند، اما کلون کردن یک مخزن کامل زمانی که فقط به یک دایرکتوری خاص نیاز دارید، ناکارآمد است. نسخه 2.25 گیت دستور git sparse-checkout
را برای حل این مشکل معرفی کرد.
# Enable sparse-checkout mode
git sparse-checkout init
# Fetch only specific directories
# You can specify multiple directories separated by spaces
git sparse-checkout set services/ docs/
با استفاده از git sparse-checkout
، میتوانید فقط دایرکتوریها یا فایلهای مورد نیاز خود را در دایرکتوری کاری وارد کنید و بقیه را دستنخورده باقی بگذارید. این ویژگی برای تیمهای بزرگ که روی بخشهای مشخصی از یک مونوریپو کار میکنند بسیار مفید است و در زمان و فضای دیسک صرفهجویی میکند.
5. git log --remerge-diff
– درک بهتر کامیتهای ادغام (Merge)
کامیتهای ادغام معمولاً فقط نشان میدهند که کدام شاخهها ادغام شدهاند، اما همیشه تغییرات مشخصی که طی ادغام معرفی شدهاند، بهویژه هنگام حل تعارضها، توضیح داده نمیشوند.
از نسخه 2.35 گیت، میتوانید از دستور زیر استفاده کنید:
git log --remerge-diff
این گزینه کامیت ادغام را بازسازی کرده، استراتژی ادغام ثبتشده را بازپخش میکند و تغییرات دقیق معرفیشده را نمایش میدهد. این دستور برای اشکالزدایی تعارضهای ادغام یا بررسی تاریخچهی ادغامهای پیچیده بسیار مفید است.
6. git blame --ignore-rev
– نادیده گرفتن کامیتهای پر سر و صدا
هنگامی که تیم شما تغییرات قالببندی عمدهای انجام میدهد، استفاده از دستور git blame
میتواند دشوار شود، زیرا هر خط به کامیت قالببندی اشاره میکند و نه نویسنده اصلی.
در نسخه 2.23 گیت، گزینه --ignore-rev
معرفی شد که به شما امکان میدهد چنین کامیتهایی را نادیده بگیرید:
git blame --ignore-rev commit-hash
برای ذخیره دائمی این استثناها، میتوانید یک فایل ignore-revs
تنظیم کنید:
# Add the commit hash to the ignore-revs fileecho commit-hash >> .git-blame-ignore-revs
# Tell Git to use the file
git config blame.ignoreRevsFile .git-blame-ignore-revs
این روش به شما کمک میکند روی مالکیت معنایدار خطوط کد تمرکز کنید و در کدبیسهایی که بهروزرسانیهای مکرر استایل دارند بسیار مفید است.
7. git range-diff
– مقایسه و ردیابی تغییرات بین محدودههای کامیت
بازنویسی تاریخچه، چه از طریق ریبیس، cherry-pick یا ویرایش تعاملی، میتواند پیچیده باشد. پس از یک ریبیس، ممکن است بخواهید بدانید کامیتهای بازنویسیشده چه تفاوتی با نسخه اصلی دارند. دستور git range-diff
این امکان را فراهم میکند:
git range-diff
این دستور با مقایسه دو محدوده کامیت، نشان میدهد که چگونه یکی به دیگری تبدیل شده و تغییرات هر کامیت را برجسته میکند. این ابزار برای درک تکامل یک ویژگی یا رفع باگ در شاخههای مختلف مفید است.
8. git worktree
– کار همزمان روی چندین شاخه
تغییر شاخهها در یک دایرکتوری کاری میتواند جریان کاری شما را مختل کند، بهویژه زمانی که نیاز دارید روی چند شاخه بهصورت همزمان کار کنید. با استفاده از git worktree
میتوانید دایرکتوریهای کاری اضافی مرتبط با همان مخزن ایجاد کنید:
# Add a new worktree for a specific branch
git worktree add ../feature-branch feature-branch
# Remove a worktree when you're done
git worktree remove ../feature-branch
این قابلیت به شما اجازه میدهد بدون نیاز به تغییر شاخه یا ذخیره تغییرات (stash)، روی شاخههای مختلف کار کنید. همچنین میتوانید worktreeهای موقتی با HEAD جدا (detached) برای آزمایش ایجاد کنید یا ساختها و استقرارها را در دایرکتوریهای جداگانه ایزوله کنید.
9. git rebase --update-refs
– همگامسازی خودکار رفرنسها
ریبیس با جایگزینی کامیتهای قدیمی با جدید، تاریخچه را بازنویسی میکند، اما این فرآیند اغلب باعث میشود اشارهگرهای شاخهها یا تگها به کامیتهای منسوخشده اشاره کنند. نسخه 2.38 گیت گزینه --update-refs
را معرفی کرده که به طور خودکار این مشکل را مدیریت میکند:
git rebase --update-refs
این دستور تضمین میکند که شاخهها و تگهای مرتبط با کامیتهای بازنویسیشده با تاریخچه جدید همگام شوند. این قابلیت نیاز به بهروزرسانیهای دستی خستهکننده را از بین میبرد و ثبات را در مخزن حفظ میکند.
برای کنترل بیشتر، میتوانید گیت را پیکربندی کنید تا همیشه رفرنسهای خاصی را بهروزرسانی کند:
git config rebase.updateRefs true
این ویژگی در جریانهای کاری تیمی یا هنگام مدیریت رفرنسهای متعدد مرتبط با تاریخچه یکسان بسیار کاربردی است.
۱۰- دستورهای git commit --fixup
و git rebase --autosquash
– اصلاح کامیتها
اگرچه این ویژگی جدید نیست (برای اولین بار در Git 1.7.4 در سال 2011 معرفی شد)، دستور git commit --fixup
اغلب نادیده گرفته میشود، با اینکه ابزاری کاربردی برای حفظ تاریخچههای تمیز کامیت است. هنگام کار روی یک ویژگی، ممکن است متوجه شوید که باید یک کامیت قبلی را اصلاح یا بهبود دهید. ویرایش دستی تاریخچه کامیتها برای گنجاندن این تغییرات میتواند باعث ایجاد خطا شود. گیت با ارائهی دستورات git commit --fixup
و git rebase --autosquash
این فرایند را خودکار کرده است.
# Create a fixup commit targeting a specific commit
git commit --fixup=
# Later, during an interactive rebase, automatically squash fixup commits
git rebase -i --autosquash
گزینهی --fixup
یک کامیت ایجاد میکند که به گونهای علامتگذاری شده است تا بهصورت خودکار در طول یک ریبیس تعاملی با --autosquash
در کامیت هدف ادغام شود. این روش، فرایند تمیز کردن تاریخچه کامیتها را پیش از ادغام تغییرات آسانتر کرده و اطمینان حاصل میکند که تغییرات مرتبط بدون تلاش دستی در کنار هم قرار گیرند.
نتیجهگیری
دستوراتی که در این مقاله بررسی کردیم، میتوانند به شما در حل مشکلات واقعی که ممکن است به عنوان یک کاربر گیت هر روز با آن مواجه شوید، کمک کنند. چه در حال مدیریت یک مونورپو باشید، چه در حال رسیدگی به تاریخچههای بزرگ، یا تلاش برای نگه داشتن مخزن خود بهصورت تمیز، این راهحلهای کاربردی میتوانند تفاوت ایجاد کنند. با یکی یا دو مورد که با جریان کاری فعلی شما هماهنگ است شروع کنید، و ممکن است از بهبود بهرهوری خود شگفتزده شوید.