git remote — remote nima, add, remove, -v

~10 daq · Git · GitHub bilan ishlash

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'shish
  • origin — an'anaviy nom asosiy remote uchun. Majburiy emas, lekin hamma shunday ataydi
  • git branch -M main — joriy branch nomini main ga (agar master bo'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/main avtomatik yangilanmaydi. U faqat git fetch, git pull yoki git push paytida yangilanadi. Shuning uchun git status "up to date" desa ham, GitHub da yangi commitlar bo'lishi mumkin — avval git fetch qiling.


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; clone avtomatik qo'shadi
  • git remote -v — ro'yxat va URL lar; git remote show origin — batafsil
  • git remote add origin URL — qo'shish
  • git remote set-url origin URL — o'zgartirish (HTTPS → SSH)
  • rename, remove — faqat havola, GitHub dagi repo tegilmaydi
  • origin/main — remote branch ning lokal nusxasi; fetch bilan yangilanadi
  • Fork bilan ishlashda — origin (sizniki) + upstream (asl)

Keyingi dars

20-dars: git clone — remote loyihani yuklab olish, HTTPS va SSH farqi