Endi Git filiallari haqida bilib olaylik!

Bu boshlanuvchilar seriyasi uchun Git tushunchalarimning to'rtinchi maqolasi. Agar siz avvalgilarini o'qimagan bo'lsangiz, avval ularni o'qing:

  • №1 qism - DVCS nima: "https://itnext.io/git-concepts-for-newcomers-part-1-what-is-a-dvcs-bc873076c424"
  • №2 qism - Ishchi daraxt va sahna maydoni: "https://itnext.io/git-concepts-for-newcomers-part-2-git-repository-working-tree-and-staging-area-a2e720bf3528"
  • №3 qism - Qabul qiladi, qayd qiladi va o'zgartiradi: "https://medium.com/@dSebastien/git-concepts-for-newcomers-part-3-commits-log-and-amend-6dcbb05370c"

Ushbu postda biz Git-ning asosiy tushunchalaridan biri bo'lgan va, albatta, uni eng yaxshi versiya boshqaruv tizimlaridan biriga aylantiradigan Git filiallarini o'rganamiz!

Filiallar siz har kuni foydalanadigan asosiy tushunchalarning bir qismidir, shuning uchun ular nima ekanligini, ularni qanday boshqarishni aniq tushunish, shuningdek, ular qanday "ishlashi" haqida aniq tushunchaga ega bo'lish muhimdir.

Keling, bunga o'taylik!

Filiallar nima?

Ilmiy fantastikani yoqtiradigan har bir kishi darholfiliallar tushunchasiga oshiq bo'lishi kerak, chunki ular xuddimuqobil haqiqatlarga o'xshaydi.

Git, SVN yoki boshqa versiyalarni boshqarish tizimlari (VCS) haqida gapiramizmi, har doim standart filial yoki "boshlang'ich nuqtasi" mavjud. Men "seriyaning ikkinchi maqolasida" aytib o'tganimdek, Git uchun bu standart filial "master" deb nomlanadi (lekin agar siz #blacklivesmatter deb o'ylayotgan bo'lsangiz, nomini o'zgartirishingiz mumkin). SVN holatida bu filial odatda "magistral" deb ataladi.

Biz yangi omborni yaratganimizda, bizda faqat o'sha asosiy filial yoki kodning "asosiy qatori" mavjud. Biz “oldingi maqola”da ko‘rganimizdek, unga majburiyatlarni qo‘shishimiz, bu majburiyatlarni qayta ishlashimiz va hokazolar mumkin. Ammo bitta filialga ega bo'lish juda cheklangan. Agar siz yangi g'oyalarni sinab ko'rmoqchi bo'lsangiz-chi? Yoki biror narsa ustida ishlamasdan oldin, uni qolganlari bilan birlashtirasizmi? Filiallar bu va boshqa ko'plab holatlar uchun yechimdir.

Ba'zan daraxtlar deb ham ataladigan filiallar kodlar bazasining alohida "versiyalari" bo'lib, ular bir-biridan mustaqil ravishda rivojlanishi mumkin, lekin ular o'zgarishlarni birlashtirish va yangi voqeliklarni yaratish uchun "birlashtirilishi" ham mumkin; xuddi Slayderlar qahramonlari boshqa o'lchamga o'tib, vayronagarchilikka uchraganda (yoki muvaffaqiyatsizlikka uchramaslikka harakat qiling). Har bir filialning o'z tarixi va majburiyatlari bor.

Albatta, bu nom daraxt shoxlariga tegishli bo'lib, ular novdalar:

Haqiqiy daraxtlardan farq shundaki, versiyani boshqarish tizimidagi filiallar boshqa filiallarga "qo'shilishi" (yoki birlashtirilishi) mumkin. Xuddi "linux tarqatishlari" kabi:

Yuqoridagi misolda, Gitning rasmiy hujjatlaridan olingan va chapdan o'ngga o'qilgan, biz filiallarni qanday qilib bir nuqtada yaratish va keyinroq yana birlashtirish mumkinligini ko'rishimiz mumkin. Buni yaxshiroq tushunish uchun misolni ko'rib chiqaylik.

Birinchidan, "master" filialida uchta majburiyat yaratildi: C0, C1 va C2. Keyin, C2 kodidagi holat asosida "iss53" (yoki xohlasangiz, muqobil haqiqat) deb nomlangan filial yaratildi. O'sha iss53 filialida yangi C3 va C5 majburiyatlari yaratildi. Ko'rib turganingizdek, "iss53" filial yorlig'i oxirgi C5 majburiyatiga biriktirilgan. Men bunga qaytaman, lekin bu filialning uchi deb ataladigan narsani anglatadi.

