Git
Chapters ▾ 2nd Edition

3.5 Гранење во Git - Далечински гранки

Далечински гранки

Далечните референции се референци (покажувачи) во оддалечените репозиториуми, вклучувајќи ги гранките, таговите и така натаму. Можете да добиете целосна листа на далечински референци експлицитно со git ls-remote [remote] или git remote show [remote] `за далечински гранки, како и повеќе информации. Сепак, почесто е да ги искористиме гранките за следење на далечина.

Ограноци за следење на далечина се референци за состојбата на оддалечените гранки. Тие се локални референци кои не можете да ги преместите; Git ги придвижува за вас секогаш кога ќе направите некоја мрежна комуникација, за да бидете сигурни дека тие точно ја претставуваат состојбата на далечинското складиште. Помислете ги како обележувачи, за да ве потсетам каде што филијалите во оддалечените складишта беа последниот пат кога сте се поврзавте со нив.

Гранките за следење на далечина се во формата <далечински> / <филијала>. На пример, ако сакавте да видам што "господар" филијала на вашиот "потекло" далечински изгледаше како последен пат кога сте го комуницирале со тоа, ќе ја проверите гранката "потекло / господар". Доколку работевте на некое прашање со партнер и тие го натераа грантот iss53, може да имате своја сопствена локална` iss53` филијала, но филијалата на серверот ќе биде претставена од филијалата за далечинско следење `потекло / iss53 `.

Ова може да биде малку збунувачки, па ајде да погледнеме пример. Да речеме дека имаш Git сервер во твојата мрежа на git.ourcompany.com. Ако клонирате од ова, командата клон на Git автоматски го именува` потекло` за вас, ги симнува сите свои податоци, создава покажувач до тоа каде е нејзината господарна гранка и именува тоа` потекло / господар` локално. Git, исто така, ви дава своја локална мастер филијала која започнува на истото место како гранка на" мајсторот "на потеклото, така што од вас има нешто да се работи.

Example 3. “origin” не е посебен

Исто како што името на гранката “master” нема посебно значење во Git, ниту "origin". Додека “master” е стандардното име за почетна гранка кога ќе стартувате git init, што е единствената причина што е широко користен,` origin'' е стандардното име за далечинскиот управувач кога извршувате `git clone. Ако извршите git clone -o booyah наместо, тогаш ќе имате booyah/master како вашата стандардна далечинска гранка.

Server and local repositories after cloning.
Figure 28. Server and local repositories after cloning

Ако направите некоја работа на вашата локална господар гранка, а во меѓувреме некој друг турка до` git.ourcompany.com` и ја ажурира својата master гранка, тогаш вашите истории се движат напред поинаку. Исто така, додека не сте во контакт со вашиот потекло сервер, вашиот "origin/master" покажувач не се движи.

Local and remote work can diverge.
Figure 29. Local and remote work can diverge

За да ја синхронизирате вашата работа, извршувате команда git fetch origin. Оваа команда се осврнува на кој "потекло" на серверот е (во овој случај, тоа е git.ourcompany.com), добива какви било податоци од него, кои сеуште не ги имате, и ја ажурира вашата локална база на податоци, преместувајќи го вашето origin/master покажувач на неговата нова, посовремена позиција.

`git fetch` updates your remote references.
Figure 30. git fetch updates your remote references

За да покажете дека имате повеќе далечински сервери и што изгледаат оддалечените филијали за тие оддалечени проекти, да претпоставиме дека имате друг внатрешен Git сервер кој се користи само за развој од еден од вашите спринтови тимови. Овој сервер е на git.team1.ourcompany.com. Можете да го додадете како нова оддалечена референца за проектот во којшто моментално работите со извршување на командата git remote add, како што се опфатени во глава Основите на Git. Наведете го ова далечинско "teamone", кое ќе биде вашето кратко име за целата УРЛ-адреса.

Adding another server as a remote.
Figure 31. Adding another server as a remote

Сега, можете да го стартувате git fetch teamone за да донесат сè што далечинскиот сервер` teamone` го има што уште немате. Бидејќи тој сервер има подмножество на податоците што ги има серверот "origin" сега, Git не добива никакви податоци, туку поставува филијала за следење на далечина наречена teamone / master за да укаже на извршувањето кое` teamone` го има како master гранка. .Remote tracking branch for teamone/master image::images/remote-branches-5.png[Remote tracking branch for teamone/master.]

Pushing

Кога сакате да споделите гранка со светот, треба да го притиснете на далечинскиот управувач до кој имате пристап за запишување. Вашите локални гранки не се автоматски синхронизирани со дистанционерите што ги пишувате - мора експлицитно да ги притиснете гранките што сакате да ги споделите. На тој начин можете да користите приватни ограноци за работа што не сакате да ги споделите и да ги зголемите само гранките на тема што сакате да соработувате.

Ако имате филијала наречена serverfix со која сакате да работите со други, можете да го притиснете на истиот начин како што ја турнавте вашата прва гранка. Извршите git push <remote> <branch>:

$ 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 branchname на` refs / heads / serverfix: refs / heads / serverfix`, што значи: Земете ја локалната гранка на серверот за фикс и притиснете ја за да ја ажурирам филијалата на серверот. '' Детално ќе го прочитаме деталот `refs / heads / во << ch10-git-internals >>, но обично може да го исклучите. Исто така можете да го направите git push source source serverfix: serverfix, што го прави истото - вели:` Земете го мојот серверски код и направете го серверот за далечинскиот управувач . Можете да го користите овој формат за да им помогнам на локалната гранка во оддалечена гранка која е поинаква именувана. Ако не сакате да се нарекува serverfix на далечинскиот управувач, наместо тоа, можете да го стартувате` git push origin serverfix: awesomebranch` за да го притиснете вашиот локален serverfix филијала во гранката` awesomebranch` на оддалечениот проект.

Note
Не ја пишувајте вашата лозинка секогаш

Ако користите URL на HTTPS за да извршите пренасочување, серверот Git ќе ве праша за вашето корисничко име и лозинка за автентикација. Стандардно ќе ве поттикне на терминалот за овие информации, па серверот може да каже дали ви е дозволено да притиснете.

Ако не сакате да го внесувате секој пат кога ќе притиснете, можете да поставите ‘` кеш за проверка '’. Наједноставниот е само да го задржите во меморија за неколку минути, што лесно можете да го поставите со извршување на git config --global credential.helper cache.

