10-bo‘lim

Masofaviy repozitoriylar

clone, remote, push, fetch va pull buyruqlari bilan serverdagi repozitoriy bilan ishlash.

🕑 22 daqiqa o‘qish 📄 681 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Masofaviy repozitoriy nima?
  2. Klonlash
  3. Remote ro'yxati
  4. Remote qo'shish
  5. Push - yuborish
  6. Fetch - olib kelish (birlashtirmasdan)
  7. Pull - olib kelish va birlashtirish
  8. pull --rebase
  9. Kuzatuvchi tarmoqlar
  10. Masofaviy tarmoqlar
  11. O'chirish
  12. HTTPS yoki SSH?
  13. Bir nechta remote
  14. Kundalik ish oqimi
  15. Xulosa

Shu paytgacha hamma ish sizning kompyuteringizda edi. Endi kodni boshqalar bilan bo'lishishni o'rganamiz.

Masofaviy repozitoriy nima? #

Remote - internetdagi (yoki tarmoqdagi) Git repozitoriysi. Odatda GitHub, GitLab yoki kompaniyaning o'z serverida joylashadi.

origin (GitHub) masofaviy repozitoriy Sizning kompyuter lokal repozitoriy main, feature/savat Hamkasb kompyuteri lokal repozitoriy main, fix/narx push pull / fetch push pull Har bir nusxa to'liq - masofaviy repozitoriy shunchaki umumiy uchrashuv nuqtasi
Masofaviy repozitoriy - jamoaning umumiy uchrashuv nuqtasi

Klonlash #

Mavjud repozitoriyni nusxalash:

Terminal
git clone https://github.com/foydalanuvchi/loyiha.git
Natija
Cloning into 'loyiha'...
remote: Enumerating objects: 847, done.
remote: Counting objects: 100% (847/847), done.
remote: Compressing objects: 100% (412/412), done.
Receiving objects: 100% (847/847), 1.24 MiB | 3.15 MiB/s, done.
Resolving deltas: 100% (389/389), done.
Terminal
# Boshqa nom bilan
git clone https://github.com/foydalanuvchi/loyiha.git mening-papkam

# Faqat oxirgi kommit (tez, lekin tarixsiz)
git clone --depth 1 https://github.com/foydalanuvchi/loyiha.git

# Ma'lum tarmoqni
git clone -b develop https://github.com/foydalanuvchi/loyiha.git
clone nima qiladi?

Bitta buyruq to'rt ishni bajaradi:

  1. Papka yaratadi
  2. git init qiladi
  3. origin nomli remote qo'shadi
  4. Hamma narsani yuklab olib, asosiy tarmoqqa o'tadi

Butun tarix ham yuklanadi - internetsiz ham ishlashingiz mumkin.

Remote ro'yxati #

Terminal
git remote
Natija
origin
Terminal
git remote -v
Natija
origin  https://github.com/foydalanuvchi/loyiha.git (fetch)
origin  https://github.com/foydalanuvchi/loyiha.git (push)
Terminal
# Batafsil
git remote show origin
Natija
* remote origin
  Fetch URL: https://github.com/foydalanuvchi/loyiha.git
  Push  URL: https://github.com/foydalanuvchi/loyiha.git
  HEAD branch: main
  Remote branches:
    main            tracked
    develop         tracked
  Local branch configured for 'git pull':
    main merges with remote main
origin nima?

Bu shunchaki nom - Git avtomatik shunday ataydi. Sehr yo'q.

Nomni o'zgartirish yoki bir nechta remote qo'shish mumkin:

Terminal
git remote rename origin github
git remote add zaxira https://gitlab.com/.../loyiha.git

Remote qo'shish #

Lokal loyihani serverga bog'lash:

Terminal
git remote add origin https://github.com/foydalanuvchi/loyiha.git

# URL ni o'zgartirish
git remote set-url origin git@github.com:foydalanuvchi/loyiha.git

# O'chirish
git remote remove origin

Push - yuborish #

