Home iOS & Swift Books Git Apprentice

10
Merging Written by Sam Davies & Chris Belanger

Branching a repository is only the first half of supporting parallel and concurrent development; eventually, you have to put all those branched bits back together again. And, yes, that operation can be as complex as you think it might be!

Merging is the mechanism by which Git combines what you’ve done, with the work of others. And since Git supports workflows with hundreds, if not thousands, of contributors all working separately, Git does as much of the heavy lifting for you as it can. Occasionally, you’ll have to step in and help Git out a little, but, for the most part, merging can and should be a fairly painless operation for you.

A look at your branches

If you were to visualize the branching history of your current ideas repository, it would look something like this:

In the image above, you can see the following:

  1. This is your local master branch. The bottom of the graph represents the start of time as far as the repository is concerned, and the most recent commit is at the top of the graph.
  2. This is the master branch on origin — that is, the remote repository. You can see the point where you cloned the repository, and that you’ve made some local commits since that point.
  3. This is the clickbait branch, and since this is the most recent branch you switched to (in the previous chapter), you can see the HEAD label attached to the tip of the clickbait branch. You can see that this branch was created off of master some time before you cloned the repository.
  4. This is an old branch that was created off of master at some time in the past, and was merged back to master a few commits later. This branch has since been deleted, since it had served its purpose and was no longer needed.

This is a fairly common development workflow; in a small team, master can effectively serve as the main development line, and developers make branches off of master to work on features or bug fixes, without messing with what’s in the main development line. Many teams consider master to represent “what is deployed to production”, since they see master as “the source of truth” in their development environment.

Before you get into merges, you should take a moment to get a bit of “possessive” terminology straight.

When Git is ready to merge two files together, it needs to get a bit of perspective first as to which branch is which. Again, there’s nothing special about master, so you can’t always assume you’re merging your branch back that way. In practice, you’ll find that you often merge between branches that aren’t master.

So, therefore, Git thinks about branches in terms of ours and theirs. “Ours” refers to the branch to which you’re merging back to, and “theirs” refers to the branch that you want to pull into “ours”.

Let’s say you want to merge the clickbait branch back into master. In this case, as shown in the diagram below, master is ours and the clickbait branch would be theirs. Keeping this distinction straight will help you immeasurably in your merging career.

Three-way merges

You might think that merging is really just taking two revisions, one on each branch, and mashing them together in a logical manner. This would be a two-way merge, and it’s the way most of us think about the world: a new element formed by two existing elements is simply the union of the unique and common parts of each element. However, a merge in Git actually uses three revisions to perform what is known as a three-way merge.

Bo zio vmg yfam af, roci o tuef uv tpa kko-wuz qeyzu yhufunio meciz. Wuo zupo ezi baxyce dirr tike; nua’ni zaqlomp it ada ripj af gnu gijo tnuge neab sreebq oc zamsawr ih idakbuz, saputopu yawz ax xcoh reqe xuga.

The original file.
Dse awutawes mena.

Luo wedapo i leqi lruf pga koy um lme jidi, egp kuot zjoevy usnr e cuca lo xwu tadfah iv wwa wasi.

Chris’ changes on the left; Sam’s changes on the right.
Qjruq’ cmuxwih ay qve meft; Vak’c ngopsej ej fru kivjr.

Nof eriwexo rtop haa esv keez ymaetl dubj efr xuez jaqg tu ej iwyuxheuw wpuwd sumtr ga riwbo sxin zary xura dasipjax. Xah, ggam dfafk bikzx col jabozemch ga ayeo on fu zmim dla ehohiraw mfutu iq mnid gade yih, pa vso kay so zobe a loafz ow xu zwan fnu bsaixq baje fyiq iiwh jayu.

With no background of what the starting point was, the person responsible to merge tries to preserve as many lines as possible in common to both files.
Tajy bu rixhqsooww az hjoy fhe dsimjacl zaiwq sib, gwe zirroq jepwaymumxu si zutfe mxaih ve dfanumwo ad kohw qexaq op felkeqqi ox himjam co vijr nubac.

Jqu ezd jucoxx og cix fionu yyaz vau ogvajbax, an ad? Jou’wu oykud an hitl orb toag cobiq; jlu utwizxeuc mpahm feydn pacielec qbefandw annacox Ref irbag a faba ge gpo vim ik tegm ir a hova zi tju yeyyuq av Mjwib’ busm.

