فهرست مطالب
اگر هنگام جابهجایی میان شاخهها تصادفاً نام فایلی را به اشتباه وارد کرده باشید، احتمالاً دیدهاید که git checkout بدون هیچ هشداری تغییرات ثبتنشده آن فایل را حذف میکند. این رفتار پیشبینینشده سالها برنامهنویسان را سردرگم میکرد؛ زیرا یک دستور واحد هم برای جابهجایی بین شاخهها و هم برای برگرداندن تغییرات فایلها استفاده میشد.
توسعهدهندگان گیت در نسخه Git 2.23 این مشکل را با معرفی دو دستور اختصاصی حل کردند: git switch برای مدیریت و جابهجایی شاخهها، و git restore برای بازگردانی فایلها.
چرا دستور git switch معرفی شد
دستور قدیمی git checkout چندین وظیفه کاملاً متفاوت را به دوش میکشید:
- تغییر شاخه جاری
- ایجاد شاخه جدید همراه با تغییر به آن
- برگرداندن فایلها به وضعیت آخرین کامیت
- جابهجایی موقت به یک کامیت خاص و ایجاد وضعیت سر جداشده (Detached HEAD)
این تمرکز بیش از حد روی یک دستور باعث میشد اگر شاخهای همنام با یک فایل محلی وجود داشت، گیت پیام ابهام صادر کند یا رفتار غیرمنتظرهای نشان دهد. برای رفع این تداخل، تیم گیت git switch را با دایره وظایفی مشخص و محدود به شاخهها به هسته ابزار اضافه کرد.
قانون اصلی ساده است؛ هر جا هدف تغییر شاخه یا ساخت شاخه است، از git switch استفاده میکنید و برای تغییر فایلها سراغ git restore میروید.
مقایسه دستورهای پرکاربرد
برای درک بهتر تفاوت این دو ابزار، معادلهای روزمره آنها را در قالب دستورهای متداول بررسی میکنیم:
- جابهجایی به شاخه موجود: به جای
git checkout mainاکنون مینویسیدgit switch main. - ساخت شاخه جدید و ورود به آن: به جای
git checkout -b featureاز فرمانgit switch -c featureاستفاده میکنید (حرف c مخفف create است). - بازگشت به شاخه قبلی: هر دو دستور با علامت منفی کار میکنند، اما
git switch -ایمنتر است. - ساخت اجباری شاخه: معادل پرچم
-Bدر دستور قدیمی، در دستور جدید پرچم-Cدر قالبgit switch -C featureاست.
یک سناریوی عملی در ترمینال
فرض کنید میخواهید از شاخه main یک شاخه جدید به نام login-api بسازید، تغییراتی اعمال کنید و سپس به شاخه قبلی برگردید:
bash# بررسی شاخه جاری
git status
# On branch main
# ساخت شاخه جدید و ورود همزمان به آن
git switch -c login-api
# Switched to a new branch 'login-api'
# بازگشت سریع به شاخه قبلی با علامت خط تیره
git switch -
# Switched to branch 'main'
اگر شاخه روی مخزن ریموت (مانند origin/bugfix) وجود داشته باشد اما هنوز روی سیستم شما نباشد، گیت به شکل خودکار وضعیت را حدس میزند. کافی است بنویسید:
bashgit switch bugfix
# Branch 'bugfix' set up to track remote branch 'bugfix' from 'origin'.
# Switched to a new branch 'bugfix'
در این حالت گیت شاخه محلی را ساخته و ارتباط بالادستی آن را با ریموت برقرار میکند.
اشتباه رایج برنامهنویسان
بزرگترین خطایی که توسعهدهندگان مرتکب میشوند، تلاش برای بازگرداندن تغییرات یک فایل با دستور switch است:
bash# این دستور خطاست و اجرا نمیشود
git switch app.js
# fatal: invalid reference: app.js
گیت به درستی اعلام میکند که فایلی با این نام شاخه به حساب نمیآید و هیچ تغییری در فایل ایجاد نمیکند. این یک مزیت بزرگ برای جلوگیری از دست رفتن ناخواسته کدها است. برای برگرداندن فایل باید از ابزار مکمل استفاده کنید:
bash# شکل درست برگرداندن فایل به وضعیت کامیت قبلی
git restore app.js
همچنین اگر تغییراتی در شاخه فعلی داشته باشید که با شاخه مقصد تداخل ایجاد کند، git switch به شکل پیشفرض عملیات را لغو میکند تا کدهای محلی بازنویسی نشوند.
قدم بعدی برای تسلط بر شاخهبندی
استفاده از git switch خوانایی اسکریپتها و دستورهای روزمره شما را بالاتر میبرد و ضریب اشتباه در پروژههای تیمی را به حداقل میرساند. برای آشنایی عمیق با سناریوهای تداخل، بازنویسی تاریخچه و ابزارهای پیشرفته شاخهبندی، دوره گیت و گیتهاب تعاملی در دیناکد مسیر کاملی را در اختیارتان میگذارد.





نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.