C2 dan keyin darhol asosiy filialga qo'shilgan C4 majburiyati "iss53" filialiga umuman ta'sir qilmadi. Bu alohida haqiqatda sodir bo'lmadi.

Nihoyat, C6, “birlashtirish majburiyati” deb nomlangan maxsus majburiyat asosiy filialga qo'shildi, “iss53” filialida kiritilgan o'zgarishlarni asosiy filial bilanbirlashtirdi. C6 commit - bu asosiy filialning uchi; HEAD deb ham ataladi.

Agar bu etarli darajada aniq bo'lmasa, keling, o'xshashlikni sinab ko'raylik. Tasavvur qiling, har bir topshiriq kitobdagi sahifani ifodalaydi. Shunday qilib, siz o'zingizning omboringizni yaratasiz va yozishni boshlaysiz. Muqova sahifasi uchun C0, birinchi sahifa uchun C1 va ikkinchi sahifa uchun C2 yaratasiz. O'sha paytda siz keyingi narsa haqida ikkita fikringiz borligini tushunasiz, shuning uchun siz hikoyaning bitta versiyasi bilan C3 (3-bet) va C5 (4-bet) yaratadigan yangi filial yaratasiz. Asosiy filialda, siz C4 (3-bet) ni yaratasiz, bu hikoyaning boshqa versiyasidir. Axir, siz bu ikki hikoyani aslida birlashtirish mumkinligini va ikkita hikoyani alohida saqlashingiz shart emasligini tushunasiz. O'sha paytda siz "iss53" filialini muqobil hikoya bilan "master" filialiga birlashtirasiz.

Men hozircha "birlashish" tafsilotlariga kirmayman, lekin g'oya juda oddiy: filialda kiritilgan o'zgarishlarni boshqasiga qo'llash; jarayonda nima kerak bo'lsa, moslashtirish.

E'tibor bering, filiallarni birlashtirish shart emas; ular siz xohlagancha mavjud bo'lishi mumkin; muhim emas. Bundan tashqari, filiallar boshqa filiallarga birlashtirilgan bo'lsa ham mavjud bo'lib qoladi. Shunday qilib, siz ikkita filialni saqlab qo'yishingiz va birini boshqasiga (yoki aksincha) birlashtira olasiz, xohlaganingizcha/kerak bo'lganda ko'p marta.

Misol uchun, ilova o'rnatilgan har bir muhitga mos keladigan filiallarga ega bo'lish (masalan, DEV, ACCEPTANCE, PRODUCTION) va kerak bo'lganda ularni yangilash odatiy hol emas. Men sizga keyingi maqolada "tarmoqli modellar" deb ataladigan narsalar haqida ko'proq gapirib beraman.

Shunga qaramay, men odatda asosiy chiziqqa birlashtirilgandan keyin tashlab yuboradigan qisqa muddatli novdalarni afzal ko'raman.

Filiallarning afzalliklari

Oldingi misolda ko'rganimizdek, filiallar parallel ravishda yoki muqobil ilovalarda turli xil narsalar ustida ishlashga imkon beradi. Filiallar ajoyib, chunki ular bizga tajriba o'tkazish, asosiy chiziqdan unga ta'sir qilmasdan ajralib chiqish, izolyatsiyada ishlash va narsalarni toza saqlashga imkon beradi.

Filiallarsiz biz omborlarni takrorlashimiz kerak edi va uni boshqarib bo'lmaydi.

Filiallarning yana bir afzalligi shundaki, agar ular boshqalari birlashtirilsa, ularning tarixi qayta yozilishi mumkin, bu toza va o'qilishi mumkin bo'lgan git jurnalini saqlash uchun ajoyibdir. Tarixni git bilan qayta yozish git rebase buyrug'i yordamida amalga oshiriladi. Buni qanday qilish haqida keyingi maqolada bilib olamiz.

Va nihoyat, filiallar tonna hamkorlikdagi ish oqimlarini ta'minlaydi. Masalan, siz maxsus filialda yangi xususiyat ustida ishlashingiz va uni ko'rib chiqish uchun taklif qilishingiz mumkin. Tasdiqlangandan so'ng, siz ushbu o'zgarishlarni asosiy filialda birlashtira olasiz. Toza va oddiy!

Nima uchun git filiallari ajoyib

Endi siz filiallar haqida bilganingizdan so'ng, nima uchun Git shoxlari ko'pincha Git-ning eng zo'r xususiyati deb atalishini biroz muhokama qilishimiz mumkin.

