Git for noob by Хасчулуу (www.cosmosbirds.org)
Git гэж юу вэ?Git таны үйлдэл бүрийг бүртгэж авна. Энэ нь юу гэсэн үг вэ гэхээр та өөрийн кодыг хүссэнээрээ өөрчилж болно, өөрөөр хэлбэл завааруулж. Таньд кодоо хэрхэн завааруулах хичнээн санаа байна тэднийгээ туршиж үз, түүний дараа хамгийн гайгүйг нь сонго. Ямар сонсогдож байна. Юунаас ч айхгүйгээр шүү дээ.
Харин git дээр сүлжээг нэмбэл юу болох вэ? Энэ бол жинхэнэ нээлттэй эхийн философи болдог. Та хүссэн хүний агуулахаас кодыг нь хуулж ав, өөрийнх дээрээ эрх дураараа хөгжүүл, буцаагаад нэгтгэ, үгүй бол цааш нь тараа. Хүссэн газраасаа, хүссэн тооцоолуураасаа, хүссэн үедээ нэг кодыг хөгжүүл. Энд нэг хөгжүүлж байгаад тэнд очоод үргэлжүүлээд. Үгүй бол энд чи, тэнд тэр хөгжүүл, нэг л кодыг шүү дээ.
Агуулахыг тогоо гэж төсөөл, маш том тогоо, хоолны. Харин хүн бүр өөрийн гэсэн аягатай. Тэнд байгаа бүх хүн амттай хоол идэхийг хүснэ. Тэд тогооноос аяга руугаа хоолоо хийгээд, амсаж үзээд, өөрийн гэсэн амтлагч, ногоог хийгээд эргүүлээд том тогоо руу хийж холино. Дараа нь дахиад л хутгаж авна. Энэ үед маш олон хүмүүсийн энэ маягаар хийсэн амталгаа нийлж жинхэнэ хоолны амт гарч ирнэ. Ингээд л яваад байна. Заавал тогооруу холих хэрэггүй шүү дээ, нэг юм уу нилээд хэсэг найзуудтайгаа нийлээд тэрүүхэндээ гоё хоолоор булагнаж ч болох л юм. Үнэндээ нээлттэй эх хүртэл ийм системээр явагддаг. Тиймдээ ч git бол бүхий л нээлттэй эхийн системүүдийн бурхан нь болдог. Linux kernel, Perl, Ruby on Rails, GNOME, Android гээд л үй түм. Та өөрийнхөө хийсэн хоолыг хэн нэгэнд амсуулж, бас бусадтай хамт илүү гоё амттай болгомоор л байгаа биз дэ? Хэрвээ үгүй бол таньд нээлттэй эх гэдэг хоол хурцдах юм байна.
Харин одоо хамгийн чухал зүйл болох GIT-ИЙН АМТАЛГАА. Харж байгаарай...
Хэрхэн яаж?
Хэрхэн яаж?
Доор local буюу дандаа дотоод ажиллагааг харуулах болно. Дотоод гэдэг нь зөвхөн ганц тооцоолуурын доторх хавтсууд дунд git ажиллагааг хэлдэг бол гадаад ч гэсэн дүрмийн ялгаа байхгүй. Жаахан л сүлжээний мэдлэг, HTTP, ssh гэх мэтийг гадарладаг бол адилхан л хавтсууд шүү дээ. Доорх аргууд offline туршсан ч гэсэн боломжийн байж болох юм.
Бидэнд гурван хавтас байна
$ mkdir repo1 $ mkdir repo2 $ mkdir repo3Эдгээр гурван хавтсыг шууд тоогоор нь эрэмблэе. repo1 бол гол хавтас. Хэдүүлээ одоо хавтас биш агуулах гэж ярих болно. Тэгэхээр repo1 бол төв агуулах байх нь. repo2 болон repo3 хоёр агуулах бол хэрэглэгчид буюу repo1-ийг хөгжүүлэгчид.
Юуны өмнө бид гурван хавтас дотроо git суулгах хэрэгтэй. Git-д бэлдэнэ гэсэн үг.
$ cd repo1 $ git init #git initialize $ cd ../repo2 ...git init нь тухайн хавтсанд git суулгах тушаал. Энэ мөчөөс энэ хавтас git-д ашиглагдахад бэлэн болно. Ингээд гурван хавтаснуудаа бэлтгэчихнэ.
Харин одоо repo2-г үндсэн агуулах болох repo1-рүү нь холбож өгье. Холбохдоо repo1-д origin гэсэн нэрийг өгье. Ингэснээр repo2 агуулахаас origin хэмээн төв агуулах болох repo1-рүү хандах боломжтой.
$ cd repo2 $ git remote add origin ../repo1/.git/Дээрх болболтыг алсын холболт гэх ба repo2-ийн хувьд repo1 нь алсын агуулах буюу remote repositroy болж байгаа юм. Алсын ажиллагаа ийм маягаар явагдана.
Харин одоо repo2 дотор hello.py болон README.md гэсэн файл үүсгээд, түүнийгээ commit буюу git-дээ бүртгэцгээе.
$ touch hello.py $ vi hello.pyгэж үүсгэсэн файлаа нээгээд дотор нь:
def plus(a, b): return a+b a = int(raw_input('a : ')) b = int(raw_input('b : ')) print a, '+', b, '=', plus(a, b)гэж бичээд, хадаглаж гараад
$ touch README.md $ vi README.mdгэж шинэ файлаа үүсгээд дотор нь:
This is first line
This is second line
This is third line
гээд хадаглаад гаръя.
Харин одоо жинхэнэ ажил эхэлнэ. Юу вэ гэхээр үндсэн агуулах руу түлхэж оруулна (push). Гэхдээ ингэхийн тулд бид хийсэн өөрчлөлтүүдээ бүртгэх хэрэгтэй. Өөрөөр хэлбэл git-рүүгээ ямар файл нэмсэн, хэдэн мөр нэмсэн гэх зэргийгээ бүртгэнэ. Ингэхийн тулд add гэдэг тушаал хэрэглэнэ.
$ git add hello.py $ git add README.md
Хэрвээ тодорхой хэмжээний өөрчлөлт оруулчихаад, түүнийгээ хадгалмаар байвал commit гэж хийсэн өөрчлөлтүүдээ багцлан нэрлэж нэг зангилаа болгон хадгална. Энэ нь дараа дараачийн эрсдлээс хамгаална. Өөрөөр хэлбэл та хаанаас ч яаг энэ байдалруугаа эргээд ирж болно, яг л backup гэсэн үг.
$ git commit -m ‘First commit from repo2’Add хийж хийж байгаад л нэг commit хийчих нь байх нь. Ер нь add гэдэг үйлдэл маань stack байдлаар хийгддэг ба хамгийн сүүлийн commit-оос сүүлд хийгдсэн өөрчлөлтүүд ороод явна гэсэн үг. Бүтэн бол хэсэгчилж add хийж болно. Та одоо яг л дээрх давтамжаар өөрчлөлтүүдээ хэсэг бүрээр нь хадгалаад явж болно. Зөвлөж хэлэхэд commit бүр тодорхой сэдвийн дотор байх, аль болох бага багаар хийгээд явах нь аюулгүй байдал тал дээр давуу талтай. Нээх олон төрлийн, олон юм add хийж хийж ганцхан удаа commit хийлээ гэж бодъё, наад зах нь commit-оо юу гэж нэрлэх вэ? Бас жаахан алдаа гарсан бол тэр чигээр нь буцаах хэрэг болно.
Харин одоо үндсэн агуулга дотроо master мөчир үүсгэх зорилгоор ганц хоёр юм хийе. Энэ master мөчрийг заавал яагаад үүсгэх хэрэгтэйг хичээлийн сүүл хавьцаа ойлгоно. Харин яаж үүсгэх вэ гэдэг бол маш энгийн. Та зүгээр л commit хий, тэгээд л цаадах чинь үүсчихнэ Гэхдээ албаар давхардал үүсгэх зорилгоор би адилхан README.md гэдэг файл үүсгэлээ. Давхардлыг git яаж шийддэгийг харуулах зорилготой.
$ cd ../repo1 $ touch README.md $ vi README.mdдотор нь:
This is first line
This is fifth line
This is third line
гэж бичээд, хадаглаж гараад:$ git add README.md $ git commit -m ‘Add README.md file, because master branch is created’Зиа харин одоо ингэнэ. Би дээр хэлсэн, хоолонд хүссэн амтаа оруулахын тулд эхлээд хутгаж аваад, дараа нь нэмээд, эргүүлж хийгээд, холиод, дахиж хутгаж аваад олон нийтийн амт орсон хоолыг иднэ ээ гэж. Үүнтэй ижил, одоо бид repo2 дотрохоо хэрхэн repo1-лүүгээ хийхийг харцгаая. Ингэхийн тулд эхлээд repo1-ээсээ татаж авах буюу pull хийнэ. Ингэхэд git хоёр агуулахад байгаа кодуудыг нэгтгэх ба ямар нэгэн давхцал үүсэхгүй бол асуудал үүсэхгүй, шууд татагдчихна. Гэхдээ энд нэг юм анхааруулахад repo2 маань сүүлийн commit-оос хойш өөрчлөлт ороогүй байх хэрэгтэй, өөрөөр хэлбэл сүүлийн бүх өөрчлөлтөө commit болгосон хойноо нэгтгэл хийхийг зөвшөөрдөг. Энэ нь бас л аюулгүй байдал.
$ cd ../repo2 $ git pull origin masterДээрх үед README.md файл дээр conflict буюу мөргөлдөөн үүсэх болно. Ижил файлын ижил мөрөн дээр давхацсан хоёр өөр өөрчлөлтүүдийг git автоматаар нийлүүлэх буюу merge хийж чаддаггүй. Тиймээс гараар merge хийхэд зориулж тухайн файлын тухайн мөрүүдийг хоёр тусад нь болгоод дараах байдлаар харуулдаг. Тэр бүгдийг гараараа, aлийг нь оруулах, алийг нь хасах вэ гэдгийг нэгтгэж байгаа хүн хийнэ.
This is first line
<<<<<<< HEAD
This is second line
=======
This is fifth line
>>>>>>> 238afb4304cea8271e2981c1cf705523efdcd12d
This is third line
Дээр “<<<<<<< HEAD” гэсэн хэсгээс “>>>>>>> 238afb4304cea8271e2981c1cf705523efdcd12d” гэсэн хэсэг хүртэл давхацсан мөрийг дунд нь “=======” тэмдэгтээр тусгаарлаж үзүүлсэн байна. Дээд талынх нь бол манай repo2-т хуучин байсан нь. Доод талынх нь бол repo1-ээс татаж оруулсан нь. Аль нь зөв бэ гэдгийг харж байгаад аль нэгийг нь үлдээгээд бусад бүх “<<<<<<< HEAD”, “>>>>>>> 238afb4304cea8271e2981c1cf705523efdcd12d” болон “=======” гэснүүдийг нь авч хаяна. Энэ бол гараараа нэгтгэх үйл явц юм. Олон файл дээр олон газар ингэж давхацсан бол тэр болгон дээр ийм зүйл хийгдэнэ гэж үзнэ.
Ингээд гар нэгтгэлийг хийж дууссан бол хадгaлaж гараад, commit-оо хийгээд эргүүлээд push хийж болно. Учир нь одоо push хийхэд repo1 дээр маань давхцал үүсэхгүй. Нэгэнт commit хийсэн бол түүнийгээ хааш нь ч түлхэж болно. Одоо хэдүүлээ repo1-лүүгээ хийсэн өөрчлөлтөө түлхэж оруулая
$ git push origin masterИнгээд л таны ‘First commit from repo2’ гэдэг commit чинь repo1-лүү орчихлоо. Өөрөөр хэлбэл одоо repo1-ийгээ шалгаад үз дэ?
$ ls ../repo1Харин одоо цоо шинэхэн гишүүн repo3 маань хэрхэн энэ ажилд оролцохыг харцгаая. Мэдээж repo3 дотроо эхлээд repo1-ээ алсын агуулахаар нэмнэ.
$ git remote add origin ../repo1/.git/Тэгээд л одоо pull хийгээд л боллоо
$ gut pull origin masterИйнхүү хэдэн ч хавтас хоорондоо эрх тэгш үйл ажиллагаагаа явуулна.
Тэгсэн дээрээс нэг асуулт урган гарч ирж байна. Master гэж юу вэ? Энэ бол мөчир юм. Мод гэдэг бол газраас гарсан нэг том үндсэн мөчир, түүнээс салаалсан олон мөчир байдгийг бид амьдрал дээрээс мэднэ. Тэгвэл git дээр ч мөн адил мөчир гэдэг ойлголт branch гэдэг нэртэйгээр, яг л байгалийн модтой адилхан, нэг үндсэн мөчир, өөр хэчнээн ч үндсэн мөчрөөс салаалсан мөчиртэйгээр оршин тотнож чадна.
Харин нэг мөчир гэдэг бол яг л гинж шиг хэлхэгдсэн commit-үүдийн цуваа юм. Мэдээж commit гэдэг бол таны файлын өөрчлөлтийн бүртгэл. Та өмнөх, өмнөхийн өмнөх үйдлүүдээ төвөггүй харж болно.
Харин мөчир гэдэг бол тухайн нэг commit-оос салаалсан өөр commit-уудын цувааг хэлээд байгаа юм. Мөчир нэмэхдээ
$ git branch newbranchгээд л үүсгэчихнэ. Энд зүгээр л мөчир үүсч байна. Харин одоо тухай мөчир дээрээ ажиллах бол ажлын горим буюу HEAD-ээ шинэ мөчир дээрээ аваачина.
$ git checkout newbranchИнгээд л оруулсан commit болгон чинь newbranch мөчирт хадаглагдах болно.
Ажиллах талбар дээрх үндсэн зарчимууд дээр хязгааргүй өргөн хүрээ, далайцтайгаар явагдана. Мөчир таньд болон таньтай мөр зэрэгцэн код бичиж байгаа нөхдөд чинь өөр өөрийн хувилбараар хөгжүүлэх, янз янзын туршилтыг айлгүй хийх боломжийг олгоно. Нөгөө талаас та маш олон тооцоолуураас нэг л код дээр ажиллахыг хүсвэл хамгийн тохиромжтой зүйл бол git. Та эндээс нэг push хийгээд л, өөр газар очоод тэндээсээ нэг pull хийж аваад л хөгжүүлээд байна.
Харин одоо ганц хоёр git-ийг ашигласан хэрэгцээт технологиудыг танилцуулая.
Github
Github.com бол дэлхийн нэлттэй эхийн төслүүдийн гаазын зурвас. Sourceforge, launchpad зэрэг шиг, гэхдээ тэднээс илүү уян хатан. Github нь git-ийг ашигласан code social сайт юм. Хамгийн гоё юм нь таньд үнэгүй 0.30GB git агуулах эрх өгдөг, бүр гоё юм нь гэвэл та тэр дотор хичнээн ч агуулах үүсгээд, тэрэндээ online хамтрал үүсгэж, яг л дээрх чанараар, үүнийгээ төв агуулах болгож ашиглаж болно.
Голдуу нээлттэй төсөл хийж байхад хэрэг болох ба ганц git агуулахаас гадна git-ийн тань маш дэлгэрэнгүй мэдээллүүдийг маш үзэмжтэй, ойлгомжтойгоор шууд вэбээсээ харах боломжийг олгодог. Мөн дээр нь wiki, issues гээд л нээлттэй эхийн төсөл хэрэгжүүлэхэд юу хэрэгтэй тэр бүгдээр хангаж өгсөн. Мэдээж маш олон энэ төрлийн болон бусад туслайх сайтуудтай хамт ажиллах чадвар нь бүтээмжийг нэмэгдүүлнэ.
Харин та заавал нээлттэй биш буюу private агуулах үүсгэхийг хүсэж байвал github-д мөнгө төлөх хэрэгтэй. Гэхдээ зайлшгүй тохиолдолд бол шалихгүй мөнгө буюу $7/сард. Энэ мөнгө бол хамгийн найдвартай, төгс үйлчилгээ авахад хэтэрхий бага, бараг үнэгүй гэсэн үг юм.
Gitg
Энэ бол desktop application буюу git-ийн хэрэглээний програм юм. Git-ийг ашиглан CLI буюу зөвхөн тушаалын горимоос бүх хэрэгцээт мэдээллүүдийг, маш ойлгомжтой харж болох боловч GUI мэдээж хэрэг болно. Ер нь бүхий л хэрэгцээт мэдээллүүдийг маш цэгцтэй, ойлгомжтой гаргаж өгсөнөөр хурдыг ч, найдвартай ажиллагааг ч төдий чинээ нэмэгдүүлдэг.
Git-д зориулсан ийм төрлийн GUI програмууд зөндөө олон байгаа. Дээрх github бол онлайнаар HTML GUI болгодог болохоос биш бас л нэг төрөл нь юм. Ер нь бүх програмуудын чин зорилго бол таны файлуудын өөрчлөлт, мөчирүүд, хамтын ажиллагааг, нэмсэн хассан зэрэг мэдээллийг илүү ойлгомжтой, алдагдалгүй харуулах, ойлгож байна уу, зөвхөн харуулах л үүрэгтэй.
Сэтгэгдэл:
Зочин хэзээ бичсэн:
2017-10-27 13:34 | |
Баярлалаа
Зочин хэзээ бичсэн:
2017-06-12 12:17 | |
Сайн байна уу? Энэ Нийтлэлийг уншаад эх хэлдээрээ ойлгож авахад сайхан байлаа. Ойлгомжгүй байсан зарим зүйлсийн талаар маш сайхан дэлгэрэнгүй бичсэн байна. Баярлалаа. Мөн git rebase-н талаархи ойлголтыг дараагийн git талаархи бичих нийтлэлдээ оруулаарай
Зочин хэзээ бичсэн:
2015-12-30 02:59 | |
Цаг заж гарган бичсэн Хасчулууд баярлалаа. өөр олон сайхан зүйл бичиж байгаарай.
Соёл (зочин) хэзээ бичсэн:
2010-11-05 15:27 | |
eh heldeeree oilgoj avaxad amar bailaa. Tsag zaviig mini xemnej ogson Chamd bayarlalaa.