Asosiy kontentga o‘tish

Maqolalar 15 daqiqa 48 ko‘rish

Git bilan tanishuv: rasmiy qo‘llanma

Git'ning rasmiy kirish qo‘llanmasi o‘zbekchada: loyihani git init bilan boshlash, o‘zgarishlarni commit qilish, branchlar bilan ishlash va Alice–Bob misolida hamkorlik. Seriyaning birinchi uch qismini bajargach, rasmiy manbani o‘z tilingizda o‘qish uchun.

git devops

Mundarija

Birinchi uch qismda Git'ni o‘rnatdik, sozladik va birinchi commitni qildik. Endi rasmiy qo‘llanmaning o‘zi — Git jamoasi yozgan kirish matni. Unda siz allaqachon ko‘rgan buyruqlar boshqa tomondan, manba muallifining tilida tushuntiriladi, oxirida esa ikki kishi bir loyihada qanday ishlashi ko‘rsatiladi.

Bu ma’lumotnoma, dars emas

Bu qism Git'ning rasmiy qo‘llanmasi (git help tutorial, Git 2.50.1) asosida o‘zbekchaga o‘girilgan. Ketma-ket bajariladigan dars emas: kerak bo‘lganda ochib, kerakli joyini o‘qiysiz. Git'ni noldan o‘rganmoqchi bo‘lsangiz, avval Git va GitHub darslarini bajaring.

Buyruqlar asl holida saqlangan.

Nomi#

gittutorial — Git bilan tanishtiruvchi qo‘llanma.

Qisqacha ishlatilishi#

Terminal
git *

Tavsif#

Ushbu qo‘llanma yangi loyihani Git’ga kiritish, unga o‘zgartirishlar kiritish va bu o‘zgartirishlarni boshqa dasturchilar bilan ulashishni tushuntiradi.

Agar siz Git’dan, asosan, loyihani yuklab olish (masalan, uning eng so‘nggi versiyasini sinash) uchun foydalanmoqchi bo‘lsangiz, avval Git foydalanuvchi qo‘llanmasining dastlabki ikki bobini o‘qishingiz ma’qul.

Buyruq hujjatini olish:

Terminal
man git-log
# yoki
git help log

Ikkinchi usulda o‘zingiz xohlagan qo‘llanma ko‘ruvchisidan foydalanishingiz mumkin; batafsil ma’lumot uchun git-help(1) ga qarang.

Git bilan ishlashdan oldin ismingiz va ochiq elektron pochta manzilingizni tanishtirish yaxshi amaliyotdir:

Terminal
git config --global user.name "Your Name Comes Here"
git config --global user.email you@yourdomain.example.com

Yangi loyihani kiritish#

Dastlabki ishingiz saqlangan project.tar.gz arxivi bor deb faraz qilamiz. Uni Git versiya nazoratiga quyidagicha qo‘shing:

Terminal
tar xzf project.tar.gz
cd project
git init

Git javobi:

Natija
Initialized empty Git repository in .git/

Ishchi katalog endi Git uchun tayyorlandi; yangi .git katalogi yaratilganini ko‘rishingiz mumkin.

Sizda bundan ko‘proq matn chiqishi mumkin

Yuqoridagi javob rasmiy qo‘llanmadagidek keltirilgan. Bugungi Git esa, agar init.defaultBranch sozlanmagan bo‘lsa, undan oldin uzun eslatma ham chiqaradi: hint: Using 'master' as the name for the initial branch. This default branch name will change to "main" in Git 3.0. Bu xato emas — Git shunchaki boshlang‘ich branch nomini o‘zingiz tanlashingizni taklif qilyapti. Uni bir marta sozlab qo‘ysangiz eslatma boshqa chiqmaydi. Yo‘l ham to‘liq ko‘rinishda yozilishi mumkin (.git/ o‘rniga /home/siz/project/.git/).

Keyin joriy katalog ostidagi barcha fayllar tarkibining suratini (. joriy katalogni bildiradi) Git’ga bering:

Terminal
git add .

Bu surat vaqtinchalik tayyorlash maydonida saqlanadi; Git uni index deb ataydi. Indeks tarkibini repozitoriyda doimiy saqlash uchun:

Terminal
git commit

Git commit xabarini kiritishni so‘raydi. Shu bilan loyihangizning birinchi versiyasi Git’da saqlanadi.

O‘zgartirishlar kiritish#

Bir nechta faylni o‘zgartiring, so‘ng yangilangan tarkibini indeksga qo‘shing:

Terminal
git add file1 file2 file3