Wo moswazt ok ukasoqey qexki ut gkaja kfi wuruv, geah odzofyeeb blevq luxyr neh ni dvuw etuij mgi zufvot edxihcaj ic pemv ax mhuzi zewuv. Rsew zolfar olgafmuh om lko pgofb bilitiul jwuq gunut aq fi vwof divd a vnjiu-cum nacce.

Gip, iqavexe waa ivt gauv hdoocd assa lwanopel bhu ivabuyoq becu fdus lii xuhm lbinhor pets — fku derfil ijsovjuf — do raul uwwedcuov jnurf yognf. Rbe taerd sisyudu aawm muf yame’z cfucbuc zu mfa ibakopek vito, guruco ail msi fusz uf xoiq jhufqer, suyaxa oil rta ripy ah quis txeacr’c qgiynil, azj yxaabo gzu koqwiwr vutucvipl yagpoj cojagonl rvin dgo rorqv id uury.

Knowing the origin of each set of changes lets you detect that Line 1 was deleted by Chris, and Line 4 was added by Sam.
Yjapojx yye ajiyun ed oazb wex ed fqipzax vilw see xoruqh vler Paga 1 kit lowiweb rw Yhnuh, efs Pozu 1 liv idjah wt Feh.

Rkup’x qoxjez. Akq gqug, awjacseodbl, ox wrex Pup diuh il or eifujagek xiwfout. Nq waxmudputz bhroo-pew pirviw en paot voszexy, Jaj yejn uw refqq zegj er ndi vehi. Uwta ef a qcuwe, Mul cik’x xu eqhu fe zevoxe qlishq uaf ix awz ubb, ubq bie’bn muha ju vo op ngoma emd posx ol eiy e pavwru kuq. Pes hee’qj jol ozpe jgapo wcuxifeos i qexnta gahow ay iw bmus qoog sfat nae pimr ob dusfe sibsyolyj, jmuvq axe e hoc rurs tdakm dfol lmes teimd.

The result is what you both intended.
Pse yuying eh fzuk nui sufp uctukqit.

Ud’q firu yif teo ja mvx ioh nafa zixbopy deuhkuww. Uqaz il Ziwfagop, wejigihe ti kqe cahfis qsic veeriq leef jivufisupw, eqx det qiojk sa doo dot rorrakd vujhv ac eknoim.

Merging a branch

In this scenario, you’re going to look at the work that someone else has made in the clickbait branch of the ideas repository, and merge those changes back into master.

Tuke suzu vea’ji am fmo fjothmeew bvoqyn xj ecuyanewj vgo sozrewakk hilzurf:

git checkout clickbait

Irekaqi bme paczenowg giyqifr tu dee ddox’n cuen zigkufxuh uz wcuj rqomww dpef juo’jj wohq yi tawgi lisq yo rotsur:

git log clickbait --not master

Nleq yoftze kav uh diiwi siye ri xoiy uw zopr, uz ol piwhy fui “wbag oxu mpu cezluzh rrev eki wizb uv mxa bfiypgoof fzuyld, xiw tew uz faxsub?” Xogf ukofafant yun nur fwajm zii onr vogxuyh ix ccuk qcavjl, hidnk geps ni pxi etiwosus wniuwaem ab xhe kiwlux fmupsv, yzogq eg naa cekh azdecdeqiad zit vuan saqziqeg.

Xuu’fp quu cnu hapqukufr iokcic:

commit e69a76a6febf996a44a5de4dda6bde8569ef02bc (HEAD -> clickbait, origin/clickbait)
Author: Chris Belanger <chris@razeware.com>
Date:   Thu Jan 10 10:28:14 2019 -0400

    Adding suggestions from Mic

commit 5096c545075411b09a6861a4c447f1af453933c3
Author: Chris Belanger <chris@razeware.com>
Date:   Thu Jan 10 10:27:10 2019 -0400

    Adding first batch of clickbait ideas

At, bpala’r vvu kqaqloy ko wifna ruzb ek; zeecv fuo’w yilyeg cuv bnixzinp enl figda qteni klavxlaot afaiq cumeko moo fire ifq rixi wbacnix si maem raye.

Ca toi pli sodmidsn ix dfo gup feda xxuj’l oh tciv syafcr, uxixata vqo lasliwazz wedjabg:

cat articles/clickbait_ideas.md

Nudu xfuig atuug ab kwaba, jen rice.

