-
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.5 Git да тармоқланиш - Узоқ масофадаги тармоқлар
Узоқ масофадаги тармоқлар
Узоқ масофадаги тармоқлар — бу сизни узоқ масофадаги омборларингиз ҳолатларига мурожаатлар (pointers). Булар силжитиб бўлмайдиган маҳаллий тармоқлар; улар ҳар доим тармоқ билан алоқа ўрнатган вақтингизда автоматик силжийди. Узоқ масофадаги тармоқлар уларга охирги бор боғланиш бўлганда улар қаерда жойлашганлигини эслатиб турувчи маҳкамланган белгилашлар каби ҳаракат қилади.
Улар (узоқ. мас. омбор номи )/(тармоқ)
каби кўринади.
Масалан, агар сиз origin
серверидаги master
тармоғи охирги бор уланиш вақтида қандай кўринишда бўлганлигини кўрмоқчи бўлсангиз origin/master
тармоғини текширинг.
Агар сиз шеригингиз билан бир муаммо устида ишлаган бўлсангиз ва у iss53
тармоғини жойлаштирган бўлса бу вақтда сизда iss53
маҳаллий тармоғингиз бор бўлиши мумкин бироқ у сервердаги тармоқ origin/iss53
нинг фиксирлашига кўрсатади.
Буларни ҳаммаси бизни чалкаштирмаслиги учун кеоинг мисол кўрамиз.
Айтайлик сизда компьютер тармоғида git.ourcompany.com
ном билан чақирилувчи ўзингизни Git-серверингиз бор.
Агар сиз ундан ниманидир клонласангиз Git нинг clone
командаси автоматик тарзда уни origin
дея номлаб, ундан барча маълумотларни олади, у ёқда master
тармоғи кўрсатаётган кўрсаткич учун янги кўрсаткич яратади ва уни маҳаллий жойда origin/master
дея номлайди.
Git шунигдек, сизни ўз master
тармоғингизни яратади. У origin серверидаги master
тармоғи келган жойдан бошланади. Шу туфайли сизни нима биландир шуғулланишингизга имкониятингиз бўлади.
Note
|
``origin`` — бу махсус ном эмас
``origin`` номи ва унга ўхшаб тармоқнинг номи ``master`` ҳам Git учун ҳеч қандай маъно англатмайди. Шу дамда ``master`` — бу |
![Клонлашдан сўнг сервер ва маҳаллий омборлар.](png/remote-branches-1.png)
Агар сиз ўзингизни маҳаллий тармоғингизда нимадир қилсангиз ва шу вақт оралиғида кимдир ўзгаришларни git.ourcompany.com
га ташлаб master
тармоқни янгилаган бўлса у ҳолда сизларнинг тарихларингиз турли давом этади.
Яна сиз токи origin тармоқ билан боғланмас экансиз сизни origin/master
кўрсаткичингиз силжимай тураверади.
![Маҳаллий ва узоқ масофадаги иш ажралиб кетиши мумкин.](png/remote-branches-2.png)
Сизни ишингиз синхронизация қилиб туриши учун git fetch origin
командаси бажарилади.
Ушбу команда ``origin`` қайси серверга мослигини излайди (бизнинг мисолимизда бу git.ourcompany.com
); у ердан сизда мавжуд бўлмаган барча маълумотларни олиб сизни маҳаллий омборингизни янгилайди. origin/master
кўрсаткичини янги ўринга силжитади.
![`git fetch` сизнинг узоқ масофадаги гипер мурожаатларингизни ўзгартиради.](png/remote-branches-3.png)
git fetch
сизнинг узоқ масофадаги гипер мурожаатларингизни ўзгартирадиБир қанча узоқ масофадаги серверлардаги узоқ масофадаги тармоқларни қандай бўлишини кўриб чиқиш учун тасаввур қиламиз сизда яна битта фақатгина маълум бир яратувчилар гуруҳи ишлай оладиган ички Git-сервер бор.
Ушбу сервер git.team1.ourcompany.com
да жойлашган.
Сиз уни хозир ишлаб турган лойиҳангизга янги узоқ масофа мурожаати тарзида Git асослари да ёзилганидек git remote add
командаси ёрдамида қўшишингиз мумкин.
Ушбу узоқ масофадаги серверга teamone
дея ном беринг. Ушбу ном тўлиқ URL учун қисқа ном бўлади.
![Узоқ масофадаги тармоқ тарзида янги серверни қўшиш.](png/remote-branches-4.png)
Энди серверда бору лекин сизда бўлмаган барча маълумотларни олиш учун git fetch teamone
командасини беришингиз керак.
Айни дамда ушбу серверда origin
серверида мавжуд бўлган фақат маълум бир қисм маълумотлар бўлгани боис Git ҳеч қандай маълумот олмайди бироқ узоқ масофадаги teamone
серверидаги master
тармоқдаги фиксирлаш кўрсаткичига мос тармоқни teamone/master
номи билан қўяди.
![`teamone/master` тармоғини кзоқ масофадан кузатиш.](png/remote-branches-5.png)
teamone/master
тармоғини кзоқ масофадан кузатишЎзгаришларни жўнатиш
Қачон сиз тармоқни атрофдагиларга улашмоқчи бўлсангиз сиз уни ёзишга руҳсатингиз мавжуд бўлган серверга жўнатишингиз (push) керак бўлади. Сизнинг маҳаллий тармоқларингиз автоматик тарзда узоқ масофадаги серверлар билан бир хиллик алмашинувини амалга оширмайди. Сиз айнан қайси тармоқни улашмоқчи бўлсангиз ўшаларни аниқ кўрсатиб жўнатишингиз керак бўлади. Шу тарзда сиз бошқаларга кўрсатишни хоҳламаган ўзингизни тармоқларингизни иш учун қўллашингиз ва бошқалар билан биргаликда ишлашингиз мумкин бўлган маълум бир мавзули тармоқларингизни жўнатишингиз мумкин.
Агар сизда бошқалар билан ишлашни хоҳлаган serverfix
тармоқ мавжуд бўлса сиз уни биринчи жўнатган тармоғингиз каби жўнатишингиз мумкин бўлади.
git push (узоқ мас. сервер) (тармоқ)
:
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
Бу қандайдир маънода қисқартириш.
Git автоматик тарзда serverfix
тармоқ номини refs/heads/serverfix:refs/heads/serverfix
га алмаштиради, бу эса “менинг маҳаллий serverfix тармоғимни ол ва унга узоқ масофадаги serverfix тармоғини янгила.”
Биз бўлимни refs/heads/
билан Git Internals да батафсилроқ таҳлил қиламиз, бироқ уни ўтказиб юбориш ҳам мумкин.
Сиз шунингдек git push origin serverfix:serverfix
ни бажаришингиз мумкин — унда ҳам ўша жараён бўлади, бу эса “менинг serverfix имни ол ва уни узоқ масофадаги serverfix га айлантир.” дегани.
Ушбу форматни маҳаллий тармоқни узоқ масофадаги тармоқга бошқа ном билан жўнатиш учун ишлатилади.
Агар сиз тармоқни узоқ масофада serverfix
дея номланиши хоҳламасангиз у ҳолда бундан аввалги команда ўрнига git push origin serverfix:awesomebranch
ни бажаринг. Шундай қилиб сизни serverfix
маҳаллий тармоғингиз узоқ масофадаги лойиҳа awesomebranch
тармоғига жўнатилади.
Note
|
Ҳар сафар ўз махфий кодингизни (паролингизни) киритманг
Агар сиз ўзгаришларни жўнатиш учун HTTPS URL ни ишлатаётган бўлсангиз Git-сервер ҳуқуқни текшириш учун фойдаланувчи номи ва махфий кодини сўрайди. Одатда сизга ўзгаришларни жўнатишга руҳсат берилганлигини айтиш учун ушбу маълумотни терминалда киритишни тавсия қилади. Агар сиз ҳар сафар ўзгаришларни юбораётганда ўз маълумотларингизни қайтадан киритишни хоҳламасангиз сиз “рўйҳатга олинган маълумотларни кешини” ўрнатишингиз мумкин. Онсони уларни хотирада бир неча дақиқа ушлаб туриш. Сиз Рўйҳатга олинган маълумотларни кешлашни вариантлари ҳақида янада батафсилроқ маълумотларни олиш учун Credential Storage бўлимга қарашингиз мумкин. |
Кейинги сафар сизни ҳаммуаллифингиз сервердан янгиланишларни олса у сервердаги serverfix
ни узоқ масофадаги origin/serverfix
тармоғи сифатида нимага кўрсатаётган бўлса шуни олади:
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
Шуни белилаб қўйиш керакки, маълумотларни олиш вақтида сизда янги узоқ масофа тармоқлари пайдо бўлади. Сиз улар учун автоматик тарзда ўзгартириш мумкин бўлган нусхани олмайсиз.
Бошқа сўзлар билан ифодаласак, бизнинг мисолда сиз янги serverfix
тармоғини олмайсиз фақат ўзгартира олмайдиган origin/serverfix
кўрсаткични оласиз.
Ушбу ишларни ўзингизни жорий ишчи тармоғингизга бирлаштириш учун git merge origin/serverfix
командасини беринг.
Агар сизга ўзингизни ишлашингиз мумкин бўлган шахсий serverfix
тармоғингиз керак бўлса у ҳолда сиз уни узоқ масофадаги тармоқ асосида яратишингиз мумкин:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Бу сизга ишлашингиз мумкин бўлган маҳаллий тармоқни беради. У origin/serverfix
қаерга келган бўлса шу ердан бошланади.
Тармоқларни кузатиш
Маҳаллий тармаоқни узоқ масофадаги тармоқдан олиш ``кузатилувчи тармоқ`` (ёки баъзида ``upstream branch``) дея аталувчи тармоқни яратади.
Кузатилувчи тармоқлар — бу узоқ масофадаги тармоқлар билан тўғридан тўғри боғланган маҳаллий тармоқлар.
Агар сиз кузатилувчи тармоқда туриб git pull
командасини берсангиз Git қайси узоқ масофадаги сервердан барча мурожаатларни олиш кераклигини билади ва мос узоқ масофадаги тармоқ билан бирлаштиришни амалга оширади.
Омборни клонлаштириш мобайнида origin/master
ни кузатувчи master
тармоғи автоматик тарзда яратилади.
Бироқ, сиз бошқа кузатувчи тармоқларни ҳам созлаб қўйишингиз мумкин. Айтайлик, агар сиз тармоқларнинг ҳаммаси бошқа узоқ масофадаги омбордагиларни кузатишини хоҳлайсиз ёки master
тармоғини кузатишни хоҳламайсиз. Оддий мисол, сиз хозиргина буни қандай қилишни кўрдингиз git checkout -b [тармоқ] [узоқ мас. сервер]/[тармоқ]
.
git тақдим этувчи умумий қабул қилинган амаллар мавжуд бўлиб у қуйида --track
опцияси билан берилиши келтирилган:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Маҳаллий тармоқни узоқ масофадаги тармоқдан фарқли равишда бошқа ном билан созлаш учун сиз биринчи талқинни маҳаллий тармоқнинг бошқа номи билан онсонгина ишлатишингиз мумкин:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
Энди сизни sf маҳаллий тармоғингиз origin/serverfix дан ўзгаришларни автоматик тарзда олиб(pull) туради.
Агар сизда маҳаллий тармоқ мавжуд бўлса ва уни хозиргина олган узоқ масофадаги тармоққа созламоқчи бўлсангиз ёки сиз кузатаётган upstream-тармоқни ўзгартирмоқчи бўлсангиз у ҳолда сиз ихтиёрий вақтда уни аниқ кўрсатиб ўрнатиш учун -u
ёки --set-upstream-to
калитлари билан биргаликда git branch
командасини ишлатишингиз мумкин.
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
|
Upstream нинг қисқартмаси
Агар сизда кузатилаётган ўрнатилган тармоқ мавжуд бўлса сиз унга |
Агар сиз ўзингизда кузатилаётган қандай тармоқлар ўрнатилганини кўрмоқчи бўлсангиз, сиз git branch
командасида -vv
опциясидан фойдаланишингиз мумкин. Сизнинг маҳаллий тармоқларингиз қўшимча маълумотлар билан кўрсатилади. Ушбу маълумотлар ўз ичида маҳаллий тармоқларнинг қайси бири кузатилаётганлигини, маҳаллий тармоқларда қанча фиксирлашлар бўлган ва улардан қанчаси серверга жўнатилмаган ёки жўнатилсада серверга қуйилмаган ёки асосий тармоқ мос равишда тенглик хосил қилинганлигини кўрсатади.
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
Шундай қилиб бу ерда биз кўришимиз мумкинки, iss53
тармоқ origin/iss53
ни кузатаябди ва у 2 та ўзгаришга олдиндалигини яъни биз серверга юборилмаган 2 та фиксирлашга эгалигимизни англатади. Сиз шунингдек, master
тармоқнинг origin/master
ни кузатишини ва у бутун ўзгаришсиз ҳолатда эканлигини кўришингиз мумкин. Сўнгра биз serverfix
тармоқнинг бизнинг teamone
сервердаги server-fix-good
тармоқни кузатаётганини ва 3 та фиксирлашга олдиндалигини кўришимиз мумкин. Бу фиксирлашлардан 1 таси серверда бўлиб у ҳали бирлаштирилмаганлигини ва 2 та фиксирлаш серверга жўнитилмаганлигидан дарак беради. Охирида биз testing
тармоғимиз узоқ масофадаги тармоқни кузатаётганини кўришимиз мумкин.
Муҳим жиҳати шундаки, ушбу рақамлар - сервердан охирги бор олинган сонларни ифодалайди. Ушбу команда серверга мурожаат қилмайди балки у маҳаллий кешдаги сервер ҳақидаги маълумотдан фойдаланиб кўрсатади. Агар сиз бутунлай етакчи, ортда қолган фиксирлашларни кўрмоқчи бўлсангиз ушбу командадан олдин сиз барча узоқ масофадаги серверларингиздан маълумотларни тортиб олишингиз керак бўлади. Сиз мана бунга ўхшаш ниманидир қилишингиз мумкин бўлади: $ git fetch --all; git branch -vv
Ўзгаришларни қабул қилиш
git fetch
командаси сервердан барча ўзгаришларни олади бироқ сизни ишчи каталогингизни ўзгартирмайди.
Ушбу команда сиз учун фақатгина маълумотларни тақдим этади ва сизни мустақил бирлаштиришларни амалга оширишингизга йўл қўйиб беради.
Бундан ташқари git pull
номли команда ҳам мавжуд, у кўпинча git fetch
ва командаларининг бирин кетин берилганига тенг бўлади.
Агар сизда бундан олдинги бўлимда кўрсатилганидек кузатилувчи тармоқ мавжуд бўлса, ёки у аниқ ўрнатилган бўлса, ёки у clone
ёки checkout
командалари шарофати билан яратилган бўлса git pull
командаси сервер ва сизнинг жорий тармоғингиз кузатилаётганини кўради, сервердан маълумотларни олади ва сўнгра узоқ масофадаги тармоққа бирлаштиришга уриниб кўради.
Одатда fetch
ва merge
командаларини ўзларини ишлатган афзал. Чунки git pull
командаси бажарилиши узилиб қолиши мумкин.
Узоқ масофадаги серверда тармоқларни ўчириш
Айтайлик сиз ва сизни ҳаммуаллифларингиз янги киришни тугатишди ва уни узоқ масофадаги master
(ёки кодни бир моромда сақланадиган бошқа бир тармоққа) тармоғига бирлаштирдиларингиз.
Сиз узоқ масофадаги сервердан git push
командаси билан --delete
калитини қўшиб ишлатиб тармоқни ўчиришингиз мумкин.
Агар сиз сервердан serverfix
тармоқни ўчирмоқчи бўлсангиз қуйидагини бажаринг:
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
Умуман олганда ушбу сатр сервердаги кўрсаткични ўчиради. Қоидага асосан, Git-сервер токи чиқиндиларни йиғиштирувчи ишга тушмагунча маълумотларни маълум бир муддатга қолдириб туради. Агар тармоқ беҳосдан ўчирилиб кетган бўлса, уни қайта тиклаш онсон.