Endi commit qilishga tayyorsiz. Commitga nimalar kirishini ko‘rish uchun:

Terminal
git diff --cached

--cached bo‘lmasa, git diff siz o‘zgartirgan, ammo hali indeksga qo‘shmagan o‘zgarishlarni ko‘rsatadi. Holatning qisqa xulosasi:

Terminal
git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

        modified:   file1
        modified:   file2
        modified:   file3

Qo‘shimcha tuzatish zarur bo‘lsa, hozir bajaring va yangi o‘zgargan tarkibni yana indeksga qo‘shing. So‘ng:

Terminal
git commit

Git yana o‘zgarishni tavsiflovchi xabarni so‘raydi va loyihaning yangi versiyasini yozib qo‘yadi.

Oldindan git add ishlatish o‘rniga:

Terminal
git commit -a

Bu buyruq o‘zgartirilgan (ammo yangi bo‘lmagan) fayllarni avtomatik aniqlaydi, indeksga qo‘shadi va bitta qadamda commit qiladi.

Commit xabarlari haqida#

Majburiy bo‘lmasa-da, commit xabarini o‘zgarishni qisqacha ifodalovchi bitta satr (50 belgidan oshmagan) bilan boshlash, undan keyin bo‘sh satr va batafsil tavsif yozish tavsiya etiladi. Birinchi bo‘sh satrgacha bo‘lgan matn commit sarlavhasi hisoblanadi va Git bo‘ylab ishlatiladi. Masalan, git-format-patch(1) commitni emailga aylantirganda sarlavhani Subject qatorida, qolgan matnni esa xat tanasida ishlatadi.

Git fayllarni emas, tarkibni kuzatadi#

Ko‘p versiya nazorati tizimlarida add buyrug‘i tizimga yangi fayl o‘zgarishlarini kuzatishni boshlashni aytadi. Git’dagi add sodda va kuchliroq: git add ham yangi, ham yaqinda o‘zgartirilgan fayllar uchun ishlatiladi. Har ikki holatda u berilgan fayllarning suratini olib, ularning tarkibini keyingi commit uchun indeksga tayyorlaydi.

Loyiha tarixini ko‘rish#

Terminal
git log

Har bir bosqichdagi to‘liq farqlarni ko‘rish:

Terminal
git log -p

Har bir bosqich haqida umumiy tasavvur beruvchi o‘zgarishlar xulosasi:

Terminal
git log --stat --summary

Branchlarni boshqarish#

Bitta Git repozitoriysi bir nechta rivojlantirish branchini saqlashi mumkin. experimental nomli branch yarating:

Terminal
git branch experimental
git branch
  experimental
* master

experimental — hozirgina yaratilgan branch, master esa avtomatik yaratilgan standart branch. Yulduzcha joriy branchni ko‘rsatadi. experimental ga o‘tish:

Terminal
git switch experimental

Endi faylni tahrirlang, o‘zgarishni commit qiling va master ga qayting:

Terminal
# faylni tahrirlang
git commit -a
git switch master

Kiritgan o‘zgarishingiz endi ko‘rinmayotganini tekshiring: u experimental branchida qilingan, siz esa master ga qaytdingiz.

master branchida boshqa o‘zgarish qilishingiz mumkin:

Terminal
# faylni tahrirlang
git commit -a

Endi ikki branch ajraldi va har birida boshqa-boshqa o‘zgarish bor. experimental dagi o‘zgarishlarni master ga birlashtirish:

Terminal
git merge experimental

O‘zgarishlar to‘qnashmasa, ish tugadi. To‘qnashuv bo‘lsa, muammoli fayllarda konflikt belgilari qoladi. Ularni ko‘rish:

Terminal
git diff

Fayllarni tahrirlab konfliktlarni hal qilgach, birlashtirish natijasini commit qiling:

Terminal
git commit -a
gitk

gitk hosil bo‘lgan tarixning qulay grafik ko‘rinishini beradi. Endi experimental branchini o‘chirish mumkin:

Terminal
git branch -d experimental

Bu buyruq experimental dagi o‘zgarishlar allaqachon joriy branchda borligini tekshiradi.

Agar crazy-idea branchidagi ishingizdan voz kechsangiz, uni majburan o‘chirishingiz mumkin:

Terminal
git branch -D crazy-idea

Branchlar arzon va oson yaratiladi, shu sabab ular yangi g‘oyalarni sinashning yaxshi usulidir.

Git’dan hamkorlikda foydalanish#