Terminal
git push origin main
Natija
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
To https://github.com/foydalanuvchi/loyiha.git
   c9d2e71..7d4e2f8  main -> main

Birinchi marta push qilganda kuzatuv o'rnatish kerak:

Terminal
git push -u origin main

-u (--set-upstream) dan keyin shunchaki git push yozish yetarli.

Terminal
# Yangi tarmoqni yuborish
git push -u origin feature/savat

# Barcha tarmoqlarni
git push --all origin

# Teglarni ham
git push --tags
Push rad etilishi
Natija
! [rejected]        main -> main (fetch first)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do
hint: not have locally.

Bu serverda sizda yo'q kommitlar borligini bildiradi. Kimdir sizdan oldin push qilgan.

Yechim - avval tortib oling:

Terminal
git pull
git push

Fetch - olib kelish (birlashtirmasdan) #

Terminal
git fetch origin
Natija
remote: Enumerating objects: 12, done.
From https://github.com/foydalanuvchi/loyiha
   7d4e2f8..3b9c1a4  main       -> origin/main
 * [new branch]      feature/api -> origin/feature/api

Diqqat: origin/main yangilandi, lekin sizning main o'zgarmadi.

Terminal
git status
Natija
On branch main
Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded.
Terminal
# Nima kelganini ko'rish
git log main..origin/main --oneline
git diff main origin/main
fetch - eng xavfsiz buyruq

U hech nimani o'zgartirmaydi, faqat ma'lumot olib keladi.

Ishonchsiz holatda har doim avval fetch qiling, nima kelganini ko'ring, keyin merge qiling. Bu ko'p muammodan saqlaydi.

Pull - olib kelish va birlashtirish #

Terminal
git pull origin main

pull = fetch + merge.

Terminal
# Kuzatuv o'rnatilgan bo'lsa
git pull
Natija
Updating 7d4e2f8..3b9c1a4
Fast-forward
 manba/api.php | 62 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

pull --rebase #

Terminal
git pull --rebase

Bu fetch + rebase qiladi - keraksiz merge kommitlar yaratilmaydi.

git pull (merge) git pull --rebase merge kommit qo'shiladi tarix shoxlanadi sizning kommitingiz oxiriga ko'chiriladi tarix chiziqli qoladi
Ko'p jamoalar pull.rebase ni standart qilib qo'yadi
Terminal
# Doimiy sozlash
git config --global pull.rebase true
pull avtomatik merge qiladi

git pull sizdan so'ramasdan merge qiladi. Konflikt bo'lsa - o'rtada qolib ketasiz.

Ehtiyotkor ish uslubi:

Terminal
git fetch
git log HEAD..origin/main --oneline    # nima kelganini ko'ring
git merge origin/main                  # keyin birlashtiring

Kuzatuvchi tarmoqlar #

Terminal
git branch -vv
Natija
* main          3b9c1a4 [origin/main] API qo'shildi
  feature/savat 7d4e2f8 [origin/feature/savat: ahead 2] Savat mantiqi
  local-test    5a8b3f0 Test tarmog'i