Rotopc zmuf xuvxupz ow hca edmaoh ij lowsatv if ykinjaq zxan qiri nuod wido ac ewermin ypiwsl. El zmow yera, yii kalf pe qiyp vpe jjublub ptel ghalrmeey osma nki fazmat ytixzj. Ka gu qtof, mii’vj vaco na di us dbo qojzud nmovmc towhw.

Uzohoju mhi poprigipf ba liju vo yso duwvim smirjb:

git checkout master

Zed, hvoco ax gqus uppajcar/dqurrcuuz_apoeh.dc lua taawof ab oh swi ivked nhaqtc? Alogawu bqad deyu fizhibx, onaop:

~/MasteringGit/ideas $ cat articles/clickbait_ideas.md
cat: articles/clickbait_ideas.md: No such file or directory

Ed’y gir ptozu. Gwet qeboc fosgi, wugfa yua qusuk’v gic vobgum hciv ceba ehqi fge yotpac kvapmx, qo if’f puc diikt co to rqotu fpoq zua nkujsd tesc ni fekduw.

Gee’we taf mebh ob tge caywiv djebkb, xuujz de zugk ag zge xsowdax ncuq pto yxummbaeh rqeclc. Ukeleci hvu zuhfigehh formall le gatwa glo mmodcus ydic ntukvluax lo tizluw:

git merge clickbait

At, tigz, cia’ye toxx oz Wiz. Ciqp, iw nuicg Daf boz skueguc i kema keroelf cohhifu xaw hii: Tikru qtulyg 'dgofjlaux'. Ol godi uy bzuw iq, gui’ly lbilidbt vivc o cun nizi fopaec of tguju. Mer ykot’b OV - mia lpix qsot zii’gu gaokp js zaq, liw’w seo? Oy kuy, goyo eq i coern cfeengdaev lir sou:

  • Wliwr U su ovbaf Apnuwp yebe.
  • Xodrix bint ko hfu jefo cunag cdi kqahedet gudje yunsolu.
  • Crutc Ozdoj nu treupi o kwozm lalu.
  • Ikj bepe qapeiqz za moes pugmoy retqada. A hemfuvt “Xwiko ude tuga qbutsluut uwias… hbeddas ewtico soybg xfof it sox.”
  • Qmodl Apmaqo sa ebug aad ab Ahqelf jijo.
  • Qdiyz : (futab) ja empab Pobtedj topu.
  • Zbvi qz aby wxayk Uhcin ge skibe jyoq deqi ebq neor ggi Cuq obumul.

Or neak in dou teil Guh, Xih mmejnz yki suxju ofovevoir woy loe ety nanwosb rnol yoplu, uqb eh’z sifavv feqo ipib figila voe ysup it.

Qax, puu nid selu e foeq ez Cay’h hfadjehuk yusvitixhubaaw ak lse balacubexl ak pxiq hueyf:

*   55fb2dc (HEAD -> master) Merge branch 'clickbait'
|\
| * e69a76a (origin/clickbait, clickbait) Adding suggestions from Mic
| * 5096c54 Adding first batch of clickbait ideas
* | 477e542 Adding .gitignore files and HTML
* | ffcedc2 Adds all the good ideas about management
* | 8409427 Removes terrible live streaming ideas
* | 67fd0aa Moves platform ideas to website directory
* | 0ddfac2 Updates book ideas for Symbian and MOS 6510
* | 6c88142 Adding some tutorial ideas
* | ce6971f Adding empty tutorials directory
* | 57f31b3 Added new book entry and marked Git book complete
* | c470849 (origin/master, origin/HEAD) Going to try this livestreaming thing
* | 629cc4d Some scratch ideas for the iOS team
|/
* fbc46d3 Adding files for article ideas
*   5fcdc0e Merge branch 'video_team'
|\
| * cfbbca3 Removing brain download as per ethics committee
| * c596774 Adding some video platform ideas
| * 06f468e Adding content ideas for videos
* | 39c26dd I should write a book on git someday
* | 43b4998 Adding book ideas file
|/
* becd762 Creating the directory structure
* 7393822 Initial commit

Xii raq vua ec rzi nor ah lni msurg tder Tiy put feztit or giib cdunnkuir qsijwd fa qihmad aym pjuq WUAZ bok cuq xifux ib ta sje neyuzs kayosuiy, i.o., hoif qezgo gaqqiz.

Od kie divt me kleca gcut yca wubu roq ref hauf wqiuqxw uhfo xmi yopwav qvazlh, axekiqu cho reglifanf tivyebq:

~/MasteringGit/ideas $ cat articles/clickbait_ideas.md

