-
1. Иш бошланиши
- 1.1 Талқинларни бошқариш ҳақида
- 1.2 Git нинг қисқача тарихи
- 1.3 Git асоси
- 1.4 Командалар сатри
- 1.5 Git ни ўрнатиш
- 1.6 Git да биринчи созлашлар
- 1.7 Қандай ёрдам олиш мумкин?
- 1.8 Хулосалар
-
2. Git асослари
-
3. Git да тармоқланиш
-
4. Git серверда
- 4.1 The Protocols
- 4.2 Getting Git on a Server
- 4.3 Sizning SSH ochiq (public) kalitingizni generatsiyalash
- 4.4 Setting Up the Server
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Third Party Hosted Options
- 4.10 Хулосалар
-
5. Distributed Git
- 5.1 Distributed Workflows
- 5.2 Contributing to a Project
- 5.3 Maintaining a Project
- 5.4 Summary
-
6. GitHub
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Qism modullar (Submodule)
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Summary
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Summary
-
A1. Appendix A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Summary
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
3.1 Git да тармоқланиш - Тармоқланиш ҳақида икки оғиз сўз
Деярли барча талқинларни бошқариш тизимлари (ТБТлари) қайсидир шаклда бўлсада тармоқланишни қўллаб қувватлайди. Тармоқланишни қўллаган ҳолда сиз асосий яратиш чизиғидан бошқа чизиқга ўтиб асосий чизиқдаги ишга ҳалақит бермайсиз. Кўпгина ТБТ ларда тармоқни яратиш асосан каталогларни нусхалашни талаб этгани учун катта лойиҳалар учун кўп вақт олувчи жараён бўлади.
Баъзи бир одамлар, Git нинг тармоқланиш модели ҳақида гапиришганида, уни бошқа ТБТ лардан орқа фонда қолдирган ҳолатда ажратиб тургани учун ``киллер-фичи`` дея аташади. Унда шунчалик муҳим бўлган нима бор? Git тармоқланиш жуда енгил вазнлидир. Тармоқни яратиш деярли ўша ондаёқ яратилади ва тармоқдан тармоққа ўтиб юришлар ҳам тез бажарилади. Кўпгина бошқа ТБТ лардан фарқли равишда Git бир кунда бир неча бор бирлаштириш ва тармоқланишлар амалга оширилиши сабабли иш жараёнини бироз кенгайтиради. Ушбу функционални тушуниш ва уни бошқара олиш сизга такрорланмас ва мустаҳкам бўлган ускуна сифатида сизга одат бўлиб қолган яратувчанлик жараёнини ўзгартириб юборади.
Тармоқланиш ҳақида икки оғиз сўз
Тармоқланиш механизмини тушуниш учун ортга қайтиб Git ни маълумотларни қандай сақлашини ўрганиш керак.
Иш бошланиши бўлимдагилар ёдингизда бўлса, Git маълумотларни ўзгаришлар кетма-кетлиги тарзида сақламйди у суръатлар (snapshot) тўпламини ишлатади.
Сиз фиксирлашни амалга ошираётган вақтингизда Git уни тайёрланган файллар суръатига (snapshot) мурожаат қиладиган кўрсаткични ўзида мужассамлаштирган объект тарзида сақлайди. Ушбу объект муаллифнинг номи, email и, ҳабари ва фиксирлашга тегишли кўрсаткич ёки ундан олдинги (унинг аждодлари) фиксирлашлар ҳақида маълумотларни ўзида мужассамлаштирган: биринчи сафарги фиксирлаш учун авлод фиксирлашлар бўлмайди, оддий фиксирлашга битта бош фиксирлаш ва тармоқларнинг бирлашишидан хосил бўлган фиксирлашда бир нечта бош фиксирлашлар.
Тасаввур қилинг файллар дарахтини ўзида сақловчи каталог мавжуд бўлсин, ва сиз уларни барчасини тайёрлаябсиз ва сўнгра уларни битта фиксирлаш тарзида сақлаябсиз. Тайёрлаш жараёнида ҳар бир файлнинг Git да файлларнинг талқини (Git уларга мурожаат қилади) ҳисобланмиш назорат йиғиндиси (Иш бошланиши дан билганимиздек у SHA-1) ҳисоблаб чиқилади сўнгра ушбу йиғиндилар тайёрланган файллар соҳасига қўшилади:
$ git add README test.rb LICENSE
$ git commit -m 'initial commit of my project'
Қачон сиз фиксирлашни git commit
командаси билан яратар экансиз, Git ҳар бир қисм каталогларни (бизнинг мисолимизда лойиҳанинг фақат бош каталогини) назорат йиғиндисини ҳисоблаб чиқади ва ушбу объектлар дарахтини омборга сақлайди.
Сўнгра Git фиксирлаш объектини метамаълумот ва лойиҳанинг асосий дарахтига мурожаат қилувчи кўрсаткич билан яратади. Бундай қилинишига сабаб у зарурат туғилганда ушбу суръатни (snapshot) яратиш имконини яратишдир.
Сизнинг Git омборингиз энди бешта объектни сақлайди: ҳар бир файлнинг ташкил этувчилари учун блоб (blob), сақланган файллар блобларига кўрсатувчи кўрсаткичлари билан бирга каталогнинг ташкил этувчиларини дарахтсимон кўриниш, асосий дарахтга мурожаат қилувчи кўрсаткичли фиксирлашнинг ўзи, фиксирлашнинг метамаълумотлари.
Агар сиз ўзгартириш киритсангиз ва яна фиксирлашни бажарсангиз у ҳолда навбатдаги фиксирлаш ўзидан олдинги фиксирлашга кўрсатувчи кўрсаткични сақлайди.
Git да тармоқ (branch) бу — енгилгина ана шу фиксирлашлардан бирига кўчувчи кўрсаткич.
Git да асосий тармоқнинг номи одатда — master
.
Сиз қачон фиксирлашларни бажарар экансиз сиз охирги фиксирлашга кўрсатувчи асосий тармоқни оласиз. Ҳар бир фиксирлаш автоматик тарзда ушбу кўрсаткични олдинга томон суради.
Note
|
“master” тармоғи бу Git даги — махсус тармоқ эмас.
Уни ҳамма тармоқлардан фарқли жойи йўқ.
Унинг деярли ҳамма омборда мавжудлигига сабаб уни |
Янги тармоқ яратиш
Сиз тармоқ яратган вақтингизда айнан нима содир бўлади?
Кейинчалик силжитиш учун янги кўрсаткич яратилади.
Айтайлик сиз “testing” номли янги тармоқ яратмоқчисиз.
Сиз буни ушбу git branch
командаси орқали қилишингиз мумкин:
$ git branch testing
Натижада сиз турган фиксирлашга кўрсатувчи янги кўрсаткич яратилади.
Git сизни қайси тармоқдалигингизни қандай қилиб аниқлайди?
У махсус HEAD
номли кўрсаткични сақлайди.
Шуни назарда тутингки Git да HEAD
тушунчаси бошқа авваллари балки сиз ишлатган (Subversion ёки CVS) талқинларни бошқариш тизимидагиларга қараганда анчагина фарқ қилади.
Git да бу сиз турган маҳаллий тармоққа кўрсатувчи кўрсаткич.
Бизнинг мисолимизда биз ҳоли “master” тармоғида турибмиз.
git branch
командаси фақат янги тармоқ яратади. Унга щтиш бажарилмайди.
Сиз буни git log
командаси ёрдамида онсонлик билан кўришингиз мумкин. У сизга тармоқлар кўрсаткичлари қаерга кўрсатаётганини кўрсатади. Ушшбу опция --decorate
дейилади.
$ git log --oneline --decorate
f30ab (HEAD, master, testing) add feature #32 - ability to add new
34ac2 fixed bug #1328 - stack overflow under certain conditions
98ca9 initial commit of my project
f30ab
фиксирлашга кўрсатувчи “master” ва “testing” тармоқлари кўриниб турибди.
Тармоқларга уланиш
Мавжуд тармоққа уланиш учун git checkout
командасини беринг.
Келинг “testing” тармоғига уланамиз:
$ git checkout testing
Натижада HEAD
кўрсаткичи testing
тармоғига кўрсатишни бошлайди.
Бунда қандай маъно бор? Келинг яна битта фиксирлашни бажарамиз:
$ vim test.rb
$ git commit -a -m 'made a change'
Бу қизиқ, чунки сизни “testing” тармоғингизга кўрсатувчи кўрсаткич олдинга силжиди лекин “master” тармоғи ҳали ҳам аввалги git checkout
командаси берилиш вақтидаги фиксирлашга кўрсатаябди.
Келинг “master” тармоғига уланамиз:
$ git checkout master
Ушбу команда иккита нарсани қилди.
У HEAD
кўрсаткичини ортга “master” тармоғига силжитди ва ишчи каталогидаги файлларни тармоқ кўрсатаётган суръатдаги(snapshot) сақланган ҳолатга қайтарди.
Бу яна бундан буёғига киритилган ўзгаришлар лойиҳанинг эски талқинига тегишли бўлишини англатади.
Бошқа сўзлар билан айтганда “testing” тармоғида бажарилган барча ишлар ортга қайтарилди, бироқ сиз бошқа йўналишда давом этишингиз мумкин.
Note
|
Тармоқларга уланиш ишчи каталогидаги файлларни ўзгартиради
Ёдда тутиш муҳимки, сиз Git да тармоқларга уланаётган вақтингизда ишчи каталогидаги файллар ўзгаради. Агар сиз эски тармоққа уланаётган бўлсангиз унда ишчи каталог кўриниши ана шу тармоқнинг охирги фиксирлаш ҳолатидаги кўринишида бўлади. Агар Git қайсидир сабабга кўра буни қила олмаса у сизга тармоққа уланишга қўймайди. |
Келинг яна бир қанча ўзгаришлар киритамиз ва навбатдаги фиксирлашни бажарамиз:
$ vim test.rb
$ git commit -a -m 'made other changes'
Энди сизни лойиҳангиз тарихи бўлинди (Тармоқланган тарих га қаранг).
Сиз тармоқ яратдингиз, унга уландингиз, унда ишладингиз, сўнг асосий тармоққа қайтдингиз ва унда ишладингиз.
Ушбу ўзгаришлар бир-биридан изоляцияланган: сиз ундан бунга бемалол ўтишингиз мумкин ва қачон тайёр бўлса уларни биргаликда бирлаштиришингиз мумкин.
Ва буларнинг барчаси оддийгина командалар орқали бажарилади: branch
, checkout
ва commit
.
Бунинг ҳаммасини git log
командаси орқали кўришингиз мумкин.
git log --oneline --decorate --graph --all
командаси фиксирлашлар тарихини, тармоқларингиз кўрсаткичлари қаерга кўрсатаябди ва лойиҳа тарихи қандай тармоқланганлигини кўрсатади.
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
Тармоқни ўчириш ва яратиш умуман кўп вақтни олмайдиган иш бўлиб, Git да тармоқ — бу у кўрсатаётган фиксирлашнинг 40 та белгили SHA-1 назорат йиғиндисини ўзида ташкил этувчи оддийгина файл. Янги тармоқни яратиш ва ўчириш жуда онсон бўлиб бу - файлга 41 байтни ёзиш дегани (40 белги ва сатрга ўтиш).
Git даги бундай тармоқланиш бошқа эски талқинларни бошқариш тизимларидаги лойиҳани барча файлларини бошқа қисм каталогга кўчиришни амалга оирувчи тармоқланишидан фарқ қилади. У ерда доим лойиҳани тармоқланиши бир неча секунддан бир неча минутгача вақт олиши мумкин. Git да тармоқланиш шу ондаёқ бажарилади. Шунингдек, фиксирлаш жараёнида биз бош фиксирлашга кўрсаткични сақлар эканмиз, бирлаштириш учун мос келувчи асосни топиб олиш жуда онсон ва бу биз учун автоматик тарзда бажарилади. Ушбу имкониятлар тез-тез тармоқларни яратиб ва қўллаш учун илҳом яратади.
Келинг сизга ҳам буни нима учун қилишингиз кераклигини кўрамиз.