Git 2026

فصل ۱۳ · stash و worktree

کار موازی — stash، worktree و sparse-checkout

اگر وسط یک فیچر ناقص باگ تولید آمد، دو راه تمیز داری: تغییرات را موقتاً کنار بگذار (stash) یا همان مخزن را در پوشهٔ دوم روی شاخهٔ دیگر باز کن (worktree). کامیت الکی روی فیچر نزن.

🎯 اهداف یادگیری

  • stash را با پیام نام‌گذاری کنی و درست برگردانی
  • worktree را برای کار همزمان روی دو شاخه راه بیندازی
  • sparse-checkout را در monorepo بفهمی

📥 stash — قفسهٔ موقت

stash تمیز
git stash push -u -m "wip: jwt tests"
git stash list
git stash show -p stash@{0}
git stash pop                  # اعمال + حذف
git stash apply stash@{1}      # اعمال، نگه داشتن
git stash drop stash@{1}
git stash branch rescue stash@{0}

-u فایل Untracked را هم می‌گیرد. بدون آن notes.txt جدید جا می‌ماند و switch ممکن است شکست بخورد.

🖥️ VS Code Git

Source Control → ... → Stash

  • Stash (Include Untracked)
  • Stash All
  • Pop Latest Stash / Apply Latest Stash لیست stashها در همان منو دیده می‌شود.
⌨️ Terminal

git stash push -u -m "wip" git stash pop git stash apply stash@{1}

منوی Stash و Sync در VS Code

شکل ۱۳ — منوی ··· در Source Control: Fetch، Pull (Rebase)، Stash، Undo Last Commit و Sync در نوار وضعیت.

stash pop تعارض

اگر تعارض آمد، stash حذف نمی‌شود (pop شکست می‌خورد). حل کن، بعد drop. apply در این مواقع شفاف‌تر است.

🌲 worktree — چند checkout واقعی

worktree یعنی یک پوشهٔ دوم از همان پروژه، روی شاخه‌ای دیگر. فایل‌ها جدایند، اما تاریخچه (پوشهٔ .git) مشترک است — پس کامیت در پوشهٔ دوم در همان مخزن ثبت می‌شود.

هات‌فیکس کنار فیچر
# از مخزن اصلی
git worktree add ../app-hotfix -b hotfix/500 main
code -n ../app-hotfix
# بعد از اتمام
git worktree remove ../app-hotfix
git worktree list

قواعد:

  • یک شاخه در دو worktree همزمان checkout نمی‌شود
  • برای PR موازی و عامل‌های AI (فصل ۳۲) ایده‌آل است
  • remove قبل از پاک کردن پوشه

VS Code هر worktree را به‌صورت پوشهٔ جدا باز می‌کند — Source Control مستقل، تاریخچه مشترک.

📦 sparse-checkout و partial clone

در monorepo که ۱۰ گیگ است، کل درخت را لازم نداری.

فقط پوشهٔ خودت
git clone --filter=blob:none --sparse git@github.com:org/mono.git
cd mono
git sparse-checkout set apps/web packages/ui

--filter=blob:none (partial clone) blobها را تنبلانه می‌گیرد. GitHub این را پشتیبانی می‌کند. Scalar (ابزار مایکروسافت) همین ایده را برای ویندوز بزرگ خودکار می‌کند — فصل ۳۱.

سؤالات مصاحبه (با پاسخ)

Junior — stash کجا ذخیره می‌شود؟ refهای refs/stash و کامیت‌های merge-مانند در objects.

Mid — کی worktree، کی stash؟ stash برای دقیقه؛ worktree برای ساعت و روز و PR موازی.

Senior — چرا شاخه در دو worktree ممنوع است؟ چون هر دو HEAD و Index می‌خواهند همان ref را حرکت دهند — مسابقه.

✅ چک‌لیست فهم

  • stash با پیام می‌سازی نه stash@{7} بی‌نام
  • یک worktree واقعی باز کرده‌ای
  • فرق partial clone و sparse را بلدی

فصل بعد: remote — origin، fetch، pull، push.

فصل ۱۳ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0