Yuqorida aytib o'tganimdek, versiyalarni boshqarish tizimlarining aksariyati filiallarni qo'llab-quvvatlaydi. Ammo bunday tizimlarning ba'zilarida filial yaratish yoki filialdan boshqasiga o'tish sekin va murakkab bo'lishi mumkin. Masalan, SVN filiallar bilan juda sekin. Git bilan bir filialdan boshqasiga o'tish juda tez (deyarli bir lahzada). Bu Gitning filiallarni boshqarish usuli bilan bog'liq. Git bilan filiallar aniq topshiriqlar uchun belgilangan ko'rsatgichlardan boshqa "hech narsa emas"; har bir majburiyat o'zidan oldingisiga ishora qilishini bilish.

Bundan tashqari, ba'zi tizimlar bilan filiallarni birlashtirish ham qiyin bo'lishi mumkin. Shunga qaramay, Git bilan bu juda silliq (lekin birlashayotgan narsangizga qarab oddiy emas; Linux manbalarini Windows bilan birlashtirishni tasavvur qiling.. :p).

Shunday qilib, Git-dan foydalanganda shoxchalar yaratishda ikkilanmang. Bu borada SVNga o'xshamaydi.

Git yordamida siz filialdan boshqasiga o'tganingizda (buni qanday qilishni tez orada o'rganamiz), keyin sizning ishchi daraxtingiz (ya'ni fayl tizimingizdagi haqiqiy fayllar) yangi tekshirilgan tarkibga mos kelishi uchun darhol o'zgartiriladi. filiali.

Mavjud filiallar ro'yxati

OK, nazariya haqida etarli (hozircha). Keling, bir oz shoxlar bilan o'ynaymiz!

Mavjud filiallarni ro'yxatga olish oson. Buni git branch buyruq yordamida amalga oshirishingiz mumkin: https://git-scm.com/docs/git-branch

Davom eting va quyidagilarni sinab ko'ring:

  • Yangi katalog yarating va unga o'ting: mkdir gitbranches && cd gitbranches (yoki agar siz "Bash taxalluslari haqidagi mening maqolam" ni kuzatgan bo'lsangiz, "mkcd" dan foydalaning: p)
  • Unda yangi Git omborini ishga tushiring: git init
  • Mavjud filiallarni sanab o'ting: git branch

Shu nuqtada, siz meni yolg'onchi deb o'ylaysiz, chunki hozirda "master" filiali yo'q. Ammo davom eting:

  • Matn faylini yarating: touch cover.txt
  • Faylni sahnalashtirish maydoniga qo'shing: git add --all (yoki git add -A yoki git add . )
  • Qabul qiling: git commit -m 'C0: book cover'
  • Endi mavjud filiallarni yana sanab o'ting: git branch

Ushbu nuqtada siz buni ko'rishingiz kerak:

$ git branch
* master

Shunday qilib, yo'q, men yolg'on gapirmadim, lekin asosiy filial omborga kamida bitta majburiyat qo'shilgandan keyingina "mavjud" bo'ladi.

E'tibor bering, ushbu buyruq yordamida boshqa omborlarning filiallarini ro'yxatga olish va boshqa ajoyib narsalarni qilish mumkin, ammo bu yanada rivojlangan (va tez-tez ishlatilmaydi).

Filial yaratish

Filial yaratish git branch <name> buyrug'i yoki git checkout -B <name> yordamida ham amalga oshirilishi mumkin. Men asosan ikkinchi buyruqni ishlataman, chunki u yaratgandan keyin o'sha filialga o'tadi, bu odatda foydaliroq.

Keling, sinab ko'raylik. Avvalo, oldingi misolimizga mos keladigan bir nechta qo'shimcha majburiyatlarni yarating:

touch p1.txt && git add . && git commit -m 'C1: Page 1'
touch p2.txt && git add . && git commit -m 'C2: Page 2'

Buni amalga oshirgandan so'ng, omborning jurnali quyidagicha ko'rinishi kerak:

$ git log --oneline
f10ff21 (HEAD -> refs/heads/master) C2: Page 2
4426512 C1: Page 1
7dda3ce C0: Cover

Keling, yangi "iss53" filialini yarataylik (yoki nima bo'lishidan qat'iy nazar: p):

$ git branch iss53
Branch 'iss53' set up to track local branch 'master'.

Agar siz hozir mavjud bo'limlarni sanab o'tsangiz, bizning yangi filialimiz yaratilganligini ko'rasiz:

$ git branch
  iss53
* master

Keyingi bo'limlarda filiallar o'rtasida qanday o'tishni ko'rib chiqamiz.

Filialni kuzatish

