Ачааллж байна...
Бүлэг 2-т бид Git-ийн өдөр тутмын мөчлөгийг бүрэн эзэмшсэн: цомог нээх, зураг авах, түүх унших, хог нуух, алдаагаа буцаах. Одоогоор таны цомог нэг шулуун шугам шиг: зураг бүр өмнөхийнхөө ард дараалан жагссан. Энэ Бүлэгт бид Git-ийн хамгийн хүчтэй, хамгийн нэр хүндтэй санаа руу шилжинэ. Энэ санааг branch гэдэг бөгөөд монголоор салбар, салаа гэж орчуулж болно. Branch нь таны цомгийг нэг шугамаас олон зэрэгцээ замтай болгож, туршилт хийх эрх чөлөөг цоо шинэ түвшинд гаргадаг.
Энэ хичээлд Бүлэг 1-ийн 2 дугаар хичээлийн нэгэн адил ганц ч command бичихгүй. Branch-ийн command-ууд өөрсдөө маш энгийн, хоёр гурван үгтэй. Гэхдээ branch-ийн цаадах санааг ойлгоогүй үед тэдгээр нь файлуудыг гэнэт алга болгож, дахин гаргаж ирэх ид шид мэт санагддаг. Тиймээс өнөөдөр бид зөвхөн ойлголтод төвлөрнө: branch гэж юу вэ, яагаад хэрэгтэй вэ, main салааг яагаад онцгойлон хамгаалдаг вэ. Дараагийн хичээлд command-ууд энэ ойлголтын байгалийн үргэлжлэл болно.
Олон кино, номонд нэгэн сонирхолтой санаа гардаг: тодорхой нэг мөчид ертөнц хоёр хуваагдаж, хоёр зэрэгцээ түүх эхэлдэг. Нэг ертөнцөд баатар галт тэргэнд сууж амжсан, нөгөөд нь амжаагүй. Хоёр ертөнц нэг ижил өнгөрсөнтэй боловч тэр мөчөөс хойш тус тусдаа хөгждөг. Нэг ертөнцөд юу ч болсон нөгөө ертөнцөд нөлөөлөхгүй. Кинонд баатар хоёр ертөнцийн аль нэгийг сонгох боломжгүй байдаг. Харин Git-ийн branch танд яг тэр боломжийг олгодог.
Таны зарлагын программыг төсөөлөөрэй. Программ сайн ажиллаж байгаа бөгөөд та ангиллаар шүүх шинэ боломж нэмэх санаатай болжээ. Энэ ажил хэдэн өдөр үргэлжилж магадгүй, мөн санаа тань амжилттай болно гэсэн баталгаа ч алга. Branch ашиглавал та энэ мөчид ертөнцийг хоёр хуваана. Нэг ертөнцөд, үндсэн ертөнцөд, программ яг одоогийнх шигээ, ажилладаг хэвээрээ үлдэнэ. Нөгөө ертөнцөд та шүүлтүүрээ чөлөөтэй бүтээж, эвдэж, дахин засна. Хэрвээ туршилт амжилттай болбол хоёр ертөнцийг нэгтгэж, шинэ боломж үндсэн ертөнцөд орно. Харин амжилтгүй болбол туршилтын ертөнцийг зүгээр л орхино. Үндсэн ертөнц юу ч мэдээгүй мэт хэвээрээ байна.
Энэ зүйрлэлийг өөр нэг дүрслэлээр бататгая: салаа зам. Та шулуун замаар явж байтал зам хоёр салаалсан газар ирлээ. Нэг салаа нь таны мэдэх, найдвартай гол зам. Нөгөө салаа нь шинэ, урьд нь явж үзээгүй зам. Branch бол тэр шинэ салааг сонгож, гол замаа орхилгүйгээр судлах арга юм. Шинэ зам тань сайхан газар хүргэвэл түүнийг гол замтай холбоно. Мухардвал буцаж ирнэ. Гол зам хаашаа ч явахгүй, таныг хүлээсээр байна.
Одоо зүйрлэлээс Git-ийн жинхэнэ дүр төрх рүү шилжье. Бүлэг 2-ын төгсгөлд таны git-dadlaga цомог зургаан зурагтай байсан. Тэдгээрийг шугамаар зурвал ийм харагдана (зүүнээс баруун тийш хуучнаас шинэ рүү):
3f2a9c1 --- 8b41d07 --- c7e0a52 --- e41b9d6 --- 5d8c3e7 --- 9e3b5a1
^
mainЗураг бүр өмнөхтэйгөө холбогдсон бөгөөд энэ холбоос нь "энэ зураг тэр зургаас үргэлжилсэн" гэсэн утгатай. Хамгийн баруун талын зураг дээр main гэсэн тэмдэг байна. 2.3 дугаар хичээлээс санаж байгаачлан main бол хавчуурга, тухайн салааны хамгийн сүүлийн зургийг заадаг тэмдэг юм.
Одоо ангиллын шүүлтүүр дээр ажиллахаар шинэ branch үүсгэж, түүн дээр хоёр зураг авсан гэж төсөөлье. Цомог дараах байдалтай болно:
... --- 5d8c3e7 --- 9e3b5a1
^ \
main \
a1b2c3d --- f4e5d6c
^
category-filterЦомогт одоо хоёр зам бий. main хавчуурга хуучин байрандаа, 9e3b5a1 зураг дээр үлдсэн. Шинэ category-filter хавчуурга 9e3b5a1-ээс салаалсан замын төгсгөл дэх f4e5d6c зургийг зааж байна. Хоёр салаа нэг ижил өнгөрсөнтэй: 9e3b5a1 хүртэлх бүх зураг тэдгээрийн нийтлэг түүх. Тэр цэгээс хойш тэд тус тусын замаар явсан. main салаан дээр байх үед таны фолдер 9e3b5a1 дээрх байдалтай, шүүлтүүрийн тухай юу ч мэдэхгүй. category-filter салаан дээр байх үед фолдерт шүүлтүүрийн бүх ажил харагдана.
Энд Git-ийн хамгийн ухаалаг шийдлүүдийн нэг нуугдаж байна. Олон хүн branch үүсгэхэд Git бүх файлыг шинэ газар хуулдаг гэж боддог. Тийм биш. Branch бол зүгээр л нэг хавчуурга, нэг зургийг заасан нэр юм. Шинэ branch үүсгэх нь цомогт шинэ хавчуурга хавчихтай адил: файл хуулахгүй, зай эзлэхгүй, нэг агшинд хийгдэнэ. Тиймээс Git-д branch үүсгэх нь маш хямд үйлдэл бөгөөд хөгжүүлэгчид жижиг ажил бүрт ч шинэ branch үүсгэж, ажлаа дуусгаад устгадаг.
Шинэ салаан дээр commit хийх бүрт тэр салааны хавчуурга шинэ зураг руу автоматаар шилждэг. Бусад хавчуурга байрандаа үлддэг. Ийм учраас дээрх дүрслэлд main хөдлөөгүй, category-filter урагшилсан. Хоёр салаа хоорондоо огт хамааралгүйгээр урагшилж болно: main дээр нэг засвар хийвэл main урагшилна, category-filter байрандаа үлдэнэ.
Мөн 2.3 дугаар хичээлд HEAD-ийн тухай ярьсныг санацгаая. HEAD бол "та одоо энд байна" гэсэн тэмдэг юм. Хэд хэдэн хавчуурга байх үед HEAD нь та яг алийг нь дагаж байгааг заадаг. “HEAD -> main” нь "та main салаан дээр байна, шинэ commit main-ийг урагшлуулна" гэсэн утгатай. Хэрвээ та category-filter руу шилжвэл HEAD тийшээ шилжиж, “HEAD -> category-filter” болно. Branch-ийн хооронд шилжих гэдэг нь HEAD-ийг нэг хавчуургаас нөгөө рүү зөөх, Git таны фолдерыг тэр хавчуургын зураг дээрх байдалд оруулах явдал юм.
Олон branch-тэй болоход тэдгээрийг хэрхэн төсөөлөх вэ? Цомгийнхоо хажууд жижиг тавиур байгаа гэж бодоорой. Тавиур дээр хавчуурга бүр нэрийн шошготой эгнэнэ: main, category-filter, fix-empty-total гэх мэт. Тэдгээрийн нэг нь гэрэлтэй, тэр бол таны одоо дагаж буй хавчуурга. Дараагийн хичээлд Git-ээс энэ тавиурыг харуулахыг хүсэхэд жагсаалт яг ийм харагдана: салаа бүр нэг мөрөнд, одоогийнх нь урд нь од тэмдэгтэй.
Энэ тавиурын зураглал нь хоёр зүйлийг тодорхой болгодог. Нэгдүгээрт, та нэг агшинд зөвхөн нэг салаан дээр байна. Хоёр салааг нэгэн зэрэг нээх боломжгүй, учир нь таны фолдер нэг л байна. Хоёрдугаарт, салааны хооронд шилжих нь хурдан, хөнгөн үйлдэл. Тавиураас өөр хавчуурга сонгоход Git фолдерын файлуудыг хэдхэн хормын дотор тэр зураг дээрх байдалд оруулна. Энэ шилжилтийн үед таны commit хийгээгүй өөрчлөлтүүд юу болдог вэ гэдэг чухал асуулт бий бөгөөд түүнийг дараагийн хичээлд тусгайлан ярина.
Git-ийн хувьд main бусад салаанаас ялгаагүй, зүгээр л нэг хавчуурга. Түүнийг онцгой болгодог нь техникийн дүрэм биш, хөгжүүлэгчдийн дунд тогтсон заншил юм. Тэр заншил нь: main салаа үргэлж ажилладаг байх ёстой. Хэн ч, хэзээ ч таны төслийг main салаанаас нь авбал ажиллах ёстой. Хагас бичсэн функц, туршилтын код, эвдэрсэн тест main-д ордоггүй. Тэд өөр салаан дээр бүрэн бэлэн болтлоо амьдардаг бөгөөд зөвхөн бэлэн болсны дараа main-д нэгтгэгддэг.
Энэ заншил яагаад тийм чухал болохыг гурван бодит нөхцөлөөр харъя. Эхнийх нь яаралтай засвар. Та ангиллын шүүлтүүр дээр гурав дахь өдрөө ажиллаж байтал хэн нэгэн "программ хоосон жагсаалт дээр уначихлаа" гэж мэдэгдлээ. Хэрвээ та main дээр шууд ажиллаж байсан бол хагас бичигдсэн шүүлтүүр таны кодонд холилдсон байх тул энэ алдааг тусад нь засах хэцүү. Харин шүүлтүүр өөрийн салаан дээр байгаа бол та main руу шилжиж, цэвэр, ажилладаг код дээр алдааг засаж, дараа нь шүүлтүүр рүүгээ буцаж ирнэ. Хоёр ажил бие биедээ саад болохгүй.
Хоёр дахь нь бүтэлгүй туршилт. Та программаа JSON-оос өгөгдлийн сан руу шилжүүлж үзэх санаатай болжээ гэж бодъё. Хоёр өдөр ажилласны дараа энэ санаа одоохондоо хэтэрхий төвөгтэй гэдгийг ойлголоо. Branch дээр хийсэн бол та зүгээр л main руугаа буцна, туршилтын салааг устгах эсвэл хожим эргэж харахаар үлдээж болно. main-д туршилтын ямар ч ул мөр үлдэхгүй. Энэ бол Бүлэг 1-д амласан туршилтын эрх чөлөөний бүрэн хэлбэр юм.
Гурав дахь нь хоёр санаа нэгэн зэрэг. Заримдаа та хоёр өөр боломжийн тухай зэрэг бодож байна: ангиллын шүүлтүүр болон сарын тайлан. Тус бүрд нь салаа үүсгэвэл та тэдгээрийн хооронд хүссэнээрээ шилжиж, аль нь түрүүлж бэлэн болсон нь main-д түрүүлж орно. Хоёр ажлын код хоорондоо хольцолдохгүй.
Салаа бүрт нэр хэрэгтэй бөгөөд сайн нэр commit message-тэй адил ирээдүйн өөртөө тусалдаг. Тогтсон заншил ийм: нэрийг англиар, жижиг үсгээр, үгсийг зураасаар холбож бичнэ. Жишээ нь add-category-filter, fix-empty-total, monthly-report. Нэр нь тухайн салаан дээр хийгдэж буй ажлыг хэлэх ёстой. “test”, “new”, “branch2”, “my-work” зэрэг нэрс хоёр долоо хоногийн дараа юу ч хэлэхгүй, яг л “final2” файлын нэр шиг. Нэрэнд зай, кирилл үсэг, онцгой тэмдэгт ашиглахгүй байх нь command бичихэд хялбар бөгөөд асуудалгүй.
Хүсвэл өмнөх сургалтын зарлагын бүртгэлийн программаа санаад, түүнд нэмж болох хоёр гурван шинэ боломжийн тухай бодоод үзээрэй. Тус бүрд ямар branch нэр өгөх байсан бэ? Дараа нь тэдгээрийн аль нэгийг дээрх салаа замын дүрслэл шиг цаасан дээр зурж үзэж болно: main шугам, түүнээс салаалсан таны шинэ салаа, түүн дээрх хоёр гурван зураг. Энэ зураг дараагийн хичээлд command-ууд бичихэд толгойд тань тод байх болно.
Branch бүх файлыг хуулдаг. Дээр дурдсанчлан branch бол зүгээр л хавчуурга, нэг зургийг заасан нэр. Шинэ салаа үүсгэхэд Git ямар ч файл хуулахгүй, ямар ч зай эзлэхгүй. Салааны хооронд шилжихэд л Git фолдерын файлуудыг тухайн зургийн байдалд оруулна. Тиймээс хэдэн арван салаа үүсгэх нь таны компьютерт ямар ч ачаалал өгөхгүй.
Branch бол зөвхөн багийн ажилд хэрэгтэй. Олон хүн нэг төсөл дээр ажиллахад branch зайлшгүй хэрэгтэй нь үнэн. Гэхдээ ганцаараа ажилладаг хөгжүүлэгчид ч branch-ийг өдөр бүр ашигладаг, учир нь дээр дурдсан гурван нөхцөл нэг хүнд ч тохиолддог: яаралтай засвар, бүтэлгүй туршилт, зэрэгцээ санаанууд. Branch нь таны өөрийн ажлыг өөрийнхөө ажлаас хамгаалдаг.
Branch-аас ажил алдагдаж болно. Салааны хооронд шилжихэд файлууд өөрчлөгдөж, зарим нь алга болдог тул эхэндээ айдас төрүүлж болно. Гэхдээ commit хийгдсэн ажил хэзээ ч алга болохгүй, зүгээр л өөр салаан дээр хүлээж байдаг. Тэр салаа руу буцаж очиход бүх зүйл байрандаа байна. Энэ нь өмнөх хичээлийн “commit бол хамгаалалт” гэсэн дүрэмтэй яг таарч байна.
main бол Git-ийн онцгой, өөрчилж болохгүй салаа. Git-ийн хувьд main бусадтай адилхан хавчуурга, нэр нь ч зүгээр л заншил. Бүлэг 1-ийн 3 дугаар хичээлд бид түүнийг main гэж нэрлэхээр тохируулсан, зарим хуучин төслүүд master гэдэг нэрийг ашигладаг. Онцгой нь түүний техникийн шинж чанар биш, түүнд хандах бидний дүрэм юм: main үргэлж ажилладаг байх ёстой.
Branch буюу салаа нь нэг цомгоос хэд хэдэн зэрэгцээ түүх үүсгэх арга бөгөөд зэрэгцээ ертөнц эсвэл салаа замтай зүйрлэж болно. Салаанууд нийтлэг өнгөрсөнтэй, салаалсан цэгээс хойш бие биедээ нөлөөлөлгүйгээр хөгждөг. Техникийн хувьд branch бол нэг зургийг заасан хавчуурга бөгөөд үүсгэх нь хурдан, хямд. Шинэ commit тухайн салааны хавчуургыг урагшлуулдаг. HEAD нь таны одоо дагаж буй хавчуургыг заадаг бөгөөд нэг агшинд зөвхөн нэг салаан дээр байна. main салааг үргэлж ажилладаг байдалд хадгалж, шинэ ажил бүрийг өөрийн салаан дээр хийдэг. Энэ нь яаралтай засвар, бүтэлгүй туршилт, зэрэгцээ санаануудыг асуудалгүй болгоно. Салааны нэр англиар, жижиг үсгээр, зураасаар холбогдсон, ажлыг тодорхой хэлсэн байна.
Дараагийн хичээлд бид энэ ойлголтыг практикт хэрэгжүүлнэ. Шинэ салаа үүсгэж, түүн рүү шилжиж, файлууд нүдний өмнө өөрчлөгдөхийг харна. Мөн commit хийгээгүй ажил салааны хооронд шилжихэд юу болдог вэ гэсэн хамгийн их төөрөгдүүлдэг асуултад шууд хариулна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.