Fora referencoj estas referencoj (punteros) en via fora deponejoj, inter branĉoj, etikedoj, kaj tiel plu. Vi povas akiri kompletan liston de fora referencoj eksplicite kun git ls-remote [remote] , aŭ git remote show [remote] por foraj branĉoj tiel kiel pli informo. Tamen, pli komuna vojo estas utiligi fora-spurado branĉoj. Fora-spurado brancxoj estas referencoj al la stato de foraj branĉoj. Ili estas lokaj referencoj ke vi povas movi; ili estas movita aŭtomate por vi kiam vi fari ajnan reto komunikado.
Fora-spurado branĉoj agi kiel legosignojn memorigi vin kie la branĉoj
en via fora deponejoj estis la lasta tempo vi konektis al ili. Ili prenas la formon (remote)/(branch) . Ekzemple, se vi volas vidi kion la master branĉo sur via origin fora similis kiel de la lasta tempo vi komunikis kun ĝi, vi kontrolus la origin/master branĉo. Se vi laboras pri temo kun partnero kaj ili puŝis kontrauxulon iss53 branĉo, vi eble havos vian propran lokan iss53 branĉo; sed la branĉo sur la servilo notus al la commit de origin/iss53 . Tio povas esti iom konfuza, do ni rigardu ekzemplon. Imagu ke vi havas Git servilo en via reto ĉe git.ourcompany.com . Se vi kloni el tiu, Git la clone komando aŭtomate nomoj origin por vi, tiras malsupren cxiujn liajn datumojn, kreas sagon al kie lia master brancxo, kaj nomoj ĝi origin/master loke. Git ankaŭ donas vin via propra loka master branĉo startanta je la sama loko kiel origino la master branĉo, do vi havas ion labori de.
noto: "Origino" estas ne speciala
Ĝuste kiel la branĉo nomo "majstro" ne havas neniun specialan signifon en Git, nek faras "origino". Dum "majstro" estas la defaŭlta nomo por startanta branĉo kiam vi kuros git init kiu estas la nura kialo ĝi estas vaste uzata, "origino" estas la defaŭlta nomo por fora kiam vi kuros git clone . Se vi kuras git clone -o booyah anstataŭe, tiam vi havos booyah/master kiel via defaŭlta fora branĉo.
Figuro 3-22. Servilo kaj lokaj deponejoj post klonado Se vi fari iun laboron sur via loka master branĉo, kaj, intertempe, iu alia pelas git.ourcompany.com kaj ĝisdatigas lia master branĉo, tiam via historioj antaŭeniri malsame. Ankaŭ, kiel longe kiel vi restu ekster kontakto kun via origino servilo, via origin/master montrilon ne movas. Figuro 3-23. Lokaj kaj fora laboro povas malkonverĝi Sinkronigi vian laboron, vi kuri git fetch origin komando. Admono suprenrigardas kiu servilo "origino" estas (en tiu kazo, ĝi estas git.ourcompany.com ), akiras ajnan datumon de ĝi ke vi ankoraŭ ne havas, kaj ĝisdatigas via loka datumbazo, movanta via origin/master montrilon al lia nova, pli supren-ĝis-dato pozicio. Figuro 3-24.git fetch ĝisdatigojn via fora referencoj
Pruvi havi multoblajn foraj serviloj kaj kion foraj branĉoj por tiuj
foraj projektoj aspekti, ni supozu vi havas alian internan Git servilo
kiu estas uzita nur por disvolviĝo per unu el viaj spurto teamoj. Tiu servilo estas ĉe git.team1.ourcompany.com . Vi povas aldoni ĝin kiel nova fora referenco al la projekto vi aktuale prilaboras per kurante la git remote add komandon kiel ni kovris en Git Bazaj . Nomu tiu fora teamone , kiu estos via shortname por ke tutaj URL. Kalkuli 3-25. Aldonante alian servilo kiel fora Nun vi povas kuri git fetch teamone venigi ĉiun la fora teamone servilo havas ke vi ne havas ankoraŭ. Ĉar tiu servilo havas subaro de la datumoj vian origin servilo havas nun, Git akiras datumoj sed metas fora-spurado branĉo nomita teamone/master atentigi al la commit ke teamone havas kiel master branĉo. Figuro 3-26. Izolita sekvado branĉo por teamone/master
Kiam vi volas dividi branĉo kun la mondo, vi bezonas puŝi ĝin al fora ke vi havas skribpermeson por. Lokalajn branĉoj ne aŭtomate sinkronigita al la Remotes vi skribu al - vi devas eksplicite puŝi la branĉoj ili volas dividi.
KE vojo, Vi povas uzi privatajn branĉoj por laboro vi ne volas dividi,
kaj puŝi supren nur la temo branĉoj vi volas kunlabori plu. Se vi havas branĉon nomita serverfix ke vi deziras labori sur kun aliaj, vi povas puŝi ĝin la sama vojo vi puŝis vian unuan branĉon. Kuri git push <remote> <branch> :
Tiu estas iom de ŝparvojo. Git aŭtomate vastigas la serverfix branchname al refs/heads/serverfix:refs/heads/serverfix , kio signifas "Prenu mian serverfix loka branĉo kaj puŝi ĝin al ĝisdatigi la fora la serverfix branĉo." Ni transiru la refs/heads/ parto detale en Git internals , sed vi povas ĝenerale forlasi ĝin. Vi povas ankaŭ fari git push origin serverfix:serverfix
, kiuj faras la saman aferon - li diras, "Prenu mian serverfix kaj fari
la fora la serverfix." Vi povas uzi tiun formaton por puŝi loka branĉo
en fora branĉo nomata alimaniere . Se vi ne volas ĝin nomi serverfix sur la fora, vi povus anstataŭe kuras git push origin serverfix:awesomebranch puŝi vian lokan serverfix branĉo al la awesomebranch branĉo sur la fora projekto.
noto
Ne tajpas vian pasvorton ĉiufoje
Se vi uzas HTTPS URL puŝi super la Git-servilo petos vin pri via uzantnomo kaj pasvorto por aŭtentokontrolo. Defaŭlte ĝi instigos vin sur la fina stacio por tiu informo tiel la servilo povas diri se vi rajtas puŝi. Se vi ne volas tajpi ĝin ĉiu ununura tempo vi puŝi, vi povas starigi "credencial kaŝmemoro". La plej simpla estas ĝuste konservi ĝin en memoro dum kelkaj minutoj, kiujn vi povas facile agordi per kurado git config --global credential.helper cache . Por pli informo sur la diversaj credencial caching ebloj disponeblaj, vidi Credencial Tenado .
La venontan fojon unu el viaj kunlaborantoj akiras de la servilo, ili ricevos referenco al kie la servila versio de serverfix estas sub la fora branĉo origin/serverfix :
Estas grave noti, ke kiam vi faros venigi kiu alportas malsupren nova
fora-spurado branĉoj, vi ne aŭtomate havas lokan, redakteblaj kopiojn de
ili. Alivorte, en tiu kazo, vi ne havas novan serverfix branĉo - vi nur havas origin/serverfix puntero ke vi ne povas modifi. Kunfandi ĉi laboro en via nuna laboro branĉo, vi povas kuri git merge origin/serverfix . Se vi volas vian propran serverfix brancxon vi povas labori sur, vi povas bazi vian fora-spurado branĉo:
$ Git kaso -b serverfix origino / serverfixBranch serverfix set up to track remote branch serverfix from origin.Switched to a new branch 'serverfix'
Tio donas al vi lokan filion ke vi povas labori sur kiu komenciĝas kie origin/serverfix estas.
Kontrolanta loka branĉo de fora-spurado branĉo aŭtomate kreas kio
nomiĝas "sekvado branĉo" (kaj la branĉo ĝi spuras nomiĝas "kontraŭflue
branĉo"). Spuranta branĉoj estas lokaj filioj kiuj havas rektan rilaton al fora branĉo. Se vi estas sur sekvado branĉo kaj tipon git pull , Git aŭtomate scias kion servilo por preni de kaj branĉo kunfandi en. Kiam vi kloni deponejo, ĝi ĝenerale aŭtomate kreas master branĉo kiu spuras origin/master . Tamen, vi povas instali aliajn sekvado branĉoj se vi deziras - kiuj spuras branĉoj sur aliaj Remotes, aŭ ne spuri la master branĉo. La simpla kazo estas la ekzemplo vi ĵus vidis, kurante git checkout -b [branch] [remotename]/[branch] . Tiu estas komuna sufiĉe operacio kiu git provizas la --track stenografio:
$ Git kaso --track origino / serverfixBranch serverfix set up to track remote branch serverfix from origin.Switched to a new branch 'serverfix'
Fakte, tio estas tiel komuna, ke estas eĉ ŝparvojo por ŝparvojo.
Se la branĉo nomo vi provas kaso (al) ne ekzistas kaj (b) ekzakte
egalas nomon sur nur unu fora, Git kreos sekvado branĉo por vi:
$ Git kaso serverfixBranch serverfix set up to track remote branch serverfix from origin.Switched to a new branch 'serverfix'
Starigi lokan filion kun malsama nomo ol la izolita branĉo, vi povas facile uzi la unuan version kun malsama loka branĉo nomo:
$ Git kaso -b sf origino / serverfixBranch sf set up to track remote branch serverfix from origin.Switched to a new branch 'sf'
Nun, via loka branĉo sf aŭtomate tiri el origin/serverfix .
Se vi jam havas lokan branĉon kaj volas restarigi gxin al malproksima
branĉo vi ĵus tirita malsupren, aŭ volas ŝanĝi la kontraŭflua branĉo vi
sekvado, vi povas uzi la -u aŭ --set-upstream-to eblo git branch eksplicite metis ĝin ĉe ajna tempo.
$ Git branĉo -u origino / serverfixBranch serverfix set up to track remote branch serverfix from origin.
noto
kontraŭflue stenografio
Kiam vi havas sekvado branĉo instalita, vi povas referenci ĝia kontraŭflua branĉo kun la @{upstream} aŭ @{u} stenografio. Sekve se vi estas sur la master branĉo kaj ĝi spuras origin/master , vi povas diri ion kiel git merge @{u} anstataŭ git merge origin/master se vi deziras.
Se vi deziras vidi kion sekvado branĉoj vi starigis, vi povas uzi la -vv eblon git branch .
Ĉi listigos vian lokan branĉoj kun pli informo inkluzivanta kio ĉiu
branĉo estas spurado kaj se via loka branĉo estas antaŭe, malantaŭe aŭ
ambaŭ.
$ Git branĉo -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
Do jen ni vidas ke nia iss53 branĉo estas sekvado origin/iss53 kaj estas "antaŭen" per du, kio signifas ke ni havas du interna loke kiuj ne puŝita al la servilo. Ni ankaŭ povas vidi ke nia master branĉo estas sekvado origin/master kaj estas ĝisdata. Ni tuj povas vidi ke nia serverfix branĉo estas spuras la server-fix-good branĉo sur nia teamone
servilo kaj estas antaŭeniras por tri kaj malantaŭe per unu, Signifanta
ke la sama faris sur la servilo ni ne kunfalis en ankoraŭ tri interna
loke ke ni ne puŝis. Ni fine povas vidi ke niaj testing branĉo ne sekvado ajna fora branĉo. Estas grave noti, ke tiuj nombroj estas nur ekde la lasta tempo vi prenis el ĉiu servilo. Tiu komando ne atingi ekstere al la serviloj, ĝi estas diranta vin pri kio ĝi cached el tiuj serviloj loke. Se vi volas tute ĝisdata antaŭen kaj malantaŭ nombroj, vi bezonos por alporti de cxiuj viaj Remotes ĝuste antaŭ kuri ĉi. Vi povus fari tion tiel: git fetch --all; git branch -vvgit fetch --all; git branch -vv
Dum la git fetch komando alportos malsupren ĉiujn ŝanĝojn sur la servilo, kiun vi ne havas ankoraŭ, ĝi ne modifas vian labordosierujon ajn. Ĝi simple akiras la datumojn por kaj vin kunfandi ĝin mem. Tamen, tie estas komando nomita git pull kiu estas esence git fetch tuj sekvata de git merge en plej kazoj.
Se vi havas sekvado branĉo starigis kiel pruvis en la lasta sekcio, ĉu
per eksplicite fiksante ĝin aŭ havi ĝin kreis por vi de la clone aŭ checkout komandojn, git pull
mi atendas kion servilo kaj disbranĉigi viaj nunaj branĉo estas
sekvado, venigi de tiu servilo kaj tiam provu kunfandi en tiu fora
branĉo. Ĝenerale estas pli bone simple uzi la fetch kaj merge komandojn eksplicite kiel la magio de git pull povas ofte esti konfuza.
Supozi vi faris kun fora branĉo - diru al vi kaj viaj kunlaborantoj
estas finita kun esprimilo kaj kunfandis ĝin en via fora la master branĉo (aŭ ajna branĉo via stabila codeline estas). Vi povas forviŝi fora branĉo uzante la --delete eblon git push . Se vi volas forigi vian serverfix branĉo de la servilo, vi kuras la sekvaj:
Esence ĉiuj ĉi faras estas forigi la puntero de la servilo.
La Git servilo ĝenerale konservi la datumojn tie por tempeto ĝis rubo
kolekto kuras, do se oni hazarde forviŝita, ĝi estas ofte facile
rekuperi.
Nun ke vi havas la basics de branĉantaj kaj kunfalado malsupren, kio povas aŭ devus vin fari kun ili?
En tiu sekcio, ni kovri iuj komunaj fluoj de laboro ke tiu malpeza
disbranĉadon ebligas, do vi povas decidi se vi ŝatus korpigi ĝin en via
propra disvolviĝo ciklo.
Ĉar Git uzas simplan tridirekta merge, kunfando de unu branĉo al alian
plurfoje dum longa periodo estas ĝenerale facila por fari.
Tiu signifas ke vi povas havi plurajn branĉojn kiuj estas ĉiam
malfermita kaj ke vi uzas por malsamaj etapoj de via ciklo de
disvolviĝo; vi povas kunfandi regule de iuj de ili en aliaj. Multaj Git programistoj havas laborfluo kiuj ampleksas tiu alproksimiĝo, kiel havanta nur kodo kiu estas tute stabilaj en sia master branĉo - eble nur kodo kiu estis aŭ estos publikigita. Ili alia paralela branĉo nomita develop aŭ next
ke ili laboras de aŭ uzi testi stabileco - ne nepre ĉiam stabila, sed
kiam alvenas al stabila stato, ĝi povas esti kunfandita en master . Ĝi estas uzata por tiri en temo branĉoj (mallongdaŭra branĉoj, kiel via antaŭa iss53 branĉo) kiam ili estas pretaj, por certigi ke ili pasas ĉiujn provojn kaj ne enkonduki cimojn. Fakte, ni parolas pri punteros movanta supren la linion de interna vi faras.
La stabila brancxoj estas pli malsupre la linion en via commit
historio, kaj la sangadon-rando brancxoj estas pluen ĝis la historio. Figuro 3-18. Lineara Konsiderante progresemaj-stabileco branĉantaj
Ĝi estas ĝenerale pli facile pensi pri ili kiel laboron siloj, kie aroj
de interna diplomiĝinto al pli stabila silon kiam ili estas plene
testita. Figuro 3-19. Al "silo" Konsiderante progresemaj-stabileco branĉantaj Vi povas daŭre fari tion por pluraj niveloj de stabileco. Kelkaj pli grandaj projektoj ankaŭ havas proposed aŭ pu (proponita ĝisdatigoj) branĉo kiu integris branĉoj kiuj povas ne esti preta por iri en la next aŭ master branĉo. La ideo estas ke viaj brancxoj estas ĉe diversaj niveloj de stabileco; Kiam ili atingas pli stabila nivelo, ili estas kunfandita en la branĉo super ili.
Denove, havanta multoblajn longdaŭra branĉoj ne estas necesa, sed ĝi
estas ofte helpema, speciale kiam vi pritraktas tre grandaj aŭ
kompleksaj projektoj.
Temo branĉoj, tamen, estas utila en projektoj de ajna grandeco. Al temo brancxo mallongdaŭra branĉo kiu vi krei kaj uzi por sola aparta karakterizaĵo aŭ rilata laboro. Tio estas io vi probable neniam faris kun VCS antaŭ ĉar ĝi estas ĝenerale tro multekostaj por krei kaj kunfandi branĉoj. Sed en Git estas komuna krei, labori sur, kunfandi, kaj forigi branĉoj plurfoje tage. Vi vidis tiun en la lasta sekcio de la iss53 kaj hotfix branĉoj vi kreis. Vi faris kelkajn interna ilin kaj forigita ilin rekte post kunfalado ilin en via ĉefa branĉo.
Tiu tekniko permesas kuntekstan ŝaltilo rapide kaj tute - ĉar via
laboro estas apartigita en siloj kie ĉiuj ŝanĝoj en tiu branĉo devas
vidi kun tiu temo, estas pli facile vidi kio okazis dum kodo revizio kaj
tian.
Vi povas konservi la ŝanĝojn tie por minutoj, tagoj, monatoj, kaj
kunfandi ilin en kiam ili estas pretaj, nekonsiderante la ordo en kiu
ili estis kreitaj aŭ prilaboris. Konsideri ekzemplon de fari iun laboron (sur master ), disbranĉiĝas por temo ( iss91 ), laborante en ĝi por iom, disbranĉiĝas la dua branĉo provi alimaniere pritrakti la samo ( iss91v2 ), irante reen al via master branĉo kaj laboris tie por tempeto, kaj tiam disbranĉiĝas tie fari iun laboron kiu vi ne estas certa estas bona ideo ( dumbidea branĉo). Via commit historio aspektos ion kiel jene: Figuro 3-20. Multoblaj temo branĉoj Nun diru vi decidas vin kiel la dua solvo al via problemo bona ( iss91v2 ); kaj vi montris la dumbidea branĉo al via kunlaborantoj, kaj ĝi montriĝas por geniulo. Vi povas forĵeti la originalan iss91 branĉo (perdanta faras C5 kaj C6 ) kaj kunfalas en la aliaj du. Via historio tiam aspektas tiel: Kalkuli 3-21. Historio post kunfalado dumbidea kaj iss91v2 Ni iros en pli detalo pri la diversaj eblaj fluoj de laboro por via Git projekto en Distribuita Git , do antaŭ vi decidas kion disbranĉadon skemo via venonta projekto uzos, nepre legu tiun ĉapitron. Estas grave memori, kiam vi faras cxiujn cxi tiuj branĉoj estas tute lokaj. Kiam vi branĉantaj kaj kunfalado, ĉio estas farata nur en via Git-deponejo - neniu servilo komunikado okazas.
Nun ke vi kreis, kunfalis kaj forigita iuj branĉoj, ni rigardu iuj
branĉo-mastrumado iloj kiu eniros oportunan kiam vi komencas uzanta
branĉoj ĉiam. La git branch ordono faras pli ol nur krei kaj forigi branĉoj. Se vi kuri ĝin sen argumentoj, vi ricevos simplan liston de viaj nunaj branĉoj:
$ Git branĉo iss53* master testing
Rimarki la * karakteron kiu Prefiksoj la master branĉo: ĝi indikas la branĉo kiu vi nun kontrolis eksteren (te, la branĉo kiu HEAD punktoj). Tio signifas ke se vi faras en tiu punkto, la master branĉo estos movita antaŭen kun via nova laboro. Vidi la lasta faras en ĉiu branĉo, vi povas kuri git branch -v :
$ Git branĉo -v iss53 93b412c fix javascript issue* master 7a98805 Merge branch 'iss53' testing 782fd34 add scott to the author list in the readmes
La utila --merged kaj --no-merged opcioj povas filtri tiun liston al branĉoj ke vi havas aŭ ankoraŭ ne kunfalis en la branĉo vi aktuale plu. Vidi kiun branĉoj jam kunfandita en la branĉo vi estas sur, Vi povas kuri git branch --merged :
$ Git branĉo --merged iss53* master
Ĉar vi jam kunfalis en iss53 antaŭe, vi vidos ĝin en via listo. Branĉoj en tiu listo sen la * antaŭ ili ĝenerale bone forigi kun git branch -d ; vi jam korpigis ilia laboro en alia branĉo, do vi ne tuj perdi nenion. Vidi ĉiujn branĉojn kiuj enhavas laboron vi ankoraŭ ne kunfalis en, vi povas kuri git branch --no-merged :
$ Git branĉo --no-kunfalis testing
Tio montras vian alia branĉo. Ĉar ĝi enhavas laboro kiu ne kunfalis en ankoraŭ, klopodante forigi ĝin kun git branch -d malsukcesos:
$ Git branĉo -d testadoerror: The branch 'testing' is not fully merged.If you are sure you want to delete it, run 'git branch -D testing'.
Se vi vere volas forigi la branĉo kaj perdi tiun laboron, vi povas devigi gxin per -D , kiel la helpema mesaĝo atentigas.
Unue, diru vi laboras en via projekto kaj havas paron de interna jam. Figuro 3-10. Simpla commit historio Vi decidis ke vi estas iranta labori sur temo numero 53 en ajna temo-sekvado sistemo via kompanio uzas. Krei branĉon kaj ŝanĝi al ĝi samtempe, vi povas kuri la git checkout komando kun la -b ŝaltilo:
$ Git kaso -b iss53Switched to a new branch "iss53"
Tio estas stenografio por:
$ Git branĉo iss53$ Git kaso iss53
Figuro 3-11. Krei novan branĉon montrilon Vi laboras en via retejo kaj fari iu interna. Farante tiel movas la iss53 branĉo antaŭen, ĉar vi havas ĝin Taksis (te viajn HEAD notas al tio):
$ Vim index.html$ Git commit -a -m 'added a new footer [issue 53]'
Figuro 3-12. La iss53 branĉo movis antaŭen kun via laboro Nun vi ricevas la alvokon kiu estas temo kun la retejo, kaj necesas korekti ĝin tuj. Kun Git, vi ne devas disfaldi vian solvon kune kun la iss53
ŝanĝojn vi faris, kaj vi ne devas meti multe da penado en revertir tiuj
ŝanĝoj antaux vi povas labori sur apliki solvon al kio estas en
produktado. Ĉiuj vi devas fari estas reiri al via master branĉo.
Tamen, antaŭ ol fari tion, rimarku ke se via labordosierujon aŭ
enscenigante areo havas uncommitted ŝanĝoj kiuj konfliktas kun la branĉo
vi ekiras, Git ne permesos vin ŝanĝi branĉoj. Ĝi estas bona havi puran laborista stato kiam vi ŝanĝos branĉoj. Ekzistas manieroj por preni ĉirkaŭ ĉi (nome stashing farante amendi) kiu kovros poste, en Stashing kaj Pureco . Nuntempe, ni supozu vi faris ĉiujn viajn ŝanĝojn, do vi povas reiri al via master branĉo:
$ Git kaso mastroSwitched to branch 'master'
Ĉe tiu punkto, via projekto laboranta dosierujo estas ĝuste la vojo ĝi
estis antaŭ vi komencis labori pri temo numero 53, kaj povas koncentri
sur via hotfix.
Tio estas grava punkto memori: kiam vi ŝanĝos branĉoj, Git restarigas
vian labordosierujon rigardi kiel ĝi faris la lastan fojon vi faris en
tiu branĉo.
Ĝi aldonas, forigas, kaj modifas dosierojn aŭtomate certigi via
laboranta kopio estas kion la branĉo rigardis kiel en via lasta faras al
ĝi. Sekva, Vi havas hotfix fari. Ni kreos hotfix branĉo sur kiu labori ĝis ĝi estas finita:
$ Git kaso -b hotfixSwitched 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(+)
Figuro 3-13. Hotfix branĉo surbaze master Vi povas kuri vian provoj, certigi la hotfix estas kion vi deziras, kaj kunfandi ĝin en vian master branĉo deploji al produktado. Vi faras tion per la git merge komando:
Vi rimarkos la frazo "rapida antaŭen" en tiu merge. Ĉar la commit C4 almontras la branĉo hotfix vi kunfalis en estis rekte antaŭ la commit C2 vi estas sur, Git simple movas la montrilon antaŭen.
Al frazo kiu alia vojo, kiam vi provas kunfandi unu faras kun fari ke
povas esti atingita sekvante la unua fari la historion, Git simpligas
aferojn movante la montrilon antaŭen ĉar ne ekzistas diferencaj laboro
por kunfandi kune - tio nomiĝas " rapida antaŭen. " Via ŝanĝo estas nun en la instantánea de la commit pintaj al la master branĉo, kaj vi povas disfaldi la solvon. Figuro 3-14.master estas rapida plusendita al hotfix Post via super- grava fix estas deplojitaj, vi pretas reiri al la laboro vi faris antaux vi interrompis. Tamen, unue vi devos forigi la hotfix branĉo, ĉar vi ne plu bezonas ĝin - la master branĉo punktoj al la sama loko. Vi povas forigi ĝin per la -d elekto git branch :
Nun vi povas reiri al via agado-en-progreso branĉo sur temo numero 53 kaj daŭre labori sur ĝi.
$ Git kaso iss53Switched 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(+)
Kalkuli 3-15. Laboro daŭras sur iss53 Ĝi valoras notanta tie ke la laboro vi faris en via hotfix branĉo ne enhavita en la dosierojn en via iss53 branĉo. Se vi bezonas tiri ĝin, vi povas kunfandi viajn master branĉo en vian iss53 branĉo de kuranta git merge master , aŭ vi povas atendi integri tiujn ŝanĝojn ĝis vi decidas tiri la iss53 branĉo reen en master poste.
Supozi vi decidis, ke via temo numero 53 laboro estas kompleta kaj preta esti kunfandita en via master branĉo. Por fari tion, vi kunfandi viajn iss53 branĉo en master , multe kiel vi kunfalis via hotfix branĉo antaŭe. Ĉiuj vi devi fari estas kontroli la branĉo vi volas kunfandi en kaj poste ekzekuti la git merge komando:
$ Git kaso mastroSwitched to branch 'master'$ Git merge iss53Merge made by the 'recursive' strategy.index.html | 1 +1 file changed, 1 insertion(+)
Tio aspektas iom malsama ol la hotfix kunfandi vi faris antaŭe. Tiukaze, via evoluo historio diverĝis el kelkaj malnovaj punkto. Ĉar la commit de la branĉo vi estas sur ne estas rekta prapatro de la branĉo vi kunfalado en, Git devas fari iun laboron.
Tiukaze, Git faras simplan tridirekta merge, uzante la du instantáneas
almontras la branĉo konsiletoj kaj la komuna prapatro de la du. Kalkuli 3-16. Tri instantáneas uzita en tipa merge
Anstataŭ simple kopii la branĉo montrilon antaŭen, Git kreas novan
instantánea kiu rezultas de tiu triopa merge kaj aŭtomate kreas novan
fari ke punktoj al ĝi. Tio estas referita kiel merge fari, kaj estas speciala ĉar ĝi havas pli ol unu gepatro. Kalkuli 3-17. A merge commit Ĝi valoras markante ke Git determinas la plej komuna praulo uzi por lia merge bazo;
tiu estas malsama ol malnovaj iloj kiel CVS aŭ Subversion (antaŭ versio
1.5), kie la desarrollador faras la merge devis diveni la plej merge
bazo por si. Tio igas kunfalado heck de multe pli facila en Git ol en tiuj aliaj sistemoj. Nun ke via verko estas kunfanditaj en, vi ne plu bezonas la iss53 branĉo. Vi povas fermi la bileto en via bileto-sekvado sistemo kaj forigi la branĉo:
Foje, tiu procezo ne iras glate. Se vi ŝanĝis la sama parto de la sama dosiero malsame en la du branĉoj vi kunfandante kune, Git ne povos kunfandi ilin pure. Se via fix por temo numero 53 modifis la sama parto de dosiero la hotfix , vi ricevos merge konflikto kiu aspektas io tiamaniere:
$ Git merge iss53Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.
Git ne aŭtomate kreita nova merge fari. Ĝi paŭzis la procezo dum vi solvas la konflikton. Se vi volas vidi kio dosieroj unmerged ĉe ajna punkto post merge konflikto, vi povas kuri git status :
$ Git statusoOn branch masterYou have unmerged paths. (fix conflicts and run "git commit")Unmerged paths: (use "git add <file>..." to mark resolution) both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")
Io ajn kiu havas kunfandi konfliktoj kaj ne estis solvita estas listigita kiel unmerged.
Git aldonas normo konfliktosolvado markiloj al la dosieroj, kiuj havas
konfliktojn, do vi povas malfermi ilin permane kaj solvi tiujn
konfliktojn. Via dosiero enhavas sekcion, kiu aspektas io tiamaniere:
<<<<<<< KAPO: index.html< Div id = "footer" > kontakto: email.support@github.com < / div > =======< Div id = "footer" > bonvolu kontakti nin ĉe support@github.com< / Div >>>>>>>> Iss53: index.html
Tio signifas la versio en HEAD (via master branĉo, ĉar tio estis kion vi Taksis kiam vi kuris via merge komando) estas la supera parto de tiu bloko (ĉio super la ======= ), dum la versio en via iss53 branĉo aspektas kiel ĉiu en la malsupran parton. Por solvi la konflikton, vi devas aŭ elektu unu flanko aŭ la alia aŭ kunfandi la enhavon mem. Ekzemple, vi povus solvi tiun konflikton anstataŭigante la tutan blokon kun ĉi:
< Div id = "footer" > bonvolu kontakti nin ĉe email.support@github.com< / Div >
Tiu rezolucio havas iom de ĉiu sekcio, kaj la <<<<<<< , ======= kaj >>>>>>> linioj estis tute forigita. Post vi malkomponita ĉiu de tiuj sekcioj en ĉiu konfliktis dosiero, kuri git add sur ĉiu dosiero por marki ĝin kiel solvitaj. Enscenigante la dosiero markas ĝin kiel malkomponita en Git. Se vi volas uzi grafikan ilon por solvi tiujn problemojn, vi povas kuri git mergetool , kiu pafas supren taŭga vida merge ilo kaj piediras vin tra la konfliktoj:
$ Git mergetoolThis 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 emergeMerging:index.htmlNormal merge conflict for 'index.html': {local}: modified file {remote}: modified fileHit return to start merge resolution tool (opendiff):
Se vi volas uzi merge ilo alia ol la defaŭlta (Git elektis opendiff
en tiu kazo ĉar la komando estis prizorgita sur Mac), vi povas vidi
ĉiujn apogis iloj listigitaj ĉe la supro post "unu el la sekvaj iloj."
Ĝuste tajpi la nomon de la ilo vi preferus uzi.
noto
Se vi bezonas pli progresintaj iloj por solvi malfacila merge konfliktoj, ni kovras pli sur kunfalado en Altnivela kunfalado .
Post vi eliras la merge ilo, Git demandas vin se la merge sukcesis. Se vi diros la skripto kiu estis, ĝi enscenigas la dosieron por marki ĝin kiel decidis por vi. Vi povas kuri git status denove por kontroli ke ĉiuj konfliktoj estis solvitaj:
$ Git statusoOn branch masterAll conflicts fixed but you are still merging. (use "git commit" to conclude merge)Changes to be committed: modified: index.html
Se vi estas feliĉa kun tio, kaj vi kontrolos ke ĉiu kiu havis konfliktojn estis enscenigita, vi povas tajpi git commit fini la merge fari. La commit mesaĝon defaŭlte aspektas io tiamaniere:
Merge branch 'iss53'Conflicts: index.html## Aspektas kiel vi povas fari la merge.# Se tio ne ĝustas, bonvolu forigi la dosieron# .git / MERGE_HEAD# Kaj reprovu.# Bonvolu eniri la commit mesaĝon for viaj ŝanĝoj. linioj komencante# Per '#' estos ignorata kaj malplenan mesaĝon abortas la commit.# La branĉo mastro# Ĉiuj konfliktoj fiksita sed vi ankoraŭ kunfalado.## Ŝanĝoj esti farita:# Modifita: index.html#
Vi povas modifi tiun mesaĝon kun detaloj pri kiel vi solvis la merge se
vi pensas ke estus helpema al aliaj rigardi ĉi merge en la estonteco -
kial vi faris kion vi faris, se ĝi ne estas evidenta.
Preskaŭ ĉiu VCS havas iun formon de branĉantaj subteno. Disbranĉadon signifas vin diverĝas de la ĉefa linio de disvolviĝo kaj daŭre faros laboron sen rompado kun tiu ĉeftendenca.
En multaj VCS iloj, ĉi tiu estas iom peniga procezo, ofte postulanta
vin krei novan kopion de via fontkodo dosierujo, kiu povas preni longan
tempon por grandaj projektoj. Iuj homoj aludas al Git la disbranĉadon modelo kiel lia "murdisto karakterizaĵo," kaj certe aroj Git dise en la VCS komunumo. Kial tiom speciala?
La vojo Git branĉoj estas nekredeble malpeza, farante branĉantaj
operacioj preskaŭ instantáneo, kaj ŝaltanta-reen inter branĉoj ĝenerale
tiom rapide. Malkiel multaj aliaj VCSs, Git instigas fluoj de laboro ke branĉo kaj kunfandi ofte, eĉ plurfoje en tago. Komprenon kaj majstranta tiu karakterizaĵo donas potencan kaj sola ilo kaj povas tute ŝanĝi la maniero kiun vi disvolvi.
Branĉoj Unuvorte
Por vere kompreni la manieron Git does branĉantaj, ni bezonas preni retropaŝon kaj ekzameni kiel Git stokas liajn datumojn. Kiel vi eble memoras de ekuzi , Git ne stokas datumojn kiel serio de changesets aŭ diferencoj, sed anstataŭe kiel serion de instantáneas. Kiam vi faras fari, Git vendejoj oni faras objekto kiu enhavas puntero al la instantánea de la enhavo vi enscenigita.
Tiu celo ankaŭ enhavas la aŭtora nomo kaj retpoŝto, la mesaĝo kiu vi
tajpas, kaj punteros al la commit aŭ faras ke rekte venis antaux tiu
faras (lia patro aŭ gepatroj): nul gepatroj por la komenca farante per
unu gepatro por normala fari, kaj multnombraj gepatroj por fari ke
rezultoj de merge de du aŭ pli branĉojn. Bildigi tion, ni supozu ke vi havas dosierujo enhavanta tri dosierojn, kaj vi enscenigi ilin ĉiujn kaj fari. Enscenigante la dosierojn checksums ĉiu (la SHA-1 hash ni menciis en ekuzi
), tendencas ke versio de la dosiero en la Git-deponejo (Git raportas
ilin kiel blobs), kaj aldonas ke checksum al la surscenigo areo:
$ Git aldonu README test.rb LICENCO $ git commit -m 'The initial commit of my project'
Kiam vi kreas la commit de kuranta git commit
, Git checksums ĉiu subdosierujo (en tiu kazo, nur la radiko projekto
dosierujo) kaj tendencas tiuj arbo objektoj en la Git-deponejo.
Git tiam kreas commit objekto kiu havas la metadatenoj kaj montrilo al
la radika projekto arbo do ĝi povas re-krei tiun instantánea kiam
devita.
Vian Git-deponejo nun enhavas kvin objektojn: unu blob pri la enhavo de
ĉiu de viaj tri dosierojn, unu arbon kiu listigas la enhavon de la
dosierujo kaj specifas kiun dosiero nomoj estas stokitaj kiel kiu blobs,
kaj oni faras kun la puntero al tiu radika arbo kaj ĉiuj faras
pridatumon.
Figuro 3-1. A commit kaj lia arbo Se vi faras iujn ŝanĝojn kaj fari denove la proksima commit tendencas puntero al la commit kiu venis tuj antaŭ ĝi.
Figuro 3-2. Kompromitas kaj iliaj gepatroj Branĉo en Git estas simple malpeza meblo puntero al unu el tiuj interna. La defaŭlta branĉo nomon en Git estas master . Kiel vi komenci farante interna, vi ricevis master branĉo kiu notas al la lasta commit vi faris. Ĉiufoje vi faras, ĝi moviĝas antaŭen aŭtomate.
noto
La "mastro" branĉo en Git ne speciala branĉo. Estas ĝuste kiel ajna alia branĉo. La sola kialo preskaŭ ĉiu deponejo havas estas ke la git init komando kreas defaŭlte kaj plej homoj ne ĝenas ŝanĝi ĝin.
Kio okazas se vi kreas novan branĉon? Nu, farante tiel kreas novan montrilon por vi movi ĉirkaŭe. Imagu ke vi kreas novan filion nomita testado. Vi faras tion per la git branch komando:
$ Git branĉo testado
Ĉi kreas novan sagon al la sama commit vi aktuale plu. Figuro 3-4. Du branĉoj montrante en la sama serio de interna Kiel Git scias kion branĉo vi aktuale sur? Ĝi tenas specialan puntero nomis HEAD . Notu ke ĉi tiu estas multe malsama ol la koncepto de HEAD en aliaj VCSs vi povas uzi por, ekzemple Subversion aŭ CVS. En Git, ĉi estas puntero al la loka branĉo vi aktuale plu. En tiu kazo, vi ankoraŭ sur master . La git branch komandon nur kreis novan branĉon - ne ŝanĝi al tiu branĉo. Figuro 3-5. KAPO indikus branĉo Vi povas facile vidi tion kurante simpla git log komando kiu montras vin kie la branĉo punteros notas. Opcio estas nomita --decorate .
$ Git log --oneline --decoratef30ab (HEAD -> master, testing) add feature #32 - ability to add new formats to the central interface34ac2 Fixed bug #1328 - stack overflow under certain conditions98ca9 The initial commit of my project
Vi povas vidi la "majstro" kaj "testado" branĉoj kiuj estas ĝuste tie apud la f30ab fari.
Alti al ekzistanta branĉo, vi kuras la git checkout komando. Ni ŝanĝos al la nova testing branĉo:
$ Git kaso testado
Ĉi movas HEAD atentigi al la testing branĉo. Figuro 3-6. KAPO punktoj al la aktuala branĉo Kio estas la signifo de tio? Nu, ni faru alian fari:
$ Vim test.rb$ Git commit -a -m 'made a change'
Figuro 3-7. La KAPO branĉo movas antaŭen kiam faras estas farita Tio estas interesa, ĉar nun via testing branĉo movis antaŭen, sed via master branĉo ankoraŭ montras al la commit vi estis kiam vi kuris git checkout alti branĉoj. Ni ŝanĝi reen al la master branĉo:
$ Git kaso mastro
Figuro 3-8. KAPO movas kiam checkout Ke komando faris du aferojn. Ĝi kopiis la KAPO montrilon al punkto al la master branĉo, kaj ĝi revenis la dosierojn en via labordosierujon reen al la instantánea ke master punktoj. Ĉi tio ankaŭ signifas la ŝanĝoj kiujn vi faras el tiu punkto antaŭen estos diverĝas de malnova versio de la projekto. Ĝi esence rebobina la laboro vi faris en via testing branĉo do vi povas iri en malsama direkto.
noto
Ŝaltanta branĉoj ŝanĝas dosierojn en via laboranta dosierujo
Estas grave noti, ke kiam vi ŝanĝos branĉoj en Git, dosierojn en via labordosierujon ŝanĝos.
Se vi ŝanĝos al malnova branĉo, via labordosierujon estos reverted
rigardi kiel ĝi faris la lastan fojon vi faris en tiu branĉo. Se Git ne povas fari ĝin pure, ĝi ne permesas vin ŝanĝi tute.
Ni faru kelkajn ŝanĝojn kaj fari denove:
$ Vim test.rb$ Git commit -a -m 'made other changes'
Nun via projekto historio diverĝis (vidu Figuro 3-9 ).
Vi kreis kaj interŝanĝita al branĉo, faris iun laboron sur ĝi kaj poste
interŝanĝita reen al via ĉefa branĉo kaj faris alian laboron.
Ambaŭ de tiuj ŝanĝoj estas izolita en apartajn branĉojn: vi povas ŝanĝi
tien kaj reen inter la branĉoj kaj kunfandi ilin kune kiam vi estas
preta. Kaj vi faris cxion, kio kun simpla branch , checkout , kaj commit ordonojn. Figuro 3-9. Diferenca historio Vi povas ankaŭ vidi ĉi facile kun la git log komando. Se vi kuras git log --oneline --decorate --graph --all ĝi presos la historio de via interna, montrante kie via branĉo punteros estas kaj kiom via historio diverĝis.
$ 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
Ĉar branĉo en Git estas en realeco simplan dosieron kiu enhavas la 40
karaktero SHA-1 checksum de la commit notas al, branĉoj estas malkaraj
por krei kaj detrui. Kreante novan branĉon kiel rapida kaj simpla kiel skribanta 41 bajtoj al dosiero (40 karakteroj kaj lino).
Tio estas en akra kontrasto al la maniero plej malnovaj VCS iloj
branĉo, kiu engaĝas kopiante ĉiuj projekto dosierojn en sekundo
dosierujo.
Tio povas preni plurajn sekundojn aŭ eĉ minutojn, depende de la
grandeco de la projekto, dum kiu en Git la procezo estas ĉiam
instantánea.
Ankaŭ, ĉar ni gravuras la gepatroj kiam ni faras, trovanta konvenan
merge bazo por fandado estas aŭtomate farita por ni kaj estas ĝenerale
tre facile fari. Tiuj trajtoj helpos kuraĝigi desarrolladores krei kaj uzi branĉoj ofte. Vidu kial vi devus tion fari.
Ĉe tiu punkto, vi povas fari ĉiujn bazajn loka Git operacioj - krei aŭ
klonado deponejo, farante ŝanĝojn, enscenigante kaj fari tiujn ŝanĝojn,
kaj vidanta la historio de ĉiuj ŝanĝoj la deponejo estis tra. Tuj, ni kovros Git murdisto trajto: lia branĉantaj modelo.
Antaŭ ni finos tiun ĉapitron sur baza Git, kelkaj malgrandaj konsiletoj
kaj ruzoj povas fari vian Git sperti iom pli simpla, facila, aŭ pli
familiara. Multaj homoj uzas Git sen uzi iun ajn de ĉi tiuj konsiloj, kaj ni ne rilatas al ili aŭ supozi vi uzis ilin poste en la libro; sed vi supozeble scias kiel fari ilin.
Se vi uzas la Bash ŝelo, Git venas kun bela aŭtomata plenigo skripto vi povas ebligi. Elŝuti ĝin rekte de la Git fontkodo ĉe https://github.com/git/git/blob/master/contrib/completion/git-completion.bash. Kopiu tiun dosieron al via hejma dosierujo, kaj aldoni tiun al via .bashrc dosiero:
source ~/git-completion.bash
Se vi volas agordi Git aŭtomate havas Bash ŝelo kompletigo por ĉiuj uzantoj, kopii tiun skripton al la /opt/local/etc/bash_completion.d dosierujo sur Mac sistemoj aŭ al la /etc/bash_completion.d/ dosierujo en Linukso sistemoj . Tio estas adresaro de skriptoj kiuj Bash aŭtomate ŝarĝi disponigi ŝelon finaĵoj.
Se vi uzas Windows kun Git Bash, kiu estas la defaŭlta kiam instali Git
sur Vindozo kun msysGit, aŭto- kompletiĝo estu preconfigured. Premu la Tab ŝlosilo kiam vi skribas Git komando, kaj ĝi devus reveni aro de sugestoj por vi elekti de:
$ git co<tab><tab> commit config
Tiukaze, tajpante git co kaj tiam premas la Tab ŝlosilo dufoje sugestas fari kaj config. Aldonante m<tab> kompletigas git commit aŭtomate. Tio funkcias ankaŭ kun ebloj, kiu estas probable pli utila. Ekzemple, se vi uzas la git log komando kaj ne povas memori unu el la ebloj, vi povas ektajpu ĝi kaj premu Tab vidi kio egalas:
Git ne konkludi vian komandon se vi tajpas ĝin parte. Se vi ne volas tajpi la tutan tekston de ĉiu de la Git komandojn, vi povas facile agordi alias por ĉiu komando uzante git config . Jen kelkaj ekzemploj vi eble volos starigi:
Tiu signifas ke, ekzemple, anstataŭ tajpi git commit , vi nur bezonas tajpi git ci . Kiel vi iras pri uzado Git, vi probable uzas aliajn komandojn ofte tiel; en tiu kazo, ne hezitu krei novan kaŝnomoj. Tiu tekniko povas ankaŭ esti tre utila en kreado komandoj ke vi pensas devus ekzisti.
Ekzemple, por korekti la usabilidad problemon vi renkontis kun
unstaging dosiero, vi povas aldoni vian propran unstage alias al Git:
$ git config --global alias.unstage 'reset HEAD --'
Tio igas la sekvajn du komandojn ekvivalentaj:
$ git unstage fileA $ git reset HEAD fileA
Tio ŝajnas iom pli klara. Estas ankaŭ komuna por aldoni last komando, tiel:
$ git config --global alias.last 'log -1 HEAD'
Tiel, vi povas vidi la lastan fari facile:
$ git last commit 66938dae3329c7aebe598c2246a8e6af90d04646 Author: Josh Goebel <dreamer3@example.com> Date: Tue Aug 26 19:48:51 2008 +0800 test for current head Signed-off-by: Scott Chacon <schacon@example.com>
Kiel vi povas diri, Git simple anstataŭas la nova komando kun kiom vi alias al. Tamen, eble vi volas kuri ekstera komando, anstataŭ Git subcommand. En tiu kazo, vi komencas la komandon kun ! Karaktero. Tio estas utila se vi skribas viajn proprajn ilojn kiuj laboras kun Git-deponejo. Ni povas pruvi per aliasing git visual kuri gitk :