شاخه کپی پروژه نیست. یک فایل کوچک داخل .git/refs/heads/ است که فقط هش یک کامیت را نگه میدارد (حدود ۴۰ کاراکتر). ساختن شاخه یعنی نوشتن همین فایل.
🎯 اهداف یادگیری
- شاخه را بهعنوان اشارهگر به یک commit توضیح دهی
- با
switchوswitch -cکار کنی - HEAD detached را تشخیص و نجات دهی
- قرارداد نامگذاری تیم را رعایت کنی
🧠 شاخه چیست؟
مسیر refs/heads/main فقط هش کامیت نوک شاخه را نگه میدارد. ساخت شاخه = نوشتن یک فایل جدید با یک هش. عوض کردن شاخه = عوض کردن اینکه HEAD به کدام فایل اشاره کند.
شکل ۴ — HEAD به شاخه اشاره میکند؛ شاخه به کامیت. وقتی کامیت میکنی، هر دو جلو میروند.
git branch -vv # شاخههای محلی + tracking git show-ref --heads cat .git/HEAD # ref: refs/heads/main
🔀 ساخت و تعویض — مسیر مدرن
- روی نام شاخه در نوار وضعیت (پایین-چپ) کلیک کن
- Create new branch from... →
feat/auth - برای برگشت: همان منو →
main - Palette:
Git: Create Branch/Git: Checkout to... - Publish Branch وقتی آمادهٔ remote شدی
git switch -c feat/auth
git switch main
git switch -
git branch -d feat/auth فقط اگر merge شده؛ وگرنه Git رد میکند.
git branch -D feat/old حذف اجباری
شکل ۴ب — کلیک روی نام شاخه در نوار وضعیت: تعویض، ساخت شاخهٔ جدید، Publish.
شکل ۴پ — Ctrl+Shift+P سپس Git: Create Branch from... معادل git switch -c.
checkout هم شاخه عوض میکرد هم فایل برمیگرداند. دو معنا = دو برابر باگ انسانی. از Git ۲.۵۱ فرمانهای switch و restore پایدار و توصیهشدهاند.
📛 نامگذاری
| پیشوند | استفاده | مثال |
|---|---|---|
feat/ |
قابلیت جدید | feat/jwt-refresh |
fix/ |
باگ | fix/token-expiry |
chore/ |
ابزار / وابستگی | chore/bump-actions |
hotfix/ |
تعمیر تولید | hotfix/500-login |
release/ |
آمادهسازی نسخه | release/1.4.0 |
از فاصله، اموجی و نامهای خیلی کلی (update, ali) پرهیز کن. GitHub شاخه را در URL میگذارد.
🪂 HEAD detached — وحشت بیمورد
وقتی مستقیم روی یک کامیت checkout/switch کنی (نه روی شاخه)، HEAD به هش میچسبد نه به ref.
git switch --detach HEAD~3 # حداقل ۴ کامیت لازم است git switch -c rescue git switch main
در VS Code اگر Graph را بزنی و یک کامیت قدیمی را Checkout کنی، بنر زرد detached HEAD میآید. فوری شاخه بساز.
main و شاخههایی که دیگران track میکنند مقدساند. بازنویسی یعنی force-push و درد تیم. قانون را در فصل ۲۳ با گوشت و پوست حس میکنی.
🌳 دیدن همه چیز
git branch -a # محلی + remote git log --oneline --graph --decorate --all
در VS Code افزونهٔ Graph همین نقشه را رنگی میکشد — فصل ۱۱ کامل روی آن کار میکنیم.
Junior — ساخت شاخه فایلها را کپی میکند؟ خیر. فقط یک اشارهگر جدید.
Mid — تفاوت branch و tag؟ هر دو اشارهگرند؛ شاخه با هر commit حرکت میکند، تگ معمولاً ثابت میماند.
Senior — HEAD symbolic چیست؟ فایل HEAD معمولاً ref: refs/heads/main است نه خود هش. Detached یعنی HEAD مستقیم هش را نگه میدارد.
✅ چکلیست فهم
- شاخه را فایل اشارهگر میدانی نه پوشه
switch -cرا بهجای checkout استفاده میکنی- از detached بدون وحشت خارج میشوی
- نام شاخه Conventional است
فصل بعد: ادغام — وقتی دو تاریخچه باید یکی شوند.