git remote — remote nima, add, remove, -v
Muammodan boshlaylik
Lokal repozitoriyingizda 20 ta commit. GitHub da bo'sh repozitoriy yaratdingiz. Ular orasida hech qanday bog'lanish yo'q — lokal Git GitHub haqida hech narsa bilmaydi.
git push
fatal: No configured push destination.
Git ga aytish kerak: "Bu repozitoriyning nusxasi shu manzilda ham bor". Bu — remote.
Remote nima?
Remote — boshqa joydagi (odatda internetdagi) xuddi shu repozitoriyning nusxasiga nomlangan havola. Remote — shunchaki nom → URL juftligi:
origin → git@github.com:otabek/dokon.git
Lokal repo Remote "origin"
┌─────────────┐ ┌──────────────────┐
│ main │ ───── push ──────→ │ main │
│ origin/main │ ←──── fetch ────── │ │
└─────────────┘ └──────────────────┘
GitHub
Bitta repozitoriyda bir nechta remote bo'lishi mumkin (GitHub va GitLab, yoki o'zingizniki va asl loyiha — 24-dars).
Remote larni ko'rish
git remote
origin
git remote -v
origin git@github.com:otabek/dokon.git (fetch)
origin git@github.com:otabek/dokon.git (push)
-v (verbose) — URL lar bilan. fetch va push uchun odatda bir xil.
Batafsil:
git remote show origin
* remote origin
Fetch URL: git@github.com:otabek/dokon.git
Push URL: git@github.com:otabek/dokon.git
HEAD branch: main
Remote branches:
main tracked
feature/tolov 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)
Remote qo'shish
GitHub da yangi repozitoriy yaratganda (README siz, bo'sh) u aynan shu buyruqlarni ko'rsatadi:
git remote add origin git@github.com:otabek/dokon.git
git branch -M main
git push -u origin main
git remote add NOM URL— remote qo'shishorigin— an'anaviy nom asosiy remote uchun. Majburiy emas, lekin hamma shunday ataydigit branch -M main— joriy branch nominimainga (agarmasterbo'lsa)git push -u origin main— birinchi push va bog'lash (21-dars)
git clone (20-dars) qilganingizda origin avtomatik qo'shiladi.
URL turlari
SSH: git@github.com:otabek/dokon.git
HTTPS: https://github.com/otabek/dokon.git
4-darsda SSH kalit sozlagan bo'lsangiz — SSH manzilni ishlating. GitHub da repozitoriy sahifasida Code tugmasi → SSH yoki HTTPS tabini tanlang.
URL ni o'zgartirish
HTTPS bilan clone qilgansiz, endi SSH ga o'tmoqchisiz (yoki repozitoriy nomi o'zgardi):
git remote set-url origin git@github.com:otabek/dokon.git
git remote -v
Nomini o'zgartirish va o'chirish
git remote rename origin github
git remote remove github # yoki: git remote rm github
O'chirish faqat havolani olib tashlaydi — GitHub dagi repozitoriyga hech narsa bo'lmaydi.
Remote branch lar
git fetch (22-dars) qilganingizda, Git remote dagi branch larning lokal nusxasini saqlaydi — remote-tracking branch lar:
git branch -r
origin/HEAD -> origin/main
origin/main
origin/feature/tolov
origin/main — "oxirgi marta tekshirganimda GitHub dagi main qayerda edi". Bu — faqat o'qish uchun ko'rsatkich: unga to'g'ridan-to'g'ri commit qila olmaysiz. Siz o'z lokal main ingizda ishlaysiz va uni origin/main bilan solishtirasiz:
git status
Your branch is ahead of 'origin/main' by 2 commits.
"Sizda GitHub da yo'q 2 ta commit bor".
[!INFO]
origin/mainavtomatik yangilanmaydi. U faqatgit fetch,git pullyokigit pushpaytida yangilanadi. Shuning uchungit status"up to date" desa ham, GitHub da yangi commitlar bo'lishi mumkin — avvalgit fetchqiling.
Bir nechta remote
Ochiq loyihaga hissa qo'shish (24-dars) — tipik holat:
git remote -v
origin git@github.com:otabek/react.git (fetch) ← sizning fork ingiz
origin git@github.com:otabek/react.git (push)
upstream https://github.com/facebook/react.git (fetch) ← asl loyiha
upstream https://github.com/facebook/react.git (push)
git remote add upstream https://github.com/facebook/react.git
git fetch upstream
git merge upstream/main
Yoki zaxira uchun — bir vaqtda GitHub va GitLab ga:
git remote add gitlab git@gitlab.com:otabek/dokon.git
git push gitlab main
Remote — sozlamalar faylida
Remote lar .git/config da oddiy matn sifatida saqlanadi:
cat .git/config
[remote "origin"]
url = git@github.com:otabek/dokon.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
fetch qatori: "remote dagi barcha branch larni (refs/heads/*) lokalda origin/* sifatida saqlash".
Nima uchun shunday?
Nima uchun Git remote larni "nomlar" bilan ishlatadi — har safar URL yozsak bo'lmaydimi?
Bo'ladi: git push git@github.com:otabek/dokon.git main ham ishlaydi. Lekin nom ikki narsani beradi. Birinchidan, qulaylik: origin — 6 harf. Ikkinchidan, va muhimroq — holat: nom bilan Git remote dagi branch larning nusxasini (origin/main) saqlay oladi va "siz 2 commit oldindasiz" kabi solishtirishlarni qila oladi. URL bilan bunday "xotira" bo'lmasdi. Bundan tashqari, repozitoriy boshqa joyga ko'chsa — faqat bitta joyda URL o'zgartiriladi (set-url), qolgan hamma narsa — skriptlar, odatlar, alias lar — o'zgarmaydi.
Xulosa
Eslab qoling:
- Remote — boshqa joydagi repozitoriy nusxasiga nomlangan havola (nom → URL)
origin— asosiy remote uchun an'anaviy nom;cloneavtomatik qo'shadigit remote -v— ro'yxat va URL lar;git remote show origin— batafsilgit remote add origin URL— qo'shishgit remote set-url origin URL— o'zgartirish (HTTPS → SSH)rename,remove— faqat havola, GitHub dagi repo tegilmaydiorigin/main— remote branch ning lokal nusxasi;fetchbilan yangilanadi- Fork bilan ishlashda —
origin(sizniki) +upstream(asl)
Keyingi dars
20-dars: git clone — remote loyihani yuklab olish, HTTPS va SSH farqi