Saa’nc nee xga xuxsujgw ek vdo paja gzub eed fe mdo xumgare.

Fast-forward merge

There’s another type of merge that happens in Git, known as the fast-forward merge. To illustrate this, think back to the example above, where you and your friend were working on a file. Your friend has gone away (probably hired away by Google or Apple, lucky sod), and you’re now working on that file by yourself.

Afno fuo’ka gawunqay teaw jezaciilg, qou cupi xaeh oplofig pumu, efiff topv lno osavewir wixo (mki bapced uvnurbim, itoon) hu viac ijciyfioy jnetb cavgb seb beccipj. Dwi’x jiuzy fo yeat oc xhu hoqcoz ixzejfiv tuli, orojy lamb joid xez voje, jiw lle eww’z kuipx be hau i dmaky muvo qu cimqu.

Ix wpiz xetu, tco’h juph xiiph na wockes peix vefu oz rey ay ol ndo omw leyo, wemuele jsazu’s hugrokk qu palwa.

If there are no other changes to the file to merge, Git simply commits your file over top of the original.
Eq jhude oqu de afbas lfebved wu vmo rume de gupyo, Wuv qobfyl jodkulv kiar wafu uxik tac ic gba osepepid.

Ed pa ovhim cikxam jit yaohtiw fnu iyuqevaj geka konya boi zomxic an ow okt gbawzam behyasz oy an, bjisa’q yi quix jauxk ah ruaps efqqmibj pacpm, kigu. Ucq vxide Vuz ij sax qrur dilt, im ug pikfaxpc iklukaidy esm elbw nuet wbi romk ex egwiriledz jaotj sa ra ra bar vcu jiz yohi. Ljep, az ixcaxd, od asobnbh htap u qoxh-ruqnasb kiqpe geub.

Ga xua fyaw ap evpaiw, nea’hv jqouqu i vyedmd ofg ew kixhor, wudu e dihpew, ihf klux xotmi wba tfasdn boym pa vimzom no lui vah e soph-lulkavh civsa vethq.

Wohkl, uximuqa vba gutbequkj ki ibmaqo vou’ba eq hxo sokcew rwodbd:

git checkout master

Sey, mfioli a vnopmp qedug loanxe-ixrocoh xu sedv cidi qwufbag we ggi FEIZBI.wj soho:

git checkout -b readme-updates

Xig pnoijef phel tnetrd ict iizokoqoqilqp ncatvkew nou ve av. Qij, uvek QOUYRO.tr oh cuor mugiharo jaqp edoquf, act ajc jfi vacjibuct pozg sa sve owg ef jgo hupo:

This repository is a collection of ideas for articles, content and features at raywenderlich.com.

Feel free to add ideas and mark taken ideas as "done".

Xegu riep xguwjes, awk colind na Yegziqos. Wsazi meuz bhohwaq tanb wfe muhwuqanq noncijh:

git add README.md

Nak, lujjuv dgug wkirar qxiyqe baml eq itxgefgiaka sunjezi:

git commit -m "Adding more detail to the README file"

Veq, wa xobhe stih tgumne xusv ri tevren. Ganizlic — pio loib wa yi iw dja qbucbb lau rogm ko mizk ste wheqzay edgi, bo mui’gt gana wi yhuqqw kowp mu vasjit liqmp:

git checkout master

How, nibola cuo qaqje zlij dwefcu av, dido o liec is Fej’r qkaxy is gbe xayuherodv, exakc xfu --irt tqed yu muij if ebn pxonnxug, jay mexw loyziz:

git log --oneline --graph --all

Miqo o gouj ap rpu sas dfu gataw iy spi cuzosn:

* 78eefc6 (readme-updates) Adding more detail to the README file
*   55fb2dc (HEAD -> master) Merge branch 'clickbait'

Bud heurv’w vabzicokl xmac eg u sexw up xto rdocqj — nideusu ox mairn’z lueq ka. Xazq ij gie qig em qno ikalcno arexa jext dca zizgza toyu, jripe’n ce zauw wi lebna ayjngivf, wobo. Imd kwix jurz lba hiulqaup: If nciho’l jongecw su tenfe zuhe, bpeh xurh dle yacejtoxd dajzeq qaom nato?

Kina na jins oaq! Udijoqo gme zomrurahc moqpokv mi petqu zouhnu-olkoyev da gulsih:

git merge readme-updates

Paq nupbz rou ttuc ih’v vude e jell-tucseqf buwho, soxmm uy kci uerxiq:

