Git nega kerak va uni qanday sozlaymiz?
Mundarija
Kompyuteringizdagi loyiha papkasini bir ochib ko'ring. Katta ehtimol bilan u yerda shunga o'xshash nomlar turibdi:
kurs_loyiha/
kurs_loyiha_yangi/
kurs_loyiha_final/
kurs_loyiha_final_v2/
kurs_loyiha_final_v2_oxirgi/
kurs_loyiha_ISHLAYDIGAN_shu/
Bu — hammamizni boshimizdan o'tgan bosqich. Kod ishlab turganda uni buzib qo'yishdan
qo'rqasiz, shuning uchun papkani nusxalab qo'yasiz va yangisida ishlaysiz.
Bir hafta o'tib esa ochilmaydigan savol paydo bo'ladi: qaysi biri eng
yangisi? oxirgi dagi funksiya v2 dagisidan yaxshiroqmi, yoki men uni
ISHLAYDIGAN_shu da tuzatganmidim?
Mana shunaqa savollar tug'ilib javob berishga qiyinlashmasligi uchun Git yaratilgan.
Git aslida nima qiladi#
Git — loyihangizning tarixini yozib boradigan dastur. Siz "shu holatni saqlab qo'y" desangiz, u o'sha ondagi barcha fayllarning holatini eslab qoladi. Bunday saqlash nuqtasi commit deb ataladi.
Papka nusxalashdan farqi shundaki, Git butun papkani takrorlamaydi. U faqat nima o'zgarganini yozadi: qaysi faylning qaysi qatori qo'shildi, qaysi biri o'chdi. Shuning uchun yuzta commit qilsangiz ham loyihangiz yuz barobarga og'irlashmaydi.
Va har commitda uchta narsa saqlanadi: nima o'zgardi, qachon o'zgardi va kim o'zgartirdi. Oxirgisi hozircha ortiqchadek tuyulishi mumkin, lekin maqola oxirida ko'rasiz — aynan shu joyda ko'pchilik birinchi xatoga yo'l qo'yadi.
Git va GitHub — bir narsa emas#
Bu ikkisi doim yonma-yon aytilgani uchun boshida chalkashtiriladi.
Git — kompyuteringizga o'rnatiladigan dastur. Internetsiz ham to'liq ishlaydi: offline ham commit qilaverasiz internet kerak emas.
GitHub — Git loyihalarini saqlaydigan sayt. U Git'ni o'ylab topmagan ham, unga egalik ham qilmaydi. Shunga o'xshash boshqa saytlar ham bor: GitLab, Bitbucket, Gitea.
Ya’ni, Git — ishingizni boshqaradigan vosita, GitHub esa — shu ishni saqlash va ulashish uchun joy. Git GitHubsiz ham ishlaydi, ammo GitHub Git’siz deyarli ishlamaydi.
O'rnatamiz#
Windows. git-scm.com/download/win saytiga kirsangiz yuklab olish o'zi avtomatik boshlanadi. O'rnatuvchida ancha savol chiqadi; birinchi marta o'rnatayotgan bo'lsangiz hammasini o'zgartirmasdan "Next" bosib o'taverasiz. O'rnatish tugagach kompyuteringizda Git Bash degan dastur paydo bo'ladi — buyruqlarni shunda yozasiz.
macOS. Terminalni ochib git --version deb yozing. Agar Git hali
o'rnatilmagan bo'lsa, tizim o'zi taklif qiladi. Homebrew ishlatsangiz:
brew install git
Linux (Ubuntu/Debian).
sudo apt update
sudo apt install git
O'rnatilganini tekshiramiz:
git --version
git version 2.50.1 (Apple Git-155)
Sizda boshqa raqam chiqadi va bu normal. Muhimi — git version degan javob
kelsa, o'rnatilgan.
Endi eng muhim qadam#
Ko‘p qo‘llanmalarda bu qism “sozlash” deb ataladi va ikki qator bilan tushuntirib o‘tiladi.
Aslida esa bu — butun maqoladagi eng muhim qismlardan biri. Chunki aynan shu yerda Git ba’zan biz kutmagan tarzda ishlashi mumkin.
Keling, buni ataylab tekshirib ko‘ramiz. Git’ga hali kim ekanimizni aytmasdan turib, commit qilishga urinib ko‘ramiz:
git commit -m "sinov"
[main (root-commit) 7f63a26] sinov
Committer: career <career@macshops-HN93RCWTNQ.local>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
Diqqat bilan qarang: Git xato bermadi. U commitni qabul qildi.
Kimligimizni bilmagani uchun kompyuterdagi foydalanuvchi nomi va
kompyuterning nomini olib, o'zi bir email yasab qo'ydi —
career@macshops-HN93RCWTNQ.local.
Bunday email realda mavjud emas. Lekin commit yozilib bo'ldi.
Nega bu muhim? Chunki GitHub commitni sizning profilingizga aynan email orqali bog'laydi. Email notanish bo'lsa, GitHub commitni hech kimga bog'lay olmaydi. Natijada:
- profilingizdagi hissa jadvali (yashil kvadratchalar) bo'sh qolaveradi;
- repository'ning Contributors ro'yxatida siz turmaysiz;
- jamoada ishlasangiz, "bu kodni kim yozgan?" degan savolga javob topilmaydi.
Eng yomoni shuki, buni odam odatda oylar o'tib, o'nlab commitdan keyin sezadi. Xato xabari chiqmagani uchun hech narsa e'tiborni tortmaydi.
Shuning uchun Git o'rnatilgach birinchi bo'lib qiladigan ish — kimligimizni aytish:
git config --global user.name "Ism Familiya"
git config --global user.email "sizning@emailingiz.com"
--global — bu sozlama shu kompyuterdagi barcha Git loyihalariga qo‘llanadi degani. Bu buyruqlar bajarilganda terminalda hech qanday xabar chiqmasligi mumkin. Bu xatolik emas — Git buyruqni jimgina bajaradi va bu mutlaqo normal.
Email qaysi biri bo'lishi kerak#
Bu yerda ikkita yo'l bor.
Oddiy yo'l — GitHub'da ro'yxatdan o'tgan email'ingizni yozish. Ishlaydi, lekin bir nozik tomoni bor: har commitingiz bilan birga email'ingiz ham tarixga yoziladi va repo ochiq bo'lsa, uni istagan odam ko'ra oladi.
Shuning uchun GitHub har bir foydalanuvchiga maxfiy email beradi. U shunday ko'rinadi:
109437399+AsadbekSolijonov@users.noreply.github.com
Bu email haqiqiy pochtangizni oshkor qilmaydi, lekin GitHub commitni
profilingizga bemalol bog'laydi. O'zingiznikini GitHub'da Settings →
Emails bo'limidan topasiz (Keep my email addresses private yonida
yozilgan bo'ladi).
Men aynan shu ikkinchi usulni tavsiya qilaman. Uni bir marta sozlab qo‘yasiz, keyin esa qayta-qayta o‘ylab yurishga hojat qolmaydi.
Yana bitta sozlama#
Git yangi loyiha yaratganda asosiy branch nomi qanday bo‘lishini ham oldindan belgilab qo‘yamiz:
git config --global init.defaultBranch main
Eski Git versiyalarida asosiy branch odatda master deb nomlanardi. GitHub esa hozir main nomidan foydalanadi. Ikkalasini bir xil qilib qo‘ygan ma’qul — aks holda birinchi push paytida ortiqcha chalkashlik yuzaga kelishi mumkin.
Sozlanganini tekshiramiz#
git config user.name
git config user.email
Asadbek Solijonov
109437399+AsadbekSolijonov@users.noreply.github.com
Ikkalasi to'g'ri chiqsa, Git tayyor.
Yana bir foydali buyruq bor — u nafaqat qiymatni, balki qaysi fayldan kelayotganini ham ko'rsatadi:
git config --list --show-origin | grep user
file:~/.gitconfig user.name=Asadbek Solijonov
file:~/.gitconfig user.email=109437399+AsadbekSolijonov@users.noreply.github.com
Hozircha faqat bitta fayl ko‘rinadi, chunki biz hozircha faqat global sozlamani o‘rnatdik. Aslida Git sozlamalarni uch xil joydan o‘qiydi. Agar bir xil sozlama bir nechta joyda berilgan bo‘lsa, ustunlik darajasi yuqoriroq bo‘lgan sozlama ustun keladi:
| Qayerda | Kimga tegishli | Buyrug'i |
|---|---|---|
| Tizim | kompyuterdagi hamma | --system |
| Global | shu foydalanuvchi | --global |
| Local | faqat shu loyiha | (belgisiz) |
Pastdagi sozlama yuqoridagidan ustun turadi. Masalan, loyiha ichida boshqa email ko‘rsatsangiz, shu loyiha uchun global email emas, aynan loyiha ichidagi email ishlatiladi:
# loyiha papkasi ichida turib, --global YOZMASDAN faqat shu loyiha uchun:
git config user.email "ish@kompaniya.com"
Bu — shunchaki qo‘shimcha imkoniyat emas, balki amalda juda kerakli funksiya. Ish loyihalarida korporativ email, shaxsiy loyihalarda esa o‘z emailingizdan foydalanish kerak bo‘lsa, aynan shu sozlama qo‘l keladi. Seriyaning oxirgi qismida bitta kompyuterda ikkita GitHub akkaunt bilan ularni aralashtirmasdan ishlashni ham amalda ko‘rib chiqamiz.
Shoshib noto'g'ri commit qilib qo'ygan bo'lsangiz#
Bu holat ko'p uchraydi: odam bir necha commit qilib, keyin sozlashni o'qiydi. Tarixda esa allaqachon notanish nom qolib ketgan bo'ladi.
Oxirgi commitni tuzatish oson. Avval kim yozilganini ko'ramiz:
git log -1 --format="%an <%ae>"
career <career@macshops-HN93RCWTNQ.local>
Endi Git'ga "shu commitni qayta yoz, muallifni esa yangi sozlamadan ol" deymiz:
git commit --amend --reset-author --no-edit
--amend — oxirgi commitni yangilaydi, --reset-author — muallifni
yangilash, --no-edit — commit matniga tegmaslik. Tekshiramiz:
git log -1 --format="%an <%ae>"
Asadbek Solijonov <109437399+AsadbekSolijonov@users.noreply.github.com>
Muallif almashdi.
Bitta ogohlantirish: --amend commitni tuzatmaydi, o'rniga yangisini
yozadi. Agar o'sha commit GitHub'ga hali yuborilmagan bo'lsa — muammo yo'q.
Yuborilgan bo'lsa, tarix ikkiga ayrilib qoladi va uni to'g'rilash alohida
ish. Bu haqda 9-qismda batafsil gaplashamiz; hozircha shu qoidani eslab
qoling: push qilingan commitni o'zgartirmang.
Bir necha eski commitning muallifini birdaniga almashtirish ham mumkin, lekin u ancha jiddiyroq amaliyot. Hozir bunga kirishmaymiz — yangi boshlaganlar uchun eng foydalisi shu xatoga umuman yo'l qo'ymaslik.
Davom etishdan oldin bitta maslahat#
Git’ning eng tushunarsiz mavzularidan biri — branch va merge. Ular haqida keyingi qismlarda batafsil gaplashamiz. Lekin terminalda ishlatishdan oldin ularni ko‘z bilan ko‘rib, qanday ishlashini tushunib olsangiz, keyingi qadamlar ancha oson bo‘ladi.
Buning uchun eng yaxshi joy — learngitbranching.js.org. Brauzerda ochiladi, hech narsa o'rnatish shart emas: buyruq yozasiz, ekranda commitlar daraxti darrov o'zgaradi. Birinchi bo‘limini taxminan 20 daqiqada ko‘rib chiqsangiz, keyingi qismlarni tushunish ancha oson bo‘ladi.
Men buni maqola oxirida emas, aynan shu yerda tavsiya qilyapman. Chunki oxirida berilgan havolalar ko‘pincha ochilmay qoladi.
Mashq repozitoriysi#
Bu seriyada qiladigan barcha ishlarimizni ochiq repozitoriyga joylab boramiz:
github.com/AsadbekSolijonov/git-darslik
U yerdagi commitlar, branchlar va conflictlar shunchaki misol uchun o‘ylab topilmagan. Hammasi shu darslikni tayyorlash jarayonida qilingan haqiqiy ishlar.
Biror joyda sizda boshqacha natija chiqsa yoki qayerdadir adashsangiz, repozitoriyni ochib, men qilgan qadamlar bilan solishtirib ko‘rishingiz mumkin.
Shu qismning buyruqlari#
| Buyruq | Vazifasi |
|---|---|
git --version |
Git o'rnatilganini tekshirish |
git config --global user.name "Ism" |
Commitlarda turadigan ism |
git config --global user.email "email" |
Commitlarda turadigan email |
git config --global init.defaultBranch main |
Yangi loyihalarda default branch nomi |
git config user.email |
Joriy loyihada qaysi email ishlayotgani |
git config --list --show-origin |
Sozlama qaysi fayldan kelayotgani |
git commit --amend --reset-author --no-edit |
Oxirgi commit muallifini to'g'rilash |
Keyingi qismda#
Git tayyor, lekin hali bironta loyihamiz yo'q. Keyingi qismda xarajat
degan kichik Python skriptini boshlaymiz va Git'ning eng asosiy mexanizmini birgalikda
ochamiz: fayl commitgacha uch bosqichdan o'tadi va ko'pchilikni
boshida chalkashtiradigan git add aynan shu yerda tushuniladi.