توی این درس یاد میگیری مخزن محلیات را با یک مخزن راه دور (remote) هماهنگ کنی: origin چیست، چطور با git clone یک پروژه را میگیری، با git push -u origin main میفرستی و شاخهی upstream را تنظیم میکنی، و فرق git fetch (فقط بگیر) و git pull (بگیر و ادغام کن) را میفهمی. میبینی چرا push گاهی با non-fast-forward رد میشود و راهش چیست، شاخهی راه دور را حذف میکنی و چند remote را کنار هم میگذاری. همهچیز با دو برنامهنویس شبیهسازیشده و یک «سرور» واقعی (مخزن bare) تمرین میشود. تمرین: یک مخزن را clone کن، تغییر بده و push کن.
مسئله: کار تنها کافی نیست
Section titled “مسئله: کار تنها کافی نیست”تا الان همهچیز روی یک کامپیوتر بود. ولی پروژهی واقعی چند نفر دارد و باید جایی باشد که همه روی آن توافق کنند: یک مخزن مرکزی روی سرور (GitHub، GitLab یا هر سرور SSH). هر نفر یک کلون از آن دارد، روی کلون خودش کار میکند و تغییرها را به سرور میفرستد (push) و تغییر دیگران را میگیرد (pull). اسم این مخزن مرکزی در Git یک remote است و اسم پیشفرضش origin.
تشبیه: دفتر مشترک و دفتر شخصی
Section titled “تشبیه: دفتر مشترک و دفتر شخصی”مخزن راه دور مثل دفتر مشترک تیم روی میز مدیر است و کلون تو نسخهی شخصی دفتر روی میز خودت. هر چه در دفتر شخصی مینویسی (commit) فقط مال توست تا وقتی آن را در دفتر مشترک ثبت کنی (push). و برای دیدن کار دیگران باید نسخهی تازهی دفتر مشترک را بگیری (fetch/pull). Git به تو میگوید دفتر شخصیات از مشترک چند صفحه عقب یا جلوتر است.
مثالهای عملی
Section titled “مثالهای عملی”برای تمرین واقعی، یک «سرور» و دو برنامهنویس میسازم. سرور یک مخزن bare است: مخزنی بدون پوشهی کاری که فقط تاریخچه را نگه میدارد (همان چیزی که GitHub پشت صحنه دارد). سارا و رضا هر کدام کلون خودشان را دارند:
mkdir -p ~/gitlab/server ~/gitlab/sara && cd ~/gitlabgit init -q --bare server/shop.gitecho "--- ساختار «سرور» (bare: فقط داخل .git، بدون فایلهای کاری):"ls server/shop.git | head -6cd sara && git init -qgit config user.name "Sara"; git config user.email "sara@example.com"echo "# Shop" > README.md && git add README.md && git commit -qm "Add README"echo "--- remote های سارا قبل از اتصال:"git remote -v; echo "(هیچ)"git remote add origin ~/gitlab/server/shop.gitecho "--- بعد از git remote add origin آدرس:"git remote -v--- ساختار «سرور» (bare: فقط داخل .git، بدون فایلهای کاری):HEADbranchesconfigdescriptionhooksinfo--- remote های سارا قبل از اتصال:(هیچ)--- بعد از git remote add origin آدرس:origin /home/ali/gitlab/server/shop.git (fetch)origin /home/ali/gitlab/server/shop.git (push)مثال ۱: اولین push، git push -u origin main
Section titled “مثال ۱: اولین push، git push -u origin main”سارا commit اول را به سرور میفرستد:
cd ~/gitlab/saragit push -u origin mainecho "--- شاخهی remote-tracking که Git ساخت:"git branch -aecho "--- و فایل config مخزن (remote و upstream):"cat .git/config | tail -7To /home/ali/gitlab/server/shop.git * [new branch] main -> mainbranch 'main' set up to track 'origin/main'.--- شاخهی remote-tracking که Git ساخت:* main remotes/origin/main--- و فایل config مخزن (remote و upstream): email = sara@example.com[remote "origin"] url = /home/ali/gitlab/server/shop.git fetch = +refs/heads/*:refs/remotes/origin/*[branch "main"] remote = origin merge = refs/heads/mainدو چیز نو: origin main یعنی «به remote ی به نام origin، شاخهی main». و -u (--set-upstream) یک رابطه میسازد: «شاخهی محلی main با origin/main جفت است». از این به بعد git push و git pull را بدون آرگومان میزنی و Git میداند کجا. origin/main یک شاخهی remote-tracking است: یک برچسب فقطخواندنی که یادآور میکند «سرور آخرین بار اینجا بود». فقط با fetch/pull/push عوض میشود. قسمت [branch "main"] در config همین جفتشدن را نگه میدارد.
مثال ۲: git clone، رضا پروژه را میگیرد
Section titled “مثال ۲: git clone، رضا پروژه را میگیرد”رضا یک کلون میگیرد؛ clone تاریخچهی کامل را میآورد، remote را به اسم origin تنظیم میکند و upstream شاخهی اصلی را هم ست میکند:
cd ~/gitlabgit clone server/shop.git rezacd rezagit config user.name "Reza"; git config user.email "reza@example.com"echo "--- remote ها (clone خودش origin را ساخت):"git remote -vecho "--- تاریخچه و شاخهها:"git log --onelinegit branch -vvCloning into 'reza'...done.--- remote ها (clone خودش origin را ساخت):origin /home/ali/gitlab/server/shop.git (fetch)origin /home/ali/gitlab/server/shop.git (push)--- تاریخچه و شاخهها:d296f05 Add README* main d296f05 [origin/main] Add READMEgit branch -vv (دو v) برای هر شاخه نشان میدهد با کدام شاخهی راه دور جفت است: [origin/main]. اگر مخزن آدرسهای مختلف دارد: git clone آدرس پوشه-مقصد (اسم مقصد اختیاری است). آدرس میتواند محلی (مثل اینجا)، https://github.com/user/repo.git یا git@github.com:user/repo.git (SSH) باشد؛ از درس بعد استفاده میکنی.
مثال ۳: نگاه به remote، git remote show
Section titled “مثال ۳: نگاه به remote، git remote show”cd ~/gitlab/rezagit remote show origin* remote origin Fetch URL: /home/ali/gitlab/server/shop.git Push URL: /home/ali/gitlab/server/shop.git HEAD branch: main Remote branch: main tracked Local branch configured for 'git pull': main merges with remote main Local ref configured for 'git push': main pushes to main (up to date)این خروجی یک خلاصهی خوب میدهد: آدرسها، شاخهی پیشفرض سرور (HEAD branch)، شاخههای راه دور، و اینکه git pull و git push چه میکنند. (برای دیدن این اطلاعات به سرور وصل میشود.)
مثال ۴: سارا کار میکند و push میکند
Section titled “مثال ۴: سارا کار میکند و push میکند”cd ~/gitlab/saraecho "<h1>Shop</h1>" > index.htmlgit add index.html && git commit -qm "Add homepage"echo "--- قبل از push، git status میگوید جلوتر هستی:"git status -sb | head -1git status | sed -n 2pgit pushecho "--- بعد از push:"git status -sb | head -1--- قبل از push، git status میگوید جلوتر هستی:## main...origin/main [ahead 1]Your branch is ahead of 'origin/main' by 1 commit.To /home/ali/gitlab/server/shop.git d296f05..f1c4836 main -> main--- بعد از push:## main...origin/mainahead 1 (یک commit جلوتر از سرور). و git push ساده کافی بود چون upstream تنظیم شده. توجه: commit محلی با push به سرور میرود؛ تا push نکنی، فقط روی کامپیوتر توست.
مثال ۵: git fetch، گرفتن بدون ادغام
Section titled “مثال ۵: git fetch، گرفتن بدون ادغام”رضا هنوز commit تازهی سارا را ندارد. git fetch آن را دانلود میکند، ولی شاخهی کاریات را دست نمیزند:
cd ~/gitlab/rezaecho "--- قبل از fetch (رضا هنوز چیزی نمیداند):"git log --onelinegit fetchecho "--- بعد از fetch: origin/main جلو رفته ولی main نه:"git branch -vvgit status | sed -n 2pecho "--- چه چیزی جدید است؟ (commit های origin/main که در main نیست)"git log main..origin/main --onelineecho "--- و تغییر:"git diff main origin/main --stat--- قبل از fetch (رضا هنوز چیزی نمیداند):d296f05 Add READMEFrom /home/ali/gitlab/server/shop d296f05..f1c4836 main -> origin/main--- بعد از fetch: origin/main جلو رفته ولی main نه:* main d296f05 [origin/main: behind 1] Add READMEYour branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.--- چه چیزی جدید است؟ (commit های origin/main که در main نیست)f1c4836 Add homepage--- و تغییر: index.html | 1 + 1 file changed, 1 insertion(+)fetch امنترین عملیات است: هیچ فایلی در پوشهی کاریات عوض نمیشود؛ فقط origin/main بهروز میشود تا ببینی چه خبر است. git log main..origin/main «آنچه سرور دارد و من ندارم» را نشان میدهد.
مثال ۶: git pull = fetch + ادغام
Section titled “مثال ۶: git pull = fetch + ادغام”وقتی بررسیات کافی بود، آن را وارد شاخهات کن. git pull دقیقاً «fetch و بعد merge origin/main» است:
cd ~/gitlab/rezagit pullecho "--- حالا main بهروز است:"git log --onelinelsUpdating d296f05..f1c4836Fast-forward index.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 index.html--- حالا main بهروز است:f1c4836 Add homepaged296f05 Add READMEREADME.mdindex.htmlچون رضا هیچ commit محلیای نداشت، ادغام fast-forward بود. (پس git pull یعنی git fetch + git merge origin/main؛ برای کنترل بیشتر میشود آن دو را جدا زد.)
مثال ۷: وقتی تاریخچهها جدا میشوند، rejected
Section titled “مثال ۷: وقتی تاریخچهها جدا میشوند، rejected”حالا هر دو commit میزنند؛ رضا زودتر push میکند و سارا بعد:
cd ~/gitlab/rezaecho "<footer>2026</footer>" > footer.html && git add footer.html && git commit -qm "Add footer (Reza)"git push -qcd ~/gitlab/saraecho "<style></style>" > style.css && git add style.css && git commit -qm "Add stylesheet (Sara)"echo "=== push سارا:"git push 2>&1=== push سارا:To /home/ali/gitlab/server/shop.git ! [rejected] main -> main (fetch first)error: failed to push some refs to '/home/ali/gitlab/server/shop.git'hint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.Git رد کرد: ! [rejected] main -> main (fetch first). سرور commit ای دارد که سارا ندارد؛ اگر Git قبول میکرد، کار رضا پاک میشد. پیام هم راهحل را میگوید: اول git pull (یا git fetch و ادغام). دو راه داری:
cd ~/gitlab/saragit fetch -qecho "--- تاریخچهی جدا شده:"git log --oneline --graph --allecho "=== راه اول: pull با merge (commit ادغام میسازد):"git pull --no-rebase --no-edit 2>&1 | tail -3git log --oneline --graph--- تاریخچهی جدا شده:* 1451421 Add stylesheet (Sara)| * 9ba5b2e Add footer (Reza)|/* f1c4836 Add homepage* d296f05 Add README=== راه اول: pull با merge (commit ادغام میسازد): footer.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 footer.html* b0fb153 Merge branch 'main' of /home/ali/gitlab/server/shop|\| * 9ba5b2e Add footer (Reza)* | 1451421 Add stylesheet (Sara)|/* f1c4836 Add homepage* d296f05 Add READMEنتیجه: یک commit ادغام که دو خط را وصل میکند. راه دوم git pull --rebase است: commit های محلیات را روی آخرین کار سرور بازپخش میکند و تاریخچه خطی میماند (درس rebase؛ اینجا commit های سارا هنوز push نشدهاند، پس rebase کردنشان امن است):
cd ~/gitlab/saragit reset -q --hard ORIG_HEADecho "=== راه دوم: pull --rebase:"git pull --rebase 2>&1 | tail -2git log --oneline --graphgit push -qecho "--- push موفق؛ وضعیت:"git status -sb | head -1=== راه دوم: pull --rebase:Successfully rebased and updated refs/heads/main.* eb19523 Add stylesheet (Sara)* 9ba5b2e Add footer (Reza)* f1c4836 Add homepage* d296f05 Add README--- push موفق؛ وضعیت:## main...origin/main(git reset --hard ORIG_HEAD فقط ادغام قبلی را برای نمایش راه دوم برگرداند.) کدام را انتخاب کنم؟ بستگی به قرارداد تیم دارد: merge تاریخچهی واقعی را نگه میدارد؛ --rebase خطی و تمیز میکند. میشود پیشفرض را تنظیم کرد: git config --global pull.rebase true (یا false برای merge، یا pull.ff only که فقط fast-forward را میپذیرد و در غیر آن خطا میدهد تا خودت تصمیم بگیری).
مثال ۸: شاخههای راه دور و پاکسازی
Section titled “مثال ۸: شاخههای راه دور و پاکسازی”cd ~/gitlab/saragit switch -qc feature/cartecho "cart" > cart.txt && git add cart.txt && git commit -qm "Add cart"echo "--- سارا شاخهی جدید را push میکند (با -u):"git push -u origin feature/cart 2>&1 | tail -3cd ~/gitlab/rezagit fetch -qecho "--- رضا fetch کرد؛ شاخههای راه دور او:"git branch -rcd ~/gitlab/saraecho "--- سارا شاخه را از سرور حذف میکند:"git push origin --delete feature/cart 2>&1 | tail -1cd ~/gitlab/rezagit fetch -qecho "--- رضا دوباره fetch کرد؛ ولی هنوز در فهرستش هست!"git branch -recho "--- fetch --prune شاخههای حذفشدهی سرور را از فهرست محلی پاک میکند:"git fetch --prunegit branch -r--- سارا شاخهی جدید را push میکند (با -u):To /home/ali/gitlab/server/shop.git * [new branch] feature/cart -> feature/cartbranch 'feature/cart' set up to track 'origin/feature/cart'.--- رضا fetch کرد؛ شاخههای راه دور او: origin/HEAD -> origin/main origin/feature/cart origin/main--- سارا شاخه را از سرور حذف میکند: - [deleted] feature/cart--- رضا دوباره fetch کرد؛ ولی هنوز در فهرستش هست! origin/HEAD -> origin/main origin/feature/cart origin/main--- fetch --prune شاخههای حذفشدهی سرور را از فهرست محلی پاک میکند:From /home/ali/gitlab/server/shop - [deleted] (none) -> origin/feature/cart origin/HEAD -> origin/main origin/maingit push -u origin شاخه شاخهی تازه را روی سرور میسازد و جفت میکند؛ git push origin --delete شاخه آن را حذف میکند. نکته: origin/feature/cart در فهرست رضا بعد از حذف روی سرور هم میماند تا git fetch --prune (یا git remote prune origin) بزند؛ در خروجی fetch --prune یک خط - [deleted] (none) -> origin/feature/cart میبینی. اینطور فهرست شاخههایت پر از شاخههای مرده نمیشود. (git config --global fetch.prune true همیشه خودکارش میکند.)
مثال ۹: چند remote، origin و upstream
Section titled “مثال ۹: چند remote، origin و upstream”یک مخزن میتواند چند remote داشته باشد. حالت معروف: پروژهی متنباز را fork کردهای؛ origin نسخهی خودت و upstream پروژهی اصلی است (درس Pull Request):
cd ~/gitlabgit init -q --bare server/original.gitcd rezagit remote add upstream ~/gitlab/server/original.gitgit remote -vecho "--- تغییر نام و حذف remote:"git remote rename upstream sourcegit remotegit remote remove sourcegit remoteecho "--- عوضکردن آدرس origin (مثلاً بعد از جابهجایی پروژه):"git remote set-url origin ~/gitlab/server/shop.gitgit remote get-url originorigin /home/ali/gitlab/server/shop.git (fetch)origin /home/ali/gitlab/server/shop.git (push)upstream /home/ali/gitlab/server/original.git (fetch)upstream /home/ali/gitlab/server/original.git (push)--- تغییر نام و حذف remote:originsourceorigin--- عوضکردن آدرس origin (مثلاً بعد از جابهجایی پروژه):/home/ali/gitlab/server/shop.gitدستورهای مدیریت: git remote add نام آدرس، git remote rename قدیم جدید، git remote remove نام، git remote set-url نام آدرس-جدید (برای عوضکردن HTTPS به SSH؛ درس بعد)، و git remote get-url.
پشت پرده: remote فقط یک آدرس با نام است
Section titled “پشت پرده: remote فقط یک آدرس با نام است”remote چیز مرموزی نیست: یک اسم برای یک آدرس، بههمراه قاعدهای که میگوید شاخههای سرور به کدام شاخههای محلی فقطخواندنی نگاشت شوند. اینها در .git/config و .git/refs/remotes/ هستند:
cd ~/gitlab/rezaecho "--- config:"git config --get-regexp '^remote\.origin'echo "--- شاخههای remote-tracking فایلهای هشدارند:"ls .git/refs/remotes/origincat .git/refs/remotes/origin/maingit rev-parse origin/mainecho "--- git fetch دقیقاً چه چیزی را بهروز میکند؟ (اثر آخرین fetch)"cat .git/FETCH_HEAD | head -2--- config:remote.origin.url /home/ali/gitlab/server/shop.gitremote.origin.fetch +refs/heads/*:refs/remotes/origin/*--- شاخههای remote-tracking فایلهای هشدارند:HEADmaineb195236d686386ef072b1f17f067c046a3ad748eb195236d686386ef072b1f17f067c046a3ad748--- git fetch دقیقاً چه چیزی را بهروز میکند؟ (اثر آخرین fetch)eb195236d686386ef072b1f17f067c046a3ad748 branch 'main' of /home/ali/gitlab/server/shopخط fetch = +refs/heads/*:refs/remotes/origin/* نگاشت را تعریف میکند: «هر شاخهی سرور refs/heads/X را بگیر و در refs/remotes/origin/X بگذار». و git pull همان fetch + merge FETCH_HEAD است. origin/main مثل شاخهها یک فایل با هش یک commit است، با این تفاوت که خودت نمیتوانی روی آن commit بزنی؛ فقط وقتی remote را fetch میکنی عوض میشود.
جدولهای مرجع
Section titled “جدولهای مرجع”| دستور | کار |
|---|---|
git clone آدرس [پوشه] |
کپی کامل مخزن، با تنظیم origin |
git remote -v |
remote ها و آدرسها |
git remote add نام آدرس |
افزودن remote |
git remote show origin |
خلاصهی remote |
git push -u origin شاخه |
ارسال و تنظیم upstream |
git push / git pull |
ارسال / دریافت (بعد از upstream) |
git fetch [--prune] |
دریافت بدون ادغام (و پاککردن شاخههای مرده) |
git pull --rebase |
دریافت و بازپخش commit های محلی |
git branch -vv / -r / -a |
شاخهها با upstream / راه دور / همه |
git push origin --delete شاخه |
حذف شاخهی راه دور |
git remote set-url نام آدرس |
عوضکردن آدرس |
git log main..origin/main |
آنچه سرور دارد و من ندارم |
| میخواهم… | بزن |
|---|---|
| ببینم سرور چه خبر است (بدون تغییر) | git fetch سپس git log main..origin/main |
| کار همکارها را بگیرم | git pull (یا fetch + merge) |
| کارم را بفرستم | git push |
| push رد شد | git pull (یا --rebase) و دوباره git push |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) git pull بدون upstream
Section titled “۱) git pull بدون upstream”mkdir -p ~/gitlab/noup && cd ~/gitlab/noup && git init -qecho a > f && git add f && git commit -qm "Base"git remote add origin ~/gitlab/server/shop.gitgit pull 2>&1 | head -4From /home/ali/gitlab/server/shop * [new branch] main -> origin/mainThere is no tracking information for the current branch.Please specify which branch you want to merge with.There is no tracking information for the current branch: این شاخهی محلی به هیچ شاخهی راه دوری جفت نشده. راهحل: git push -u origin main (یا git branch --set-upstream-to=origin/main).
۲) clone در پوشهی غیرخالی
Section titled “۲) clone در پوشهی غیرخالی”cd ~/gitlabgit clone server/shop.git reza 2>&1 | tail -2fatal: destination path 'reza' already exists and is not an empty directory.destination path 'reza' already exists and is not an empty directory: Git روی چیزی که هست نمینویسد. راهحل: اسم دیگری بده یا پوشه را پاک کن.
۳) force push روی شاخهی مشترک
Section titled “۳) force push روی شاخهی مشترک”git push --force تاریخچهی سرور را بازنویسی میکند و کار همکارها را پاک میکند (درسهای undo و rebase). راهحل: git pull --rebase و push معمولی؛ و برای شاخهی شخصی بعد از rebase --force-with-lease.
۴) push نکردن و فکر کردن که کار ذخیره شده
Section titled “۴) push نکردن و فکر کردن که کار ذخیره شده”commit فقط محلی است. اگر کامپیوترت خراب شود، commit هایی که push نکردهای رفتهاند. راهحل: هر روز git push؛ git status -sb میگوید ahead N.
۵) pull بدون نگاه کردن و merge های ناخواسته
Section titled “۵) pull بدون نگاه کردن و merge های ناخواسته”git pull ممکن است commit ادغام ناخواسته بسازد («Merge branch ‘main’ of …»). راهحل: اول git fetch و git log main..origin/main را بخوان؛ یا pull.rebase یا pull.ff only را تنظیم کن.
مخزن «سرور» (bare) را clone کن و ثابت کن origin تنظیم شده و تاریخچهی کامل را داری.
دیدن جواب
cd ~/gitlabgit clone -q server/shop.git easycd easygit remote -vgit log --oneline | wc -lgit branch -vvorigin /home/ali/gitlab/server/shop.git (fetch)origin /home/ali/gitlab/server/shop.git (push)4* main eb19523 [origin/main] Add stylesheet (Sara)تمرین اصلی: یک مخزن را clone کن، تغییر بده و push کن. روی کلون جدید یک فایل CONTRIBUTING.md اضافه کن، commit و push بزن؛ بعد از کلون دیگری git pull بزن و ثابت کن فایل آمد.
دیدن جواب
cd ~/gitlabgit clone -q server/shop.git me && git clone -q server/shop.git friendcd megit config user.name "Me"; git config user.email "me@example.com"echo "How to contribute" > CONTRIBUTING.mdgit add CONTRIBUTING.md && git commit -qm "Add contributing guide"git push -qecho "--- از دید دوست:"cd ../friendgit pull -qlsgit log --oneline -1--- از دید دوست:CONTRIBUTING.mdREADME.mdfooter.htmlindex.htmlstyle.css3040913 Add contributing guideدو کلون بساز که هر دو یک فایل متفاوت را commit کنند؛ اولی push کند، دومی push خود را «ردشده» ببیند. با git pull --rebase آن را درست کن و ثابت کن تاریخچهی نهایی خطی است (بدون commit ادغام).
دیدن جواب
cd ~/gitlabgit clone -q server/shop.git a && git clone -q server/shop.git bfor d in a b; do (cd $d && git config user.name "User $d" && git config user.email "$d@example.com"); donecd a && echo A > a.txt && git add a.txt && git commit -qm "Add a" && git push -qcd ../b && echo B > b.txt && git add b.txt && git commit -qm "Add b"echo "--- push دومی:"git push 2>&1 | head -3git pull --rebase -qgit push -qecho "--- تاریخچهی خطی:"git log --oneline --graph | head -4--- push دومی:To /home/ali/gitlab/server/shop.git ! [rejected] main -> main (fetch first)error: failed to push some refs to '/home/ali/gitlab/server/shop.git'--- تاریخچهی خطی:* 3e60e3b Add b* ff793b3 Add a* 3040913 Add contributing guide* eb19523 Add stylesheet (Sara)آزمونک
Section titled “آزمونک”فرق git fetch و git pull؟
pull = fetch + merge (یا rebase). برای دیدن اینکه سرور چه دارد، اول fetch و بعد git log main..origin/main.
origin چیست؟
git clone خودش origin را میسازد.
git push -u origin main چه کاری علاوه بر ارسال میکند؟
قسمت [branch "main"] در .git/config نوشته میشود.
origin/main چیست؟
خودت نمیتوانی روی آن commit بزنی.
push تو با «rejected (fetch first)» روبهرو شد. یعنی چه؟
force push کار همکارها را پاک میکند؛ راه درست pull و بعد push است.
git fetch --prune چه میکند؟
fetch.prune=true آن را خودکار میکند.
جمعبندی
Section titled “جمعبندی”- remote یک اسم برای یک آدرس مخزن راه دور است (پیشفرض
origin)؛git remote -vنشانشان میدهد،git remote add/rename/remove/set-urlمدیریتشان میکند. git clone آدرسکپی کامل باoriginو upstream؛git push -u origin mainاولین بار میفرستد و شاخه را جفت میکند؛ بعدgit push/git pullساده.git fetch: بگیر بدون ادغام (امن؛ فقطorigin/mainرا بهروز میکند)؛git pull= fetch + merge؛git pull --rebase= fetch + rebase.- push رد شد (
non-fast-forward/fetch first) ← اولgit pull(یا--rebase) سپس push؛--forceنه. git branch -vv(upstream و ahead/behind)،-r(راه دور)،git push origin --delete شاخه،git fetch --prune.- پشت پرده: remote یک آدرس + نگاشت
+refs/heads/*:refs/remotes/origin/*؛origin/mainیک فایل هشدار فقطخواندنی.
| دستور | کاری که میکند |
|---|---|
git clone آدرس [پوشه] | کپی کامل |
git remote -v | remote ها |
git remote add origin آدرس | افزودن remote |
git push -u origin main | ارسال و تنظیم upstream |
git push / git pull | ارسال / دریافت |
git fetch | دریافت بدون ادغام |
git log main..origin/main | آنچه سرور دارد و من ندارم |
git pull --rebase | دریافت و بازپخش commit های محلی |
git branch -vv | شاخهها با upstream |
git push origin --delete شاخه | حذف شاخهی راه دور |
git fetch --prune | پاککردن شاخههای مرده |
git remote set-url origin آدرس | عوضکردن آدرس |