Ma'lumotMa'nosi
[origin/main]Bu tarmoq origin/main ni kuzatadi
ahead 2Sizda 2 ta yuborilmagan kommit bor
behind 3Serverda 3 ta olinmagan kommit bor
ahead 1, behind 2Ikkala tomonda ham yangilik bor
(bo'sh)Kuzatuv o'rnatilmagan
Terminal
# Kuzatuvni o'rnatish
git branch --set-upstream-to=origin/main main

# Yoki push paytida
git push -u origin main

Masofaviy tarmoqlar #

Terminal
git branch -r
Natija
  origin/HEAD -> origin/main
  origin/main
  origin/develop
  origin/feature/api
Terminal
# Masofaviy tarmoq asosida lokal yaratish
git switch feature/api

Git buni avtomatik tushunadi: origin/feature/api mavjud bo'lsa, shu nomdagi lokal tarmoq yaratib, kuzatuvni o'rnatadi.

Terminal
# Aniq ko'rsatib
git switch -c feature/api origin/feature/api

O'chirish #

Terminal
# Masofaviy tarmoqni o'chirish
git push origin --delete feature/eski

# Eski uslub
git push origin :feature/eski
Terminal
# Serverda o'chirilgan tarmoqlarni lokal ro'yxatdan tozalash
git fetch --prune

# Doimiy yoqish
git config --global fetch.prune true
--prune ni yoqing

Jamoada ishlaganda git branch -r da o'nlab allaqachon o'chirilgan tarmoqlar to'planib qoladi. fetch.prune true buni avtomatik tozalaydi.

HTTPS yoki SSH? #

HTTPSSSH
URLhttps://github.com/...[email protected]:...
SozlashOsonKalit yaratish kerak
Har safar parolHa (yoki menejer)Yo'q
Korporativ tarmoqdaOdatda ishlaydiBloklangan bo'lishi mumkin

Keyingi bo'limda SSH kalit yaratishni ko'ramiz.

Parolni kodda saqlamang
Terminal
# HECH QACHON SHUNDAY QILMANG
git remote add origin https://login:[email protected]/user/repo.git

Parol .git/config faylida ochiq matnda saqlanadi va tasodifan ulashilishi mumkin.

To'g'ri yechim - SSH kalit yoki Git Credential Manager.

Bir nechta remote #

Terminal
git remote add upstream https://github.com/asl-loyiha/loyiha.git
git remote -v
Natija
origin    https://github.com/men/loyiha.git (fetch)
origin    https://github.com/men/loyiha.git (push)
upstream  https://github.com/asl-loyiha/loyiha.git (fetch)
upstream  https://github.com/asl-loyiha/loyiha.git (push)
Terminal
# Asl loyihadan yangilanish olish
git fetch upstream
git merge upstream/main

Bu fork bilan ishlashda kerak - 12-bo'limda batafsil ko'ramiz.

Kundalik ish oqimi #

Terminal
# 1. Kunni boshlaganda
git switch main
git pull

# 2. Yangi vazifa
git switch -c feature/hisobot

# 3. Ishlash va kommit qilish
git add .
git commit -m "Hisobot sahifasi yaratildi"

# 4. Serverga yuborish
git push -u origin feature/hisobot

# 5. Ish davomida yana kommit
git commit -am "Hisobotga filtr qo'shildi"
git push

# 6. main dagi yangiliklarni olish
git fetch origin
git merge origin/main
Amaliy topshiriq
  1. GitHub da bo'sh repozitoriy yarating (hisob bo'lmasa - keyingi bo'limda).
  2. Lokal loyihangizga git remote add origin ... qiling.
  3. git push -u origin main bilan yuboring.
  4. GitHub saytida fayllar paydo bo'lganini tekshiring.
  5. GitHub saytida README.md ni to'g'ridan-to'g'ri tahrirlang va kommit qiling.
  6. Lokal git fetch qiling - origin/main yangilanganini ko'ring.
  7. git status da "behind 1 commit" yozuvini ko'ring.
  8. git pull bilan o'zgarishni oling.
  9. git branch -vv bilan kuzatuv holatini ko'ring.
  10. Yangi tarmoq yaratib push qiling, keyin uni serverdan o'chiring.

Xulosa #

  • git clone - mavjud repozitoriyni to'liq tarixi bilan nusxalaydi.
  • origin - shunchaki standart nom, o'zgartirish mumkin.
  • git push -u origin main - birinchi marta yuborishda kuzatuvni o'rnatadi.
  • git fetch - olib keladi, lekin birlashtirmaydi (eng xavfsiz).
  • git pull = fetch + merge.
  • git pull --rebase tarixni chiziqli saqlaydi.
  • git branch -vv - qaysi tarmoq nechta kommitga oldinda/ortda ekanini ko'rsatadi.
  • git fetch --prune o'chirilgan masofaviy tarmoqlarni tozalaydi.
  • Parolni URL ichida hech qachon saqlamang.

Keyingi bo'limda GitHub bilan to'liq tanishamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.