-
1. Почеток
- 1.1 За верзиска контрола
- 1.2 Кратка историја на Git
- 1.3 Основи на Гит
- 1.4 Командната линија
- 1.5 Инсталирање на Git
- 1.6 First-Time Git Setup
- 1.7 Getting Help
- 1.8 Заклучок
-
2. Основите на Git
-
3. Гранење во Git
- 3.1 Гранење објаснето
- 3.2 Основно разгранување и спојување
- 3.3 Branch Management
- 3.4 Работни процеси
- 3.5 Далечински гранки
- 3.6 Ребаза
- 3.7 Заклучок
-
4. Git на Сервер
- 4.1 Протоколите
- 4.2 Добивање на Git на сервер
- 4.3 Генерирање на вашиот SSH јавен клуч
- 4.4 Поставување на серверот
- 4.5 Гит демон
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Опции за домаќини на трети лица
- 4.10 Заклучок
-
5. Дистрибуиран Git
- 5.1 Дистрибуирани работни процеси
- 5.2 Придонес кон проект
- 5.3 Приватен мал тим
- 5.4 Одржување на проект
- 5.5 Заклучок
-
6. GitHub
-
7. Git Алатки
- 7.1 Revision Selection
- 7.2 Интерактивно стажирање
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Напредно спојување
- 7.9 Rerere
- 7.10 Дебагирање со Git
- 7.11 Submodules
- 7.12 Збивање
- 7.13 Заменување
- 7.14 Складирање на ингеренции
- 7.15 Заклучок
-
8. Персонализација на Git
- 8.1 Git Configuration
- 8.2 Git Атрибути
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Заклучок
-
9. Git и други системи
- 9.1 Git како Клиент
- 9.2 Мигрирање кон Git
- 9.3 Заклучок
-
10. Внатрешноста на Git
- 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 Заклучок
-
A1. Appendix A: Git во други околини
- 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 Заклучок
-
A2. Appendix B: Вметнување на Git во вашите апликации
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
-
A3. Appendix C: Git команди
- 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.2 Гранење во Git - Основно разгранување и спојување
Основно разгранување и спојување
Ајде да појдеме преку едноставен пример за разгранување и спојување со работниот тек што може да го користите во реалниот свет. Ќе ги следите овие чекори:
-
Некаква работа на веб-страница.
-
Создајте гранка за нова приказна на која работите.
-
Дали некои работи во таа гранка.
Во оваа фаза, ќе добиете повик дека друго прашање е критично и ви треба итна исправа. Ќе го направите следново:
-
Префрлете се на вашата филијала за производство.
-
Создајте гранка за да го додадете испратницата.
-
Откако ќе се тестира, спојте ја филијалата за итна помош и притиснете за производство.
-
Вратете се во вашата оригинална приказна и продолжете да работите.
Основно разгранување
Прво, да речеме дека работите на вашиот проект и да имате неколку обврски веќе на гранката "господар".
![A simple commit history.](png/basic-branching-1.png)
Сте одлучиле дека ќе работите на прашањето # 53 во кој било систем за следење на проблемите што ги користи вашата компанија.
За да креирате нова гранка и истовремено да се префрлите на него, можете да ја извршите командата git checkout
со прекинувачот` -b`:
$ git checkout -b iss53
Switched to a new branch "iss53"
Ова е кратенка за:
$ git branch iss53
$ git checkout iss53
![Creating a new branch pointer.](png/basic-branching-2.png)
Вие работите на вашата веб-страница и направете некои работи.
Со тоа се движи гранката iss53
напред, затоа што сте го одбрале (односно, вашиот HEAD
покажува кон него):
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
![The `iss53` branch has moved forward with your work.](png/basic-branching-3.png)
iss53
branch has moved forward with your workСега ќе го добиете повикот дека има проблем со веб-страницата, и треба веднаш да го поправите.
Со Git, не мора да го распоредите вашиот фикс заедно со iss53
промените што сте ги направиле, а вие не морате да вложувате многу напори во враќањето на тие промени, пред да можете да работите со примена на вашиот fix за тоа што е во производство.
Се што треба да направите е да се префрлите назад во вашата "master" гранка.
Меѓутоа, пред да го направите тоа, имајте во предвид дека ако вашиот работен директориум или област за одложување има непроменети промени кои се во судир со филијалата што ја проверувате, Git нема да ви дозволи да ги префрлите гранките. Најдобро е да имате чиста работна состојба кога ќе ги менувате гранките. Постојат начини да се зафати ова (имено, заострените и извршите измени) кои ќе ги покриеме подоцна, во Stashing and Cleaning. За сега, да претпоставиме дека сте ги направиле сите ваши промени, па можете да се вратите назад во вашата "господарна гранка":
$ git checkout master
Switched to branch 'master'
Во овој момент, вашиот проект работен директориум е токму онака како што беше пред да започнете да работите на број 53, и може да се концентрирате на вашата итна исправа. Ова е важна точка што треба да се запамети: кога ќе ги менувате гранките, Git го ресетира вашиот работен директориум да изгледа како последниот пат кога сте го извршиле во таа гранка. Додава, отстранува и модифицира датотеки автоматски за да бидете сигурни дека вашата работна копија е она што филијалата изгледаше како на вашата последна обврска кон него.
Следно, имате реплика за испраќање.
Ајде да создадеме гранка hotfix
на која ќе работиме додека не биде завршено:
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)
![Hotfix branch based on `master`.](png/basic-branching-4.png)
master
Можете да ги извршите тестовите, осигурајте се дека испратницата е она што сакате, и конечно да се спои филијалата на hotfix
назад во вашата" господарна гранка "за да се распореди кон производство.
Ова го правиш со командата git merge
:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
Ќе ја забележите фразата ‘` брзо напред '’ во тој спој.
Бидејќи обврската C4
укажана на филијалата` hotfix` што сте ја споиле беше непосредно пред извршувањето C2
на кое сте вклучени, Git едноставно го поместува покажувачот напред.
За да го фразирате на друг начин, кога ќе се обидете да споите една посветеност со извршување што може да се постигне со следење на историјата на првиот извршител, Git ги поедноставува работите со поместување на покажувачот напред, бидејќи не постои дивергентна работа за спојување заедно - ова се нарекува “fast-forward”.
Вашата промена сега е во снимката на записот што го посочи гранката master
, и можете да го распоредите фикс.
![`master` is fast-forwarded to `hotfix`.](png/basic-branching-5.png)
master
is fast-forwarded to hotfix
Откако ќе се распореди вашиот супер-важен фикс, подготвени сте да се вратите назад на работата што ја правите пред да бидете прекинати.
Сепак, прво ќе ја избришете филијалата hotfix
, затоа што веќе не ви е потребна - поени на" мајсторот "на истото место.
Можете да го избришете со опцијата -d
за` git branch`:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
Сега можете да се вратите назад во вашата гранка за работа во прашање # 53 и продолжете да работите на тоа.
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
![Work continues on `iss53`.](png/basic-branching-6.png)
iss53
Вреди да се напомене дека делото што го правите во вашата филијала на "hotfix" не е содржано во датотеките во вашата "iss53" филијала.
Ако треба да го повлечете, можете да го споите вашиот master
филијала во вашата` iss53` филијала со извршување git merge master
, или можете да почекате да ги интегрирате тие промени додека не одлучите да ја повлечете гранката` iss53` назад во господар
подоцна.
Basic Merging
Да претпоставиме дека сте решиле дека вашата работа број 53 е завршена и подготвена да се спои во вашата "господарска" гранка.
За да го направите тоа, ќе се спои вашата гранка со iss53
во` господар`, исто како што претходно сте ја споиле вашата hotfix
branch.
Се што треба да направите е да ја проверите гранката во која сакате да се спојат и потоа да ја извршите командата git merge
:
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
Ова изгледа малку поинакво од спојувањето со hotfix
што го направивте порано.
Во овој случај, вашата историја на развој се разликува од некоја постара точка.
Бидејќи обврската на филијалата на која сте на не е директен предок на гранката со која се спојувате, Git мора да направи некоја работа.
Во овој случај, Git прави едноставна комбинација од три начини, користејќи ги двата снимка посочени од филијалата и општиот предок на двете.
![Three snapshots used in a typical merge.](png/basic-merging-1.png)
Наместо само да го поместува покажувачот на гранка напред, Git создава нова слика која резултира од овој тригодишен спој и автоматски креира нова обврска која укажува на тоа. Ова се нарекува спојување и е посебно по тоа што има повеќе од еден родител.
![A merge commit.](png/basic-merging-2.png)
Вреди да се истакне дека Git го одредува најдобриот заеднички предок што го користи за нејзината спојување; ова е различно од постарите алатки како што се CVS или Subversion (пред верзијата 1.5), каде што програмерот кој го направил спојувањето морал да ја разбере најдобрата база за спојување за себе. Ова го прави спојувањето на многу полесно во Git отколку во овие други системи.
Сега кога вашата работа е споена, немате повеќе потреба за гранката iss53
.
Можете да го затворите билет во системот за следење на билет и да ја избришете гранката:
$ git branch -d iss53
Basic Merge Conflicts
Понекогаш, овој процес не оди глатко.
Ако го промените истиот дел од истата датотека различно во двете гранки со кои се спојувате заедно, Git нема да може да ги спои чисто.
Ако вашиот фикс за број # 53 го модифицира истиот дел од датотеката како филијала hotfix
, ќе добиете конфликт за спојување кој изгледа вака:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git не автоматски креира ново спојување.
Го запрена процесот додека го решавате конфликтот.
Ако сакате да видите кои датотеки не се полнат во било која точка по конфликтот за спојување, можете да го стартувате git status
:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Сè што има конфликти на спојување и не е решено е наведено како необликувано. Git додава стандардни маркери за решавање на конфликти во датотеките кои имаат конфликти, па можете рачно да ги отворите и да ги решите тие конфликти. Вашата датотека содржи дел кој изгледа вака:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
Ова значи дека верзијата во HEAD
(вашата` господар` гранка, бидејќи тоа беше она што сте го провериле кога ја извршувавте командата за спојување) е горниот дел од тој блок (сè над '======= ` ), додека верзијата во гранката iss53
изгледа како сè во долниот дел.
За да го решите конфликтот, треба да изберете или една или друга страна или да ги споите содржините сами.
На пример, може да го разрешите овој конфликт со заменување на целиот блок со ова:
<div id="footer">
please contact us at email.support@github.com
</div>
Оваа резолуција има малку од секој дел, а <<<<<<< ',
======= и
>>>>>>>> линиите се целосно отстранети.
Откако ќе го решите секој од овие секции во секоја конфликувана датотека, извршете `git add
на секоја датотека за да ја обележите како разрешена.
Поставувањето на датотеката го означува како разрешено во Git.
Ако сакате да користите графичка алатка за решавање на овие проблеми, можете да ја стартувате git mergetool
, која активира соодветна алатка за визуелно спојување и ве води низ конфликтите:
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
Ако сакате да користите алатка за спојување поинаква од стандардната (Git избра opendiff
во овој случај бидејќи командата беше извршена на Mac), можете да ги видите сите поддржани алатки наведени на врвот по` ‘една од следниве алатки . '’
Само внесете го името на алатката која сакате да ја користите.
Ако ви требаат понапредни алатки за решавање на незгодни конфликти, споделуваме повеќе за спојување во Напредно спојување.
Откако ќе излезете од алатката за спојување, Git ве прашува дали спојувањето е успешно.
Ако му кажете на сценариото дека е, тој ја фати датотеката за да ја означи како решена за вас.
Повторно можете да го стартувате git status
за да потврдите дека сите конфликти се решени:
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
Ако сте среќни со тоа, и потврдувате дека сè што имаше конфликти е изведено, можете да напишете `git commit 'за финализирање на спојувањето. Пораката за обврски стандардно изгледа вака:
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
Ако мислите дека би било корисно за другите да размислат за ова спојување во иднина, можете да ја модифицирате оваа порака со деталите за тоа како сте решиле спојување и објаснете зошто сте ги направиле промените што сте ги направиле, ако тие не се очигледни.