اگر وسط یک فیچر ناقص باگ تولید آمد، دو راه تمیز داری: تغییرات را موقتاً کنار بگذار (stash) یا همان مخزن را در پوشهٔ دوم روی شاخهٔ دیگر باز کن (worktree). کامیت الکی روی فیچر نزن.
🎯 اهداف یادگیری
- stash را با پیام نامگذاری کنی و درست برگردانی
- worktree را برای کار همزمان روی دو شاخه راه بیندازی
- sparse-checkout را در monorepo بفهمی
📥 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 ممکن است شکست بخورد.
Source Control → ... → Stash
- Stash (Include Untracked)
- Stash All
- Pop Latest Stash / Apply Latest Stash لیست stashها در همان منو دیده میشود.
git stash push -u -m "wip"
git stash pop
git stash apply stash@{1}
شکل ۱۳ — منوی ··· در Source Control: Fetch، Pull (Rebase)، Stash، Undo Last Commit و Sync در نوار وضعیت.
اگر تعارض آمد، 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.