Clone = کپی مخزن روی رایانهٔ تو (با تاریخچه). Fork = کپی مخزن زیر حساب GitHub خودت. PR را باید از fork خودت به مخزن اصلی بفرستی؛ اگر فقط clone کرده باشی و حق push نداشته باشی، PR ساخته نمیشود.
🎯 اهداف یادگیری
- clone را با عمق و فیلتر درست انجام دهی
- fork را با
originوupstreamبچینی - شاخه را بهروز نگه داری تا PR تمیز بماند
📥 clone
git clone git@github.com:rezaian-dev/javascript-persian-guide.git git clone --depth 1 <url> # فقط نوک — سریع، تاریخچه ناقص git clone --filter=blob:none <url> # partial؛ blob تنبل gh repo clone rezaian-dev/javascript-persian-guide
- Palette:
Git: Cloneیا Welcome → Clone Git Repository - اگر افزونهٔ GitHub Pull Requests وصل است: Clone from GitHub و لیست ریپوهایت
- پوشه را انتخاب کن → Open
- Fork از Command Palette:
GitHub Pull Requests: Fork
git clone git@github.com:org/repo.git
gh repo clone org/repo
gh repo fork org/repo --clone
shallow clone برای CI عالی است. برای کار روزانه bisect و blame را ضعیف میکند. با git fetch --unshallow کاملش کن.
🍴 Fork — مدل مشارکت OSS
gh repo fork rezaian-dev/javascript-persian-guide --clone=true cd javascript-persian-guide git remote -v # origin تو (fork) # upstream ریپوی اصلی git fetch upstream git switch main git merge --ff-only upstream/main git push origin main
قانون طلایی:
- origin = ریپوی تو (حق push)
- upstream = ریپوی صاحب پروژه (معمولاً read-only)
- PR از
origin/feat/xبهupstream/main
در GitHub دکمهٔ Sync fork همین merge را گرافیکی میکند. در VS Code افزونهٔ PR ریموتها را میشناسد.
🔁 مشارکت بدون fork — مدل تیمی
در سازمان، معمولاً مستقیم روی ریپو دسترسی write داری:
git switch -c feat/docs origin/main git push -u origin HEAD gh pr create --base main
Fork برای OSS و پیمانکار خارجی است؛ برای همکار تماموقت گام اضافه است.
Junior — فرق clone و download ZIP؟ ZIP بدون .git است؛ تاریخچه و شاخه ندارد.
Mid — چرا دو remote؟ تا بتوانی از upstream بگیر و به origin هل بدهی بدون حق نوشتن روی اصلی.
Senior — fork network چیست؟ گراف ریپوهای مشتقشده؛ GitHub objectها را تا حدی به اشتراک میگذارد. حذف fork تاریخچهٔ PR را پیچیده میکند.
✅ چکلیست فهم
- clone با SSH انجام دادهای
origin/upstreamرا درست نامگذاری میکنی- Sync fork را قبل از PR تازه میزنی
فصل بعد: Pull Request سطح Senior.