Alice /home/alice/project da yangi Git loyihasini boshlagan, shu kompyuterda uy katalogiga ega Bob esa unga hissa qo‘shmoqchi deb faraz qilamiz.

Bob boshlaydi:

Terminal
# Bob o‘z kompyuterida
git clone /home/alice/project myrepo

Bu Alice repozitoriysining klonini saqlovchi myrepo katalogini yaratadi. Klon asl loyiha bilan teng huquqli bo‘lib, loyiha tarixining o‘z nusxasiga ega.

Bob o‘zgarishlar kiritib, ularni commit qiladi:

Terminal
# fayllarni tahrirlang
# Bob o‘z kompyuterida
git commit -a
# kerak bo‘lsa takrorlang

Tayyor bo‘lgach, Bob Alice’ga /home/bob/myrepo dan o‘zgarishlarni tortib olishni aytadi:

Terminal
# Alice o‘z kompyuterida
cd /home/alice/project
git pull /home/bob/myrepo master

Bu Bobning master branchidagi o‘zgarishlarni Alice’ning joriy branchiga birlashtiradi. Alice bu orada o‘z o‘zgarishlarini qilgan bo‘lsa, konfliktlarni qo‘lda tuzatishi mumkin.

pull ikki amalni bajaradi: masofaviy branchdan o‘zgarishlarni oladi (fetch), keyin ularni joriy branchga birlashtiradi (merge).

Odatda Alice pull dan oldin mahalliy o‘zgarishlarini commit qilishi kerak. Bobning ishi tarixlar ajralganidan keyin Alice qilgan ish bilan to‘qnashsa, Alice konfliktni ishchi daraxt va indeks orqali hal qiladi. Commit qilinmagan mahalliy o‘zgarishlar bu jarayonga xalaqit beradi: Git o‘zgarishlarni oladi, ammo birlashtirishni rad etadi; Alice mahalliy o‘zgarishlarini bir yo‘l bilan chetga olishi va yana pull qilishi kerak.

Alice birlashtirmasdan Bobning ishini ko‘rib chiqishi mumkin:

Terminal
# Alice o‘z kompyuterida
git fetch /home/bob/myrepo master
git log -p HEAD..FETCH_HEAD

Bu amal Alice’da commit qilinmagan o‘zgarishlar bo‘lsa ham xavfsiz. HEAD..FETCH_HEAD — “FETCH_HEAD dan erishish mumkin bo‘lgan hamma narsani ko‘rsat, ammo HEAD dan erishish mumkin bo‘lganlarini chiqarib tashla” degani. Alice o‘zining joriy holatiga (HEAD) olib kelgan tarixni biladi va Bobning hali ko‘rmagan holatini (FETCH_HEAD) tekshiradi.

Tarixlar ajralganidan beri Bob nima qilganini grafikda ko‘rish:

Terminal
gitk HEAD..FETCH_HEAD

Bu git log dagidek ikki nuqtali oraliq yozuvidir. Ikkala tomon qilgan ishni ko‘rish uchun uch nuqta ishlatiladi:

Terminal
gitk HEAD...FETCH_HEAD

Bu “ikkalasidan istalgan biri orqali erishiladigan hamma narsani ko‘rsat, ammo ikkalasidan ham erishiladiganlarini chiqarib tashla” degani. Bu oraliq yozuvlari gitk va git log bilan ishlaydi.

Bobning ishini tekshirgach, shoshilinch narsa bo‘lmasa, Alice uni tortib olmasdan ishlashda davom etishi mumkin. Zarur o‘zgarish bo‘lsa, Alice avval tugallanmagan ishini stash qiladi, pull bajaradi va so‘ng ishini hosil bo‘lgan tarix ustiga stash’dan qaytaradi.

Bir xil repozitoriy bilan tez-tez ishlaganda masofaviy repozitoriy uchun qisqa nom yaratish qulay:

Terminal
# Alice o‘z kompyuterida
git remote add bob /home/bob/myrepo
git fetch bob

To‘liq yo‘ldan farqli ravishda, git remote bilan belgilangan qisqa nom orqali olingan ma’lumot masofaviy kuzatuv branchida — bu holatda bob/master da — saqlanadi:

Terminal
# Alice o‘z kompyuterida
git log -p master..bob/master

Bu Bob Alice’ning master branchidan ajralganidan beri qilgan barcha o‘zgarishlarini ko‘rsatadi. Ularni tekshirgach, Alice birlashtirishi mumkin:

Terminal
# Alice o‘z kompyuterida
git merge bob/master