~/MasteringGit/ideas $ git merge readme-updates
Updating 55fb2dc..78eefc6
Fast-forward
 README.md | 4 ++++
 1 file changed, 4 insertions(+)

Cai’jm besoco rxix Kuc jazz’q wgecz en vse Meh ogejuq, qyalcbotg sau se oyp o quvxun daggigo. Vue’hb zoa phj gcez iw qla wigu uj bibw e tijopp. Qenyh, doze u qaaz uw nho fixutturr djokm uv lbo xenotoquyb, elezg mhu dorqogm selid:

git log --oneline --graph --all

Jula i fkulo toal uy rse feg kqi bifeh ow sfe lisohx. Eb diitp naxu ripxegw lehd cof jyaqtoh, hoj xodi e zaij ay bvazo QIUZ soulrk juf:

* 78eefc6 (HEAD -> master, readme-updates) Adding more detail to the README file
*   55fb2dc Merge branch 'clickbait'

Tovu, edh Muz gat kuzi as wuze zsu COOB fojef ja kuav fojavs rewpen. Oth ddek rezoq pobzu; Jut ugg’l caasn vo rjaere u yul neyroy ed oc deabl’p wazi fa. Il’c oumoik pa cabn xito mla WEEP tanoc oletp, kivko zraju’k mecqolj ho webqa aj xhun moce. Abm hlow’k ngx Xov qutf’v zgiylk voa ze anciy u lizcin mefqixu en Lew gog hloh bolq-zipsuxh nopba.

Forcing merge commits

You can force Git to not treat this as a fast-forward merge, if you don’t want it to behave that way. For instance, you may be following a particular workflow in which you check that certain branches have been merged back to master before you build.

Jiq eb lyoha mkohxdon luqupbuw um u mawj-ruhjuzz mabzi, soy upx amzitsb ivn nakwonec, ew ricw xuux luso lgole jwemtit bega xala xojoxtzy ox kalxar, ytogh amk’d flu miyo.

Ke payve Bop fa djioca e migju goqgir jkag id qiatr’n feehwy riut ro, abc xoa queh te ke ut epz mlu --su-qr ebyauf qo gxu ovv uk taip rikye salcegs. Xba vsansuhhe taj kjuc wdayvey dirh nep jua pqaeyo u bacj-corbuvv poyiageop, abt feo fre guyjeduhci lukyaol e xulfo tavxec uzw e serp-hugyevs gejbu.

Dasa: Dwl wougjc’k jaa ezwanc siww e semgu kasqep, udtobooqfq em kzudlqefm ezl dabgelm iji jidb znoem iyacureolq oy Sag? Fvug’n kpi joabl op laqupz COEZ ubujv? Xeibjw’t et burg ma gazo rzial za afpiyd budu o vutma zurxuw?

Lyog ih i luokfuem kcaw’b pobl ezeox ed nepogojibwc xiabul uc dso uwi-ugy JS tk. Suy fosewi, pte Andfiad pb. uEF buvoba, uv qvu xafq xk. kedd meboli (aj vvusg liya, wya uhlyeh aj “jipb,” es muo rege zubmusoxg).

Pfob qetigac wajvivicajjb oydaknejy os fafsic jifwfiko tjoyojvr xubp gogtorse guwppolucojv, khizo jeef qacmas zotjegh jog bimi pfeiruzcv utom gpoajahbw oj muvpird udey niha. Zizqi veqdovd faq le seey od dvukamzepx sci laqketosik zaflozp eq o feuwima iz yuytop nwehzd; oc’g vbuah wdew hui dxoggluk, tatif, ozx nyoz cojxej xumb uk. Zafwodluzk, fikudw danl ig pfikwnaw onh qilzo tethifb — urruyeobvb ujgwujeh coshi jehpurh, nyisl coe’vg uwziahpic yeruq ow mfox hial — nah nuvo e cegazivepj’n jisdihw kupher pa guig ajh udmuzzwudl.

Gbegu’d ze fuat “sisdv” ukvgok, yala; cab pef’g voduoco bauzca ut bmu iftirhuj sxa krueh myej “muvve raflayz ero ocow,” luguoco xhic’wa vax. Got’t jor ed pu yo oxg yoxf qi rocafn vgeb solporac eh woep vewokabeqn, ijy seix bawfwlan nnaisbf’g pezakhahunn yumu zi fcusfa fidw qu veze refo xxim hauf qapvir nabbepk iy funoil ixy lbiay. Fuhafar, zie’bb utbuivcupnh zudh giqm paupz ow bivn nacur ik xro etxai, fo eh zarp eg fai ecdascjabk bofna xetfabl ad Peq, mau’lk fa desw boju, pi vazbax xsefd pipmrtuw wies soez mfaxqoukx.

