GitHub bilan ishlash: clone, push, pull
Hozirgacha Git bilan faqat o'z kompyuteringizda ishladingiz. Endi kodni internetga chiqaramiz. GitHub โ bu Git omborlarini bulutda saqlaydigan eng mashhur platforma. U kodni zaxiralash, boshqa qurilmalarda ochish va jamoa bilan hamkorlik qilish imkonini beradi. Ushbu darsda mahalliy va masofaviy (remote) omborlarni bog'lash, kodni yuborish (push), olish (pull) va sinxronlashni chuqur o'rganamiz.
Remote (masofaviy ombor) nima?
Remote โ bu sizning omboringizning internetdagi (yoki boshqa serverdagi) nusxasi. Mahalliy ombor sizning kompyuteringizda, remote esa GitHub kabi serverda turadi. Ular bir-biriga bog'lanadi va o'zgarishlar ular o'rtasida ikki tomonlama ko'chiriladi.
Remote'ning odatiy nomi โ origin. Bu โ shunchaki qulay taxallus (alias) bo'lib, uzun URL manzilni har safar yozmaslik uchun ishlatiladi. Ya'ni origin so'zi "asosiy masofaviy ombor URL'i"ni bildiradi.
Ikki asosiy vaziyat bor:
- Yangi mahalliy ombor yaratdingiz va uni GitHub'ga chiqarmoqchisiz โ bunda
git remote addishlatasiz; - GitHub'da mavjud omborni kompyuteringizga tushirmoqchisiz โ bunda
git cloneishlatasiz.
Ikkalasini ham navbat bilan ko'ramiz.
Remote'larni ko'rish: git remote
Ombor qanday remote'larga bog'langanini git remote ko'rsatadi. URL'lari bilan ko'rish uchun -v (verbose) qo'shamiz:
$ git remote -v
origin https://github.com/foydalanuvchi/loyiha.git (fetch)
origin https://github.com/foydalanuvchi/loyiha.git (push)
Bu yerda origin nomli remote ikki yo'nalishga bog'langan: fetch (olish) va push (yuborish). Hozircha bitta remote yetarli โ deyarli barcha oddiy loyihalarda faqat origin bo'ladi.
Mahalliy omborni remote'ga bog'lash: git remote add origin
Faraz qilaylik, kompyuteringizda tayyor ombor bor (siz git init qilib, commitlar ham qilgansiz). Endi uni GitHub'ga chiqarmoqchisiz. Avval github.com'da bo'sh ombor yaratasiz (README'siz), keyin uni mahalliy omborga bog'laysiz:
$ git remote add origin https://github.com/foydalanuvchi/loyiha.git
Bu buyruq shuni bildiradi: "origin nomli remote yarat va uni ushbu URL'ga ishora qildir". Endi bog'lanishni tekshiring:
$ git remote -v
origin https://github.com/foydalanuvchi/loyiha.git (fetch)
origin https://github.com/foydalanuvchi/loyiha.git (push)
https://github.com/...) va SSH (git@github.com:...). HTTPS oddiyroq va yangi boshlovchilarga qulay (login/parol yoki token so'raydi). SSH esa kalit sozlangach parolsiz ishlaydi va professional foydalanishda qulay. Boshlash uchun HTTPS'dan foydalaning.git remote set-url origin YANGI-URL. Butunlay o'chirish uchun: git remote remove origin. "remote origin already exists" xatosini olsangiz โ demak origin allaqachon bor, uni qayta qo'shish o'rniga set-url bilan yangilang.Kodni yuborish: git push -u origin main
Endi mahalliy commitlarni GitHub'ga jo'natamiz. Buni push deb ataymiz. Birinchi marta yuborishda maxsus -u bayrog'ini ishlatamiz:
$ git push -u origin main
Enumerating objects: 5, done.
Writing objects: 100% (5/5), 480 bytes, done.
To https://github.com/foydalanuvchi/loyiha.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
Buyruqni qismlarga ajratamiz:
git pushโ o'zgarishlarni remote'ga yuborish;-u(yoki--set-upstream) โ mahalliymainni masofaviyorigin/mainga bog'laydi (kuzatuv, tracking o'rnatadi);originโ qaysi remote'ga (bizning taxallusimiz);mainโ qaysi branch'ni yuborayapmiz.
-u tufayli keyingi safar shunchaki git push yozsangiz kifoya โ Git qayerga yuborishni allaqachon eslab qoladi:
# keyingi push'lar oddiy:
$ git push
Enumerating objects: 3, done.
To https://github.com/foydalanuvchi/loyiha.git
1a2b3c4..5d6e7f8 main -> main
git add . → git commit -m 'xabar' → git push. Ya'ni avval o'zgarishni saqlaysiz (commit), keyin uni internetga yuborasiz (push). Commit โ mahalliy, push โ masofaviy. Bu ikkisi alohida qadamlar.Mavjud omborni nusxalash: git clone
Agar GitHub'da tayyor ombor bo'lsa (masalan, birov yaratgan yoki siz avval chiqargan), uni butunlay kompyuteringizga tushirish uchun git clone ishlatiladi:
$ git clone https://github.com/foydalanuvchi/loyiha.git
Cloning into 'loyiha'...
remote: Enumerating objects: 25, done.
Receiving objects: 100% (25/25), 4.20 KiB, done.
Resolving deltas: 100% (8/8), done.
Bu buyruq juda ko'p ishni bir zumda bajaradi:
- GitHub'dan barcha fayllarni va butun commit tarixini yuklab oladi;
loyihanomli papka yaratadi;originremote'ini avtomatik sozlaydi (qo'ldagit remote addshart emas);- asosiy branch'ni kuzatuvga o'rnatadi โ darhol
push/pullga tayyor.
Klonlangan papkaga kirib, darhol ishlashni boshlashingiz mumkin:
$ cd loyiha
$ git remote -v
origin https://github.com/foydalanuvchi/loyiha.git (fetch)
origin https://github.com/foydalanuvchi/loyiha.git (push)
git clone URL yangi-nom. Bunda loyiha o'rniga yangi-nom papkasi yaratiladi.Yangilanishlarni olish: git pull
Jamoada ishlaganda yoki boshqa qurilmadan o'zgartirganda, GitHub'dagi kod sizning mahalliy nusxangizdan yangiroq bo'lishi mumkin. Masofaviy o'zgarishlarni o'z kompyuteringizga tortish uchun git pull:
$ git pull
remote: Enumerating objects: 4, done.
Updating 5d6e7f8..9a8b7c6
Fast-forward
README.md | 3 +++
1 file changed, 3 insertions(+)
git pull ikki ishni birga bajaradi: GitHub'dan yangi commitlarni yuklab oladi (fetch) va ularni sizning joriy branch'ingizga birlashtiradi (merge). Natijada mahalliy nusxangiz yangilanadi.
git pull qiling. Bu sizni jamoadagi eng so'nggi o'zgarishlar bilan sinxron holatda ushlaydi va push qilganda konflikt ehtimolini kamaytiradi.git fetch va git pull farqi
Ko'pchilik fetch va pullni chalkashtiradi. Farqi juda muhim:
git fetchโ GitHub'dan yangi commitlarni faqat yuklab oladi, lekin sizning ishchi fayllaringizga tegmaydi. O'zgarishlarorigin/mainda "kutib" turadi. Siz avval ularni ko'rib, keyin birlashtirishingiz mumkin.git pullโ bu aslida fetch + merge. Ya'ni yuklab oladi va darhol sizning branch'ingizga qo'shadi.
Ya'ni sodda formula:
git pull = git fetch + git merge origin/main
Ehtiyotkor ish oqimi โ avval fetch, keyin ko'rib, so'ng merge:
# 1. Faqat yuklab olamiz (ishchi fayllar o'zgarmaydi)
$ git fetch origin
# 2. Nima o'zgarganini ko'ramiz
$ git log main..origin/main --oneline
9a8b7c6 README yangilandi
# 3. Rozimiz โ birlashtiramiz
$ git merge origin/main
fetch xavfsizroq: u hech narsani buzmaydi, faqat ma'lumot keltiradi. Katta yoki muhim o'zgarishlardan oldin fetch qilib, nima kelayotganini ko'rib olish โ professional odat. Kundalik oddiy ishda esa git pull yetarli va qulay.Mahalliy va masofaviy sinxronizatsiya
Endi umumiy manzarani jamlaymiz. Ikki ombor (mahalliy va masofaviy) o'rtasida o'zgarishlar shunday harakatlanadi:
- push โ mahalliy → masofaviy (sizning commitlaringizni GitHub'ga yuborasiz);
- pull โ masofaviy → mahalliy (GitHub'dagi o'zgarishlarni olasiz);
- fetch โ masofaviy → mahalliy (lekin birlashtirmasdan, faqat yuklab).
Tipik kunlik oqim quyidagicha ko'rinadi:
# ishni boshlash: eng so'nggi holatni olamiz
$ git pull
# ... kod yozamiz, fayllarni o'zgartiramiz ...
# o'zgarishni saqlaymiz
$ git add .
$ git commit -m 'Yangi funksiya qoshildi'
# internetga yuboramiz
$ git push
git pull qiling (kerak bo'lsa konfliktni hal qiling), keyin qaytadan git push. Git avval masofaviy o'zgarishlarni olishni talab qiladi, aks holda ular yo'qolib qolar edi.Xulosa
- Remote โ omboringizning masofaviy (GitHub'dagi) nusxasi; odatiy nomi
origin; git remote add origin URLโ mahalliy omborni GitHub'ga bog'lash;git clone URLโ GitHub'dagi tayyor omborni butunlay nusxalash (remote avtomatik sozlanadi);git push -u origin mainโ birinchi yuborish (kuzatuv o'rnatadi); keyin oddiygit push;git pullโ masofaviy o'zgarishlarni olish va birlashtirish (= fetch + merge);git fetchโ faqat yuklab olish, ishchi fayllarga tegmasdan;- kunlik oqim:
pull→ ishlash →add→commit→push.
Endi kodni internetga chiqarishni bilasiz. Keyingi darsda jamoa bilan ishlash โ fork va Pull Request oqimini o'rganamiz.