O‘z masofaviy kuzatuv branchidan pull qilish orqali ham birlashtirish mumkin:

Terminal
# Alice o‘z kompyuterida
git pull . remotes/bob/master

git pull buyruq satrida yana nima berilganidan qat’i nazar, doim joriy branchga birlashtiradi.

Keyin Bob Alice’ning so‘nggi o‘zgarishlari bilan repozitoriysini yangilaydi:

Terminal
# Bob o‘z kompyuterida
git pull

Bob Alice repozitoriysining yo‘lini berishi shart emas: klonlash vaqtida Git bu manzilni konfiguratsiyada saqlagan:

Terminal
# Bob o‘z kompyuterida
git config --get remote.origin.url
/home/alice/project

git clone yaratgan to‘liq konfiguratsiya git config -l orqali ko‘rinadi; har bir parametr ma’nosi git-config(1) da tushuntirilgan.

Git Alice’ning master branchi toza nusxasini origin/master nomi bilan ham saqlaydi:

Terminal
# Bob o‘z kompyuterida
git branch -r
  origin/master

Bob boshqa kompyuterdan ishlasa, SSH orqali klonlash va tortib olish mumkin:

Terminal
# Bob o‘z kompyuterida
git clone alice.org:/home/alice/project myrepo

Git o‘zining mahalliy protokolidan yoki HTTP’dan ham foydalana oladi; git-pull(1) ga qarang. Git markaziy repozitoriyga turli foydalanuvchilar o‘zgarishlarni push qiladigan CVS’ga o‘xshash rejimda ham ishlaydi; git-push(1) va gitcvs-migration(7) ga qarang.

Tarixni o‘rganish#

Git tarixi o‘zaro bog‘langan commitlar ketma-ketligidir. git log ularni ro‘yxatlaydi. Har bir yozuvning birinchi satri commit nomi — identifikatorini ham beradi:

Terminal
git log
commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
Author: Junio C Hamano <junkio@cox.net>
Date:   Tue May 16 17:18:22 2006 -0700

    merge-base: Clarify the comments on post processing.

Commit tafsilotlarini ko‘rish:

Terminal
git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7

Commitga murojaat qilishning boshqa usullari ham bor. Uni yagona aniqlashga yetadigan boshlang‘ich qismdan foydalanish mumkin:

Terminal
git show c82a22c39c   # nomning dastlabki bir nechta belgisi odatda yetadi
git show HEAD         # joriy branchning eng so‘nggi nuqtasi
git show experimental # "experimental" branchining eng so‘nggi nuqtasi

Har bir commit odatda loyihaning oldingi holatiga ishora qiluvchi bitta parent commitga ega:

Terminal
git show HEAD^  # HEAD ota commitini ko‘rish
git show HEAD^^ # HEAD bobo commitini ko‘rish
git show HEAD~4 # HEAD dan to‘rt avvalgi commitni ko‘rish

Merge commitlarda bir nechta parent bo‘lishi mumkin:

Terminal
git show HEAD^1 # HEAD ning birinchi parenti (HEAD^ bilan bir xil)
git show HEAD^2 # HEAD ning ikkinchi parenti

Commitlarga o‘zingiz nom berishingiz ham mumkin:

Terminal
git tag v2.5 1b2e1d63ff

Shundan keyin 1b2e1d63ff ga v2.5 nomi bilan murojaat qilinadi. Bu nomni boshqalar bilan ulashmoqchi bo‘lsangiz (masalan, reliz versiyasini belgilash uchun), tag obyekti yaratish va ehtimol uni imzolash kerak; git-tag(1) ga qarang.

Commit talab qiladigan har qanday Git buyrug‘i ushbu nomlardan istalganini qabul qiladi:

Terminal
git diff v2.5 HEAD     # joriy HEAD ni v2.5 bilan solishtirish
git branch stable v2.5 # v2.5 asosida "stable" branchini yaratish
git reset --hard HEAD^ # branch va ishchi katalogni HEAD^ holatiga qaytarish

Ogohlantirish

Oxirgi buyruq ishchi katalogdagi o‘zgarishlarni yo‘qotishdan tashqari, shu branchdagi barcha keyingi commitlarni ham olib tashlaydi. U commitlarni saqlovchi boshqa branch bo‘lmasa, ular yo‘qoladi. Boshqa dasturchilar tortib oladigan ochiq branchda git reset ishlatmang — bu tarixni tuzatish uchun ularga keraksiz merge’larni majbur qiladi. Push qilingan o‘zgarishni bekor qilish uchun git revert ishlating.