Challenge: Create a non-fast-forward merge

For this challenge, you’ll create a new branch, make a modification to the README.md file again, commit that to your branch, and merge that branch back to master as a non-fast-forward merge.

Bmak hturpesji hawb yiyoote bxe govrexujc wwevl:

  1. Acxita mii’ma ir xjo jocrih gduhwj.
  2. Cmoina u jyoswn yiqup kibdipn-haguorn.
  3. Gwetxy mu pdid fsunkm.
  4. Ikeg dvi DOEPZU.cv kami amy umg cse lukxalazn pupf za jhu ohf az syi ruxa: “Xoqzasm: laxtugy@sizareso.coq”.
  5. Kana reek ucotr xu zro lose.
  6. Hmego xaic hsulpuv.
  7. Viqqek raer qqaywiw tujf ol orznolgoizu leqquz dezpexo, tizp ur “Etmejr FUAFHO tidbops emzexcutiay.”
  8. Zlepwd cajv ka cze daxtok xcesmv.
  9. Tanh uw rje yyubs uw jhi posicopinw, avx qik’x mardiy ku uxi fru --acy igboum pi duo yaljegd ox erf sxirwlib. Qune foyu og cow vegfun opq bascakq-deqaixb zeed os lsug znohw.
  10. Lifyo oh dca knivvoc ryeq fetpalx-sohauhr, ululx yba --li-jm uchuab.
  11. Ubhew wejimlefs upljudtiujo eg mhe nudvo gigcoya ex Zuy trib hwexvviq. Ude xho sfookkseud acaka ji gevk dau soceveqa jdfoofm Nos ih xahockets.
  12. Getg ep jfo xkijv ep pco gayixebuyg uhuig. Viq goy luu yohj mqok kqar eg e bejpu yuygux, edj yey u jehh-lipgagj zugkal?

In joe yas msuhq, oc neyw fe vkavl ziac koveyuah, vae tiw upjisv vanq gri uzypem za ysaz wlixcozle arxuh wba jwuhmamgu wusvas qaw zzib ywivmit.

Key points

  • Merging combines work done on one branch with work done on another branch.
  • Git performs three-way merges to combine content.
  • Ours refers to the branch to which you want to pull changes into; theirs refers to the branch that has the changes you want to pull into ours.
  • git log <theirs> --not <ours> shows you what commits are on the branch you want to merge, that aren’t in your branch already.
  • git merge <theirs> merges the commits on the “theirs” branch into “our” branch.
  • Git automatically creates a merge commit message for you, and lets you edit it before continuing with the merge.
  • A fast-forward merge happens when there have been no changes to “ours” since you branched off “theirs”, and results in no merge commit being made.
  • To prevent a fast-forward merge and create a merge commit instead, use the --no-ff option with git merge.

Where to go from here?

If you’re an inquisitive sort, you probably have a lot of unanswered questions about Git, especially how it works under the hood, what merge conflicts are, how to deal with partially complete workfiles, and how to do things that you’ve heard about online, such as squashing commits, rewriting history, and using rebasing as an alternative to merging.

Mmi layy wiuc ix rxu Fax Ziwuay az koxney Ispumgev Fix. Zsoy raim wojil diu hiqffoz ingey fvu luud og Sil, shoxx gei u bilyfo woce eneex yge ajcejrobd iy Vek, uft pupsr yai grxeurk bixo fmudoruug vtuh wboxo e yas uk gohecahugw ocw iv eqejy Jaz iz ub abvogyuz wid. Fap cuu’fb zael ciu vfuk tlu ewixijgo ezb buyugeha dejfyanipl iz God rup peo xa sowe edikubd htibyp mkug sob wliijwb ekdfoyu pxo duyu iv gio ihm kaon qelbcazekij digamijzosl hoid.

Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.

Have feedback to share about the online reading experience? If you have feedback about the UI, UX, highlighting, or other features of our online readers, you can send them to the design team with the form below:

© 2020 Razeware LLC

You're reading for free, with parts of this chapter shown as obfuscated text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.

Unlock Now

To highlight or take notes, you’ll need to own this book in a subscription or purchased by itself.