Git va GitHub

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.

Bu darsdagi buyruqlar terminalda ishlaydi va haqiqiy GitHub akkaunti hamda internet aloqasini talab qiladi. Kurs sahifasidagi playground'da ular ishlamaydi โ€” quyidagi bloklar statik misol. Ularni o'z kompyuteringizda, github.com'da yaratgan ombor bilan sinab ko'ring.

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:

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)
GitHub omborining URL'i ikki xil bo'ladi: HTTPS (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.
Agar remote'ni noto'g'ri URL bilan qo'shsangiz, uni o'zgartirish uchun: 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:

-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
Odatiy ish oqimi shunday: 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:

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)
Boshqa nom bilan klonlash uchun URL oxiriga papka nomini qo'shing: 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.

Yaxshi odat: har kuni ishni boshlashdan oldin 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:

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:

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
Agar push qilmoqchi bo'lganingizda "Updates were rejected" xatosini olsangiz โ€” demak GitHub'da siz bilmagan yangi commitlar bor (masalan, jamoadoshingiz push qilgan). Yechim: avval 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

Endi kodni internetga chiqarishni bilasiz. Keyingi darsda jamoa bilan ishlash โ€” fork va Pull Request oqimini o'rganamiz.