Maqolalar 13 daqiqa 39 ko‘rish
Kundalik Git: yigirmata buyruq bilan ishlash
Git'ning kundalik ishga yetadigan minimal buyruqlar to‘plami, to‘rt rol bo‘yicha ajratilgan: yolg‘iz ishlaydigan dasturchi, jamoa ishtirokchisi, integrator va repozitoriy ma’muri. Har rol uchun real misol va buyruqlar izohi.
Mundarija
Git'da yuzlab buyruq bor, lekin kundalik ishda yigirmatasi yetadi. Bu bo‘lim ularni to‘rt rolga ajratib beradi: yolg‘iz ishlayapsizmi, jamoada ishtirok etayapsizmi, boshqalarning ishini birlashtirayapsizmi yoki serverni yuritayapsizmi. O‘zingizga mos bo‘limni o‘qib, qolganini keyinga qoldirsangiz ham bo‘ladi.
Bu ma’lumotnoma, dars emas
Bu qism Git'ning rasmiy qo‘llanmasi (git help everyday, 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.
Kundalik Git uchun taxminan 20 ta foydali buyruq. Buyruq misollari asl holida saqlangan.
Nomi#
giteveryday — Git’dan kundalik foydalanish uchun foydali minimal buyruqlar to‘plami.
Qisqacha mazmuni#
Everyday Git With 20 Commands Or So — taxminan 20 ta buyruq bilan kundalik Git.
Tavsif#
Kundalik foydali Git buyruqlarini tushuntirish uchun foydalanuvchilar to‘rt guruhga ajratiladi:
-
Individual Developer (Standalone) — yolg‘iz ishlasa ham commit yaratuvchi har bir dasturchiga zarur buyruqlar.
-
Individual Developer (Participant) — boshqa odamlar bilan birga ishlaydigan dasturchiga qo‘shimcha zarur buyruqlar.
-
Integrator — boshqalarning ishini ko‘rib chiqib, birlashtiradigan odam uchun qo‘shimcha buyruqlar.
-
Repository Administration — Git repozitoriylarini yaratib, xizmat ko‘rsatuvchi tizim administratorlari uchun buyruqlar.
Mustaqil dasturchi#
Mustaqil dasturchi boshqalar bilan patch almashmaydi va bitta repozitoriyda yolg‘iz ishlaydi.
Asosiy buyruqlar#
git init— yangi repozitoriy yaratish.git log— tarixda nima bo‘lganini ko‘rish.git switch,git branch— branchlar yaratish va almashtirish.git add— indeks (staging area) ni boshqarish.git diff,git status— joriy ish holatini ko‘rish.git commit— joriy branch tarixini oldinga siljitish.git restore— o‘zgarishlarni bekor qilish.git merge— mahalliy branchlarni birlashtirish.git rebase— mavzuli branchlarni yuritish.git tag— tarixdagi ma’lum nuqtani belgilash.
Misol: tar arxividan yangi repozitoriy yaratish#
tar zxf frotz.tar.gz
cd frotz
git init
git add .
git commit -m "import of frotz source tree."
git tag v2.43
git add . joriy katalog ostidagi hamma narsani indeksga qo‘shadi. git tag v2.43 yengil, izohsiz teg yaratadi.
Misol: topic branch yaratib, unda ishlash#
git switch -c alsa-audio
# tahrirlang, kompilyatsiya qiling, sinab ko‘ring
git restore curses/ux_audio_oss.c
git add curses/ux_audio_alsa.c
# tahrirlang, kompilyatsiya qiling, sinab ko‘ring
git diff HEAD
git commit -a -s
# tahrirlang, kompilyatsiya qiling, sinab ko‘ring
git diff HEAD^
git commit -a --amend
git switch master
git merge alsa-audio
git log --since='3 days ago'
git log v2.43.. curses/
Buyruqlar izohi:
switch -cyangialsa-audiomavzuli branchini yaratib, unga o‘tadi.restoremuvaffaqiyatsiz o‘zgarishlarnicurses/ux_audio_oss.cdan qaytaradi.- Yangi faylni Git’ga
addbilan ochiq bildirish kerak. Keyingicommit -akuzatilayotgan fayllarning o‘zgarishi va o‘chirilishini aniqlaydi, ammo yangi faylni aniqlamaydi. diff HEADcommit qilinadigan o‘zgarishlarni ko‘rsatadi.commit -a -ssinovdan o‘tgan barcha kuzatilayotgan o‘zgarishlarni sign-off bilan commit qiladi.diff HEAD^oldingi commitni ham qo‘shgan holda barcha o‘zgarishlarni ko‘rsatadi.commit --amendyangi o‘zgarishlarni avvalgi commitga, uning asl xabarini saqlagan holda qo‘shadi.masterbranchiga qaytiladi.- Topic branch
masterga birlashtiriladi. - Oxirgi uch kundagi commitlar ko‘riladi.
-10,--until=2005-12-10kabi cheklovlarni birga ishlatish mumkin. v2.43dan beri faqatcurses/ichiga ta’sir qilgan o‘zgarishlar ko‘riladi.
Jamoa ishtirokchisi#
Jamoaviy loyihada qatnashuvchi dasturchi mustaqil dasturchi buyruqlariga qo‘shimcha ravishda boshqalar bilan aloqa qilishni bilishi kerak.
Qo‘shimcha buyruqlar#
git clone— upstream repozitoriysidan mahalliy repozitoriy yaratish.git pull,git fetch—origindan yangiliklarni olish.git push— umumiy repozitoriyga o‘zgarish yuborish.git format-patch— email orqali yuboriladigan patchlarni tayyorlash.git send-email— email dasturi patchni buzmasdan uni jo‘natish.git request-pull— upstream tortib olishi uchun o‘zgarishlar xulosasini yaratish.
Misol: upstream’ni klonlash va unga o‘zgarish yuborish#
git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
cd my2.6
git switch -c mine master
# tahrirlang, kompilyatsiya qiling, sinab ko‘ring
git commit -a -s
git format-patch master
git send-email --to="person <email@example.com>" 00*.patch
git switch master
git pull
git log -p ORIG_HEAD.. arch/i386 include/asm-i386
git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git
git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL
git reset --hard ORIG_HEAD
git gc
Buyruqlar izohi:
masterasosidaminebranchi yaratiladi.- Tahrirlash, kompilyatsiya, test va sign-off’li commit zaruricha takrorlanadi.
masterga nisbatan topic branch patchlari chiqariladi.- Patchlar email orqali yuboriladi.
- Yangiliklarni ko‘rish uchun
masterga qaytiladi. - Oddiy
pullstandart holatdaorigindan oladi va joriy branchga merge qiladi. - Pull’dan so‘ng faqat qiziqtirgan kataloglardagi upstream o‘zgarishlari tekshiriladi.
- Tashqi repozitoriydagi branch nomlari ko‘riladi.
- Muayyan repozitoriyning
ALLbranchi olinib, merge qilinadi. reset --hard ORIG_HEADoxirgi pull’ni bekor qiladi. Bu commit qilinmagan o‘zgarishlarni ham yo‘qotishi mumkin.gcbekor qilingan pull’dan qolgan erishib bo‘lmaydigan obyektlarni keyinchalik tozalash va repozitoriyni optimallashtirishga yordam beradi.
Misol: boshqa repozitoriyga push qilish#
# satellite mashinasida
git clone mothership:frotz frotz
cd frotz
git config --get-regexp '^(remote|branch)\.'
remote.origin.url mothership:frotz
remote.origin.fetch refs/heads/*:refs/remotes/origin/*
branch.master.remote origin
branch.master.merge refs/heads/master
git config remote.origin.push \
+refs/heads/*:refs/remotes/satellite/*
# tahrirlang, sinang, commit qiling
git push origin
# mothership mashinasida
cd frotz
git switch master
git merge satellite/master
Bu misolda:
mothershipkompyuteridagifrotzrepozitoriysisatellitega klonlanadi.cloneremote.origin.*vabranch.master.*konfiguratsiyasini avtomatik yaratadi.- Push barcha mahalliy branchlarni mothership’dagi
refs/remotes/satellite/*kuzatuv branchlariga joylash uchun sozlanadi. satellitedagi ish push qilinadi. Bu bir tomonlama ulanishda zaxira nusxa usuli sifatida ham ishlashi mumkin.mothershipdasatellite/masterjoriymasterga merge qilinadi.
Ref spetsifikatsiyasidagi bosh
+non-fast-forward yangilanishiga ruxsat beradi. Uni faqat tarixni majburan almashtirish oqibatini tushunsangiz ishlating.
Misol: ma’lum tegdan branch ajratish#
git switch -c private2.6.14 v2.6.14
# tahrirlang, kompilyatsiya qiling, sinab ko‘ring
git commit -a
git switch master
git cherry-pick v2.6.14..private2.6.14
private2.6.14 taniqli, ammo biroz eski v2.6.14 tegi asosida yaratiladi. cherry-pick uning barcha o‘zgarishlarini formal merge commitsiz master ga ko‘chiradi.
Uzunroq muqobil usul:
git format-patch -k -m --stdout v2.6.14..private2.6.14 | git am -3 -k
Ishtirokchi git request-pull yoki GitHub’dagi pull request kabi mexanizmlar orqali upstream’ga hissasi haqida xabar berishi ham mumkin.
Integrator#
Integrator jamoada boshqalar qilgan o‘zgarishlarni qabul qiladi, tekshiradi, birlashtiradi va natijani e’lon qiladi. Subsystem rahbari ko‘pincha ham ishtirokchi, ham integrator rolini bajaradi.
Qo‘shimcha buyruqlar#
git am— contributorlar email orqali yuborgan patchlarni qo‘llash.git pull— ishonchli maintainer branchlarini birlashtirish.git format-patch— contributorga muqobil yechim taklifini tayyorlash.git revert— noto‘g‘ri commitni yangi commit bilan xavfsiz bekor qilish.git push— eng yangi natijani e’lon qilish.
Integratorning odatiy Git kuni#
git status
git branch --no-merged master
mailx
& s 2 3 4 5 ./+to-apply
& s 7 8 ./+hold-linus
& q
git switch -c topic/one master
git am -3 -i -s ./+to-apply
compile/test
git switch -c hold/linus && git am -3 -i -s ./+hold-linus
git switch topic/one && git rebase master
git switch -C seen next
git merge topic/one topic/two && git merge hold/linus
git switch maint
git cherry-pick master~4
compile/test
git tag -s -m "GIT 0.99.9x" v0.99.9x
git fetch ko && for branch in master maint next seen
do
git show-branch ko/$branch $branch
done
git push --follow-tags ko
Jarayon izohi:
statustugallanmagan ish bor-yo‘qligini ko‘rsatadi.branch --no-merged masterhalimasterga qo‘shilmagan branchlarni ko‘rsatadi. Xuddi shu usulmaint,next,seenuchun ishlaydi.- Email patchlari qo‘llanadigan va hali tayyor bo‘lmagan guruhlarga ajratiladi.
am -3 -i -spatchlarni uch tomonlama fallback, interaktiv tasdiq va sign-off bilan qo‘llaydi.- Zarur topic branch yaratilib, boshqa patchlar ham qo‘llanadi.
- Hali umumiy tarixga chiqarilmagan ichki topic branch
masterustiga rebase qilinadi. seenbranchi har safarnextdan qayta boshlanadi.- Hali tayyorlanayotgan topic branchlar sinov uchun birlashtiriladi.
- Muhim tuzatish eski qo‘llab-quvvatlash branchiga backport qilinadi.
- Imzolangan reliz tegi yaratiladi.
kodagi public branchlar olinadi.- Mahalliy public branchlar tasodifan ilgari e’lon qilingan tarixdan orqaga qaytmagani tekshiriladi.
- Yangi tarix va unga ishora qiluvchi teglar push qilinadi.
Misoldagi ko Git maintainer repozitoriysiga qisqa nomdir:
[remote "ko"]
url = kernel.org:/pub/scm/git/git.git
fetch = refs/heads/*:refs/remotes/ko/*
push = refs/heads/master
push = refs/heads/next
push = +refs/heads/seen
push = refs/heads/maint
seen tajribaviy branch bo‘lgani uchun uning push refspec’i + bilan non-fast-forward yangilanishiga ruxsat beradi.
Repozitoriy ma’muriyati#
Repozitoriy administratori dasturchilarning kirishini yaratadi va xizmatlarni yuritadi.
Server vositalari#
git daemon— repozitoriydan anonim yuklab olishga ruxsat berish.git shell— umumiy markaziy repozitoriy foydalanuvchilari uchun cheklangan login shell.git http-backend— fetch va push’ni qo‘llovchi server tomonidagi Smart HTTP.gitweb— Git repozitoriylari uchun veb-interfeys;git instawebbilan tez ishga tushirish mumkin.
Bundan tashqari Gitolite, Gerrit Code Review va cgit kabi keng tarqalgan hosting, ko‘rish va review yechimlari mavjud.
Misol: inetd orqali git daemon#
/etc/services da:
git 9418/tcp # Git Version Control System
/etc/inetd.conf da (amalda bitta satrda yoziladi):
git stream tcp nowait nobody \
/usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
Misol: xinetd orqali git daemon#
service git
{
disable = no
type = UNLISTED
port = 9418
socket_type = stream
wait = no
user = nobody
server = /usr/bin/git-daemon
server_args = --inetd --export-all --base-path=/pub/scm
log_on_failure += USERID
}
Bu Fedora misoli; boshqa tizimlarda xinetd(8) sozlamasi farq qilishi mumkin.
Misol: git-shell orqali faqat push/pull ruxsati#
alice:x:1000:1000::/home/alice:/usr/bin/git-shell
bob:x:1001:1001::/home/bob:/usr/bin/git-shell
cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
david:x:1003:1003::/home/david:/usr/bin/git-shell
/etc/shells da:
/usr/bin/git-shell
git-shell odatiy shell buyruqlarini cheklab, Git push/pull xizmatlariga ruxsat beradi. Foydalanuvchilar mashinaga SSH orqali kira olishi kerak. Ko‘p distributivlarda login shell /etc/shells ichida ro‘yxatlangan bo‘lishi shart.
Misol: CVS uslubidagi umumiy repozitoriy#
git:x:9418:alice,bob,cindy,david
Dasturchilar bir xil git guruhiga qo‘shiladi va shared repozitoriy guruh uchun yoziladigan qilinadi. update hook orqali branch siyosati belgilanadi. Masalan:
refs/heads/master alice\|cindy
refs/heads/doc-update bob
refs/tags/v[0-9]* david
Bu siyosatda:
masterga Alice va Cindy push qila oladi;doc-updatega faqat Bob push qila oladi;- versiya teglarini faqat reliz menejeri David yarata oladi.
Zamonaviy boshlang‘ich shared repozitoriy yaratish buyrug‘i:
git init --bare --shared /home/devo.git
Git to‘plami#
git(1) buyruqlar to‘plamining bir qismi.
Izoh#
- Update hook namunasi:
git-htmldocs/howto/update-hook-example.html