Bizning yangi "iss53" filialimiz "master" filialini kuzatib borishini tushunish muhimdir.

Ayni paytda, buni e'tiborsiz qoldirish "muammoli" emas, lekin siz o'zgarishlarni (biz hali ham kashf qilishimiz kerak bo'lgan narsani) surish/tortishishni xohlashingiz bilanoq, bu "kuzatish" tushunchasi asosiy bo'lib qoladi.

Agar filial boshqasini kuzatish uchun sozlangan bo'lsa (bir xil omborda yoki uzoqda bo'ladimi), u holda bu filial git pull, git push, git status va boshqalar kabi operatsiyalar uchun standart manba/maqsad hisoblanadi.

Filialni kuzatishni git branch buyrug'i orqali ham sozlash mumkin, ammo biz buni keyinroq ko'rib chiqamiz.

Filiallar o'rtasida almashinish

Filialdan boshqasiga o'tish uchun siz git checkout buyrug'idan foydalanishingiz mumkin.

Davom eting va "iss53" filialiga o'ting:

git checkout iss53

Tasdiqlash uchun git status chiqishiga qarang:

$ git status
On branch iss53
Your branch is up to date with 'master'.
nothing to commit, working tree clean

Ko'rib turganingizdek, biz haqiqatan ham "iss53" filialidamiz.

Bundan tashqari, agar siz jurnalni tekshirsangiz, ushbu filial haqiqatan ham "master" filiali bilan bir xil tarixga ega ekanligini ko'rasiz (hech bo'lmaganda hozircha):

git log
commit f10ff21189d6ed2ca5548163b55a9e7a3d11d692 (HEAD -> refs/heads/iss53, refs/heads/master)
Author: Seb <[email protected]>
Date:   Tue Jul 28 16:05:12 2020 +0200
C2: Page 2
commit 44265122220956cfc5603d4ed8c503d213d01e4f
Author: Seb <[email protected]>
Date:   Tue Jul 28 16:03:12 2020 +0200
C1: Page 1
commit 7dda3ce83e536f21429e49f1e148f4acdc3a4c45
Author: Seb <[email protected]>
Date:   Tue Jul 28 15:48:29 2020 +0200
C0: Cover

E'tibor bering, filiallar o'rtasida almashish ba'zan mumkin emas. Bu sizning ishchi katalogingiz toza bo'lmaganda sodir bo'ladi. Keyinchalik ketma-ketlikda biz Git-ning "stash" xususiyati haqida gaplashamiz, siz ushbu muammoni hal qilish uchun foydalanishingiz mumkin.

HEAD va filial uchi

Qaysi filial hozirda tekshirilayotganligini kuzatish uchun git ma'lumotni "HEAD" deb nomlangan faylda saqlaydi va uni omborning ".git" papkasida saqlaydi.

Endi siz "iss53" bo'limiga o'tganingizdan so'ng, davom eting va HEAD faylini ko'rib chiqing:

$ cat ./.git/HEAD
ref: refs/heads/iss53

Ko'rib turganingizdek, fayl shunchaki filialga havolani o'z ichiga oladi. HEAD nima ekanligini "StackOverflow'da" ko'proq bilib olishingiz mumkin.

Qizig'i shundaki, HEAD fayli to'g'ridan-to'g'ri ishora qiluvchi ma'lumot .git/heads papkasida saqlanadi, unda har bir filialda bitta fayl mavjud:

$ ls ./.git/refs/heads
total 16K
drwxrwxr-x 2 sebastien sebastien 4,0K jui 28 16:07 .
drwxrwxr-x 4 sebastien sebastien 4,0K jui 28 15:45 ..
-rw-rw-r-- 1 sebastien sebastien   41 jui 28 16:07 iss53
-rw-rw-r-- 1 sebastien sebastien   41 jui 28 16:05 master

Keling, "iss53" faylini ko'rib chiqaylik:

$ cat ./.git/refs/heads/iss53
f10ff21189d6ed2ca5548163b55a9e7a3d11d692

Voy, bu nima? Xo'sh, bu "iss53" filialidagi oxirgi majburiyatning (to'liq) xeshi:

$ git log --oneline -n 1
f10ff21 (HEAD -> refs/heads/iss53, refs/heads/master) C2: Page 2

Bu mantiqiy bo'la boshlaydimi?

Shunday qilib, umumlashtirish uchun:

  • HEAD hozir tekshirilayotgan filialning bosh ma'lumotnoma fayliga ishora qiladi
  • Filialning bosh ma'lumotnoma fayli ushbu filialdagi oxirgi majburiyatni ko'rsatadi
  • Har bir majburiyat o'zidan oldingi (ya'ni, ota-ona)ga ishora qiladi.