За повеќе информации за различните кеширање опции достапни, погледнете << _credential_caching >>.

Следниот пат кога еден од твоите соработници ќе се подигне од серверот, ќе добиете референца каде верзијата на серверот за 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

Важно е да се напомене дека кога ќе направите донежје што ги намалува новите гранки за следење на далечина, немате автоматски локални копии што можат да се едитираат. Со други зборови, во овој случај, немате нова branchfix гранка - имате само" потекло / серверфикс "покажувач што не можете да го модифицирате.

За да се спои оваа работа во вашата тековна работна гранка, можете да го стартувате git merge origin / serverfix. Ако сакате своја сопствена "branchfix" подружница на која може да работите, можете да го засновате на филијалата за следење на далечина:

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Ова ви дава локална гранка дека можете да работите на тој почеток каде што е "потеклото / серверот".

Tracking Branches

Проверка на локална гранка од филијала за далечинско следење автоматски го создава она што се нарекува ‘` филијала за следење ’ (а гранката што ја следи се нарекува `` низводно гранка '). Следните гранки се локални гранки кои имаат директна врска со оддалечената гранка. Ако сте во филијала за следење и напишете git pull, Git автоматски знае од кој сервер да преземе и која гранка да се спои.

Кога клонирате складиште, тој генерално автоматски создава господар гранка што ги следи потеклото / господарот. Сепак, можете да поставите други филијали за следење ако сакате - оние кои ги следат гранките на други далечински управувачи или не ги следат "господарните" филијали. Едноставниот случај е примерот што го видовте, извршувајќи checkout git-b <branch> <remote> / <branch>. Ова е честа операција што 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 ќе создаде филијала за следење за вас:

$ git checkout 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 автоматски ќе се повлече од` потекло / serverfix`.

Ако веќе имате локална подружница и сакате да ја поставите на оддалечена гранка што сте ја изгубиле, или сакате да ја промените гранката на нагорниот тек што ја следите, можете да ги користите -u или` -set-upstream-to опција за git branch` за експлицитно да го поставите во секое време.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
Upstream shorthand

Кога ќе поставите филијала за следење, можете да ја повикате нејзината возводно гранка со @ {upstream} или @ {u} стенографијата. Значи, ако сте во гранката господар и следете` потекло / господар`, можете да кажете нешто како git merge @ {u} наместо git merge origin / master ако сакаш.

Ако сакате да видите кои филијали за следење сте поставиле, можете да ја користите опцијата -vv на` git branch`. Ова ќе ги наведе вашите локални ограноци со повеќе информации, вклучувајќи го она што секоја гранка ја следи и дали вашата локална гранка е напред, позади или и двете.

$ 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 филијала следи` потекло / iss53` и е напред` од две, што значи дека имаме две локални обврски кои не се туркаат на серверот. Ние исто така можеме да видиме дека нашата господар гранка следи` потекло / господар` и е актуелна. Следно можеме да видиме дека нашата branchfix гранка ја следи гранката` server-fix-good` на нашиот teamone сервер и е понапред од три и зад себе по една, што значи дека постои една обврска на серверот што не сме се спои во уште и три се обврзуваат локално дека не сме се наметнувале. Конечно можеме да видиме дека нашата "тестирање" гранка не следи било која оддалечена гранка.