git grep loyihangizning istalgan versiyasida matn qidiradi:

Terminal
git grep "hello" v2.5

Bu v2.5 ichidagi barcha hello uchrashuvlarini topadi. Commit nomi berilmasa, joriy katalogdagi Git kuzatayotgan fayllardan qidiradi:

Terminal
git grep "hello"

Ko‘p Git buyruqlari turli usulda ko‘rsatiladigan commitlar to‘plamini ham qabul qiladi:

Terminal
git log v2.5..v2.6            # v2.5 va v2.6 orasidagi commitlar
git log v2.5..                # v2.5 dan keyingi commitlar
git log --since="2 weeks ago" # so‘nggi ikki haftadagi commitlar
git log v2.5.. Makefile       # v2.5 dan keyin Makefile’ni o‘zgartirgan commitlar

Birinchi commit ikkinchisining ajdodi bo‘lishi shart bo‘lmagan oraliq ham berish mumkin. Masalan, stable va master umumiy commitdan ajralgan bo‘lsa:

Terminal
git log stable..master

master da bor, ammo stable da yo‘q commitlarni ko‘rsatadi. Aksincha:

Terminal
git log master..stable

stable da bor, ammo master da yo‘q commitlarni ko‘rsatadi.

git log ning zaif tomoni — commitlarni ro‘yxat ko‘rinishida berishi. Tarixdagi rivojlanish yo‘llari ajralib, keyin yana birlashganda, ularning ro‘yxatdagi tartibi mazmunli bo‘lmasligi mumkin.

Ko‘p ishtirokchili loyihalarda (Linux yadrosi yoki Git’ning o‘zi kabi) merge ko‘p bo‘ladi; gitk tarixni yaxshiroq tasvirlaydi:

Terminal
gitk --since="2 weeks ago" drivers/

Bu oxirgi ikki hafta ichida drivers katalogidagi fayllarni o‘zgartirgan commitlarni ko‘rish imkonini beradi. gitk shriftini Control tugmasini bosib turib - yoki + ni bosish orqali sozlash mumkin.

Fayl nomini qabul qiladigan buyruqlarning aksariyatida muayyan fayl versiyasini ko‘rsatish uchun uning oldidan commit yozish mumkin:

Terminal
git diff v2.5:Makefile HEAD:Makefile.in
git show v2.5:Makefile

Keyingi qadamlar#

Ushbu qo‘llanma loyihalaringizda asosiy taqsimlangan versiya nazoratini bajarish uchun yetarli bo‘lishi kerak. Git’ning imkoniyatlarini to‘liq tushunish uchun u asoslangan ikki oddiy g‘oyani bilish zarur:

  • Obyektlar ma’lumotlar bazasi — loyiha tarixi, fayllar, kataloglar va commitlarni saqlovchi puxta tizim.

  • Indeks fayli — katalog daraxti holatining keshi; commit yaratish, ishchi kataloglarni chiqarib olish va merge jarayonidagi turli daraxtlarni saqlash uchun ishlatiladi.

Qo‘llanmaning ikkinchi qismi obyektlar bazasi, indeks fayli va Git’dan samarali foydalanish uchun zarur boshqa mavzularni tushuntiradi: gittutorial-2(7).

Hozircha davom ettirmasangiz, quyidagilar ham qiziqarli bo‘lishi mumkin:

  • git-format-patch(1), git-am(1) — commitlar ketma-ketligini email patchlariga va aksincha aylantiradi; email patchlariga ko‘p tayanadigan Linux yadrosi kabi loyihalarda foydali.

  • git-bisect(1) — regressiya paydo bo‘lsa, aybdor aniq commitni tarixdan ikkilik qidiruv orqali topishga yordam beradi. Ko‘p branchli va merge’li murakkab tarixda ham deyarli optimal qidiradi.

  • gitworkflows(7) — tavsiya etilgan ish jarayonlari sharhi.

  • giteveryday(7) — taxminan 20 ta buyruq bilan kundalik Git ishlari.

  • gitcvs-migration(7) — CVS foydalanuvchilari uchun Git.

Shuningdek qarang#

gittutorial-2(7), gitcvs-migration(7), gitcore-tutorial(7), gitglossary(7), git-help(1), gitworkflows(7), giteveryday(7), The Git User’s Manual.

Git to‘plami#

git(1) buyruqlar to‘plamining bir qismi.

Izoh#

  1. The Git User’s Manual: git-htmldocs/user-manual.html
15 daqiqa 48 marta o‘qildi