Endi siz git log buyrug'i qanday ishlashini aniqroq tushunishingiz mumkin; u "shunchaki" BOSHQARMCHdan tarixdagi birinchi majburiyatgacha bo'lgan havolalarni kuzatib boradi.

Aytgancha, agar siz ombor tarixiga yana nazar tashlasangiz, "master" va "iss53" hozirda bir xil majburiyatni ko'rsatayotganini ko'rasiz:

$ git log --oneline
f10ff21 (HEAD -> refs/heads/master, refs/heads/iss53) C2: Page 2
4426512 C1: Page 1
7dda3ce C0: Cover

Endi (HEAD -> refs/heads/master, refs/heads/iss53) qismi siz uchun yanada ma'noli bo'lishi kerak!

Keyinchalik ketma-ketlikda HEAD va filiallar bo'yicha maslahatlar haqidagi bu bilimlar yanada foydali bo'ladi; ayniqsa tarixni qayta yozish operatsiyalari uchun.

Yon eslatma: Agar majburiyat yaratganingizda, Git unga metadata biriktiradi. Ushbu metama'lumotlarning bir qismi siz haqingizda, majburiyat muallifi (va bu Git konfiguratsiyasiga bog'liq), yana biri siz o'rnatgan xabar, yana biri boshqa majburiyatlarga 0-n havolalar. Repozitariydagi birinchi topshiriqning ota-onasi yo'q; Oddiy topshiriqlar bitta va birlashma deb ataladigan majburiyatlar 2-n havolaga ega. Tez orada filiallarni qanday qilib bir-biriga birlashtirishni bilib olamiz.

Mahalliy filialni o'chirish

Albatta, biz filiallarni ham o'chirib tashlashimiz mumkin. Bittasini o'chirish uchun quyidagi buyruqni ishlatish kifoya:

git branch -d <name>

E'tibor bering, bu o'chirishning xavfsiz versiyasidir; Agar birlashtirilmagan o'zgarishlar mavjud bo'lsa, o'chirishni oldini oladi (ya'ni, filialni o'chirish orqali siz yo'qotadigan o'zgarishlar).

Agar siz haqiqatan ham nima qilayotganingizni bilsangiz, o'chirishni ham majburlashingiz mumkin:

git branch -D <name>

Yuqorida aytilganlar, siz filialning haqiqatan ham ketishi mumkinligini bilsangiz foydali bo'ladi (masalan, u boshqa joyga qo'shilgandan keyin yoki g'oyadan voz kechgan bo'lsangiz).

Mahalliy filial nomini o'zgartirish

Va nihoyat, siz quyidagi buyruq yordamida hozirda tekshirilayotgan filial nomini o'zgartirishingiz mumkin:

git branch -m <name>

Xulosa

Ushbu maqolada men sizni filiallar bilan tanishtirdim. Birgalikda biz ular nima ekanligini, nima uchun ajoyib ekanligini va nima uchun Git shoxlari ayniqsa ajoyib ekanligini ko'rdik.

Keyin biz filiallarni qanday yaratishni, ular o'rtasida qanday almashishni, shuningdek ularni qanday nomlash va o'chirishni bilib oldik.

Yo'l davomida men HEAD git kontseptsiyasini tushuntirdim, bu keyinchalik foydali bo'ladi, shuningdek, ma'lumotnoma, filial uchi va majburiyatlar o'rtasidagi zanjir tushunchalari.

Ushbu bilim yangi boshlanuvchilar uchun ham, ilg'or Git foydalanuvchilari uchun ham juda foydali, shuning uchun u haqida o'rganishga arziydi. Shuni yodda tutingki, filiallar haqida o'rganish uchun ko'proq narsa bor, ammo bunga kirishdan oldin biz masofaviy omborlar bilan qanday ishlashni o'rganishimiz kerak!

Seriyaning keyingi maqolasida biz filiallarni qanday birlashtirishni ko'rib chiqamiz.

Bugun uchun shunday!

Ushbu maqola yoqdimi? Koʻproq koʻrish va boshqalar ham koʻrishini taʼminlash uchun quyidagi “Like” tugmasini bosing!

PS: Agar siz dasturiy ta'minot/veb-ishlab chiqish, TypeScript, Angular, React, Vue, Kotlin, Java, Docker/Kubernetes va boshqa ajoyib mavzular haqida ko'plab qiziqarli narsalarni o'rganishni istasangiz, ikkilanmasdan "mening nusxamni oling" kitob» va Mening axborotnomamga obuna bo'ling!