Важно е да се напомене дека овие броеви се само откако последен пат сте зеле од секој сервер. Оваа команда не допира до серверите, тоа ви го кажува за она што има кеширано од овие сервери локално. Ако сакате целосно ажурирани напред и зад броеви, ќе треба да превземете од сите ваши далечински управувачи веднаш пред да го стартувате ова. Вие би можеле да го направите тоа вака:

$ git fetch --all; git branch -vv

Повлекување

Додека командата git fetch ќе ги симне сите промени на серверот што немате уште, нема да го модифицираат вашиот работен директориум воопшто. Тоа едноставно ќе ги добие податоците за вас и ќе ви овозможи да го споите сами. Сепак, постои команда наречена git pull, која во суштина е` git fetch` веднаш проследена со git спојување во повеќето случаи. Ако имате филијала за следење поставена како што е покажано во последниот дел, или со експлицитно поставување или со тоа што ќе го создаде за вас од командите clone или` checkout`, git pull ќе го пронајде она што серверот и го разгранува вашиот тековната гранка следи, преземи од тој сервер и потоа се обидува да се спои во таа оддалечена гранка.

Општо земено, подобро е едноставно да ги користите командите fetch и` merge` експлицитно како магијата на git pull често може да биде збунувачка.

Бришење на оддалечените филијали

Да претпоставиме дека сте завршиле со оддалечена гранка - велат дека вие и вашите соработници се завршени со карактеристика и сте ги споиле во "господарната" гранка на вашиот далечински управувач (или каква и да е филијалата на вашата стабилна кодирана). Можете да избришете оддалечена гранка со помош на --delete опцијата за` git push`. Ако сакате да ја избришете вашата "серверска филијала" од серверот, го извршите следново:

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

Во суштина сето ова не е да се отстрани покажувачот од серверот. Серверот Git генерално ќе ги чува податоците таму додека трае собирањето на ѓубрето, па ако е случајно избришано, често е лесно да се опорави.