Home iOS & Swift Books Git Apprentice

6
Git Log & History Written by Sam Davies & Chris Belanger

You’ve been quite busy in your repository, adding files, making changes, undoing changes and making intelligent commits with good, clear messages. But as time goes on, it gets harder and harder to remember what you did and when you did it.

When you mess up your project (not if, but when), you’ll want to be able to go back in history and find a commit that worked, and rewind your project back to that point in time. This chapter shows you how.

Viewing Git history

Git keeps track of pretty much everything you do in your repository. You’ve already seen this in action in previous chapters, when you used the git log command.

However, there are many ways you can view the data provided by git log that can tell you some incredibly interesting things about your repository and your history. In fact, you can even use git log to create a graphical representation of your repository to get a better mental image of what’s going on.

Vanilla git log

Open your terminal app and execute git log to see the basic, vanilla-flavor history of your repository that you’ve become accustomed to:

commit 477e542bfa35942ddf069d85fbe3fb0923cfab47 (HEAD -> master)
Author: Chris Belanger <chris@razeware.com>
Date:   Wed Jan 23 16:49:56 2019 -0400

    Adding .gitignore files and HTML

commit ffcedc2397503831938894edffda5c5795c387ff
Author: Chris Belanger <chris@razeware.com>
Date:   Tue Jan 22 20:26:30 2019 -0400

    Adds all the good ideas about management

commit 84094274a447e76eb8f55def2c38b909ef94fa42
Author: Chris Belanger <chris@razeware.com>
Date:   Tue Jan 22 20:17:03 2019 -0400

    Removes terrible live streaming ideas

commit 67fd0aa99b5afc18b7c6cc9b4300a07e9fc88418
Author: Chris Belanger <chris@razeware.com>
Date:   Tue Jan 22 19:47:23 2019 -0400

    Moves platform ideas to website directory

Vsec kvezq lee u puqb oy ehhejqkip jujpich — nvow en, swu feq ut jeqsuws swig huwd spi sunsecw oh hme janqayn deit. Id wbaj hace, wyob’g dbi nosy zudexn wuzneb an rpa redxim ndehhv ig caeq gaqatigoxl. Xmexl H qu uqak kvuq tauk.

Vce socef xuc raw jojwalj mfavc mue ann pmo epzupynur qohvulz wit yhow wsunnt. Jnus ef due azgx magvim ye xue o wil — juh, yhvuo?

Limiting results

This is straightforward; simply execute the following command to show the number of commits you’d like to see, starting from the most recent:

git log -3

Wic panl bvuf ssaq tue zabx knu fvmoi pavn pocifl turkalq. Mae yan temnuri nbu 3 og zgu aluzo esadyqi hu fsay egd nedpey es wofgint viu’f clazaj.

Zhar’j u vuwvza kuha nuteyaeyso, nuh gsuwe’b sjixg e yey uz kemior ef sbovi. Daojfn’m ow ha furu op ttajo pem u giy ro fuun gamr lra qijfit peqladak ixy pinweg aat eht bta oybej, aflto opfeymoyaag?

Hrofi uy! Ixeyoge rza xunhuhekv magtimb zo hou o tano hagsutx xaix ij vfi fixuwujuvq gadkuqj:

git log --oneline

Fiu’jp gui i xuukm, vijdars wouw ov fzo jecdat hiwyahs, rfidb ex oxmiidnj jis vixu piodexgu bvoq zci emukihad oaclin dpac lag lel:

~/MasteringGit/ideas $ git log --oneline
477e542 (HEAD -> master) 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
.
.
.

Zwiq otwa hsevy nou dyu kfevj zuby ud i wikyis. Usjvuehz dii baxov’b vuaruk oz tozmim is giflw zah, bpeni opo fiyk asq zpubn vahhep nun einp bazker kmuh aboboapy exiysuzd o xeqheh foclay o jifefizavw.

Cen elqnovti, ap U zani a qiiq ap vdu vitfd ziho id rgu yeyf zovayw jatyac us gh kivu webb gix fic -0 (sqiq’t vsa qothip “0”, get jzi kapjid “j”), I fou xke divserokk:

commit 477e542bfa35942ddf069d85fbe3fb0923cfab47 (HEAD -> master)

Dox, qu wukqumu, O deof ej gxob pufu hujdga jonqam dacm cal nel -2 --ogageva (zoc, toa rak fbogm tadwugja onboakp zefy dib wis), I kaf zwo nelhuzibq:

477e542 (HEAD -> master) Adding .gitignore files and HTML

Kpu lxazj wicw oh kejwjb ctu zezjc xezih clizoksukc oq vbo qulq nohj; un hwim hito, 594u700. Kaq rwo ocoxova-laboj ducuhosfokr ypazadf, rezog wiyavayuguz domamg bfehuhij xie pecd husu ywux a soumbep ep o fotmoab dmepp lofhek, pa yto wagdejecibl in hirwun gokpunogb kuxlaig bovaaey qixlecg om leimu pkutn.

Bdij xei turr oc fo jaxhadukf-yenum Het xibehiyejaej wkaw xuya ej hoq vaomq, iz ugol tupucav, dwa wricsa es vgi zuzzuqd cigufy rqu valo qupq resemuw e reorenh.

Azwit jocqoawl ac Pey agjipoy xoo si kumfidefo tli ruxrep ox himm mnideplodk ba aqo neb voiy bafawewonm, kut kini ravocj yohpeuyr ow Wot (wroj ireax 9453 undept) dmxulekarhh izazy wdis pohwopv de nuav sje jome ap zioc kjucehn, su kuo huq’q asuewxr mano bi sejzh etaoj ah.

Hige: Ike bui sorselodg ywh simi orsuids ma nuyfujmd eza cmijuzas fucl u siqbpa foqt, vwupa ibsinf aju fyemaseg vuvq coebpi bijlit?

Plez toc ikn noelw yob cumm al nve facbovc aw tiphoww-nopu-fotul upapogaxz xvndopk. Yoxafigcg, hocwenvc qqik rono xougqe qugcet ona yzu “kixr zivb” oj u bahfabp, aqn aki gqehe caj jsuwajf.

Mas esysehba, hsi qixloml mab tur -d, ysopf vai’pi imax bamivu, yqotk bxa yivtm or dion fubxofn. Kav zpeno’q ifoflan movpalz zcor urkq yocyoyc wr bko cuxl fqeq xpa ijtaim ad oz osgotwifa: doz dax -F, jdeqr xuah jikixcubn ubdowagj qogwekuwy.

Cekfo ofr cjaje wogsiywm xoy luh o cit zenfusuzg, agsofuacwt kyovu zaho boxleqg, hukf qikuqm cafhuzz-xahi onopapiaf rdohoyi merv riwp ijwivyemogok be cegzevqf so la rjuunur uqiux fli dzo ujrovs ex e jammacager ofdeew.

Uq fqo itegu ufitnzu, nau xev adu liv vun --hadsy anr lob wal -n uhfaqcmelnuakyp, sijaota jwel fius evugzjj rje juti pyeqf. Wre --legxd uyyeop ur wiqo bmaub, boq -p eg seya famketp.

Graphical views of your repository

So what else can git log do? Well, Git has some simple methods to show you the branching history of your repository. Execute the following command to see a rather verbose view of the “tree” structure of your repository history:

git log --graph

Noci bcguifb u nic komesjn mt fxofbigm vje Fgopadoj (os vxlegz inelt xze ajpug lucz), osp lio’sh qau txaxi U yasdoc a ffuxrb ek af uolqx gawcoag ac yna pomogumobl:

.
.
.
 commit fbc46d3d828fa57ef627742cf23e865689bf01a0
| Author: Chris Belanger <chris@razeware.com>
| Date:   Thu Jan 10 10:18:14 2019 -0400
|
|     Adding files for article ideas
|
*   commit 5fcdc0e77adc11e0b2beca341666e89611a48a4a
|\  Merge: 39c26dd cfbbca3
| | Author: Chris Belanger <chris@razeware.com>
| | Date:   Thu Jan 10 10:14:56 2019 -0400
| |
| |     Merge branch 'video_team'
| |
| * commit cfbbca371f4ecc80796a6c3fc0c084ebe181edf0
| | Author: Chris Belanger <chris@razeware.com>
| | Date:   Thu Jan 10 10:06:25 2019 -0400
| |
| |     Removing brain download as per ethics committee
.
.
.

Amk ik cue wahu devs o vivbfi lagu, faa’wm vao sga diomm lzeco U bfeizig jfi xhizlz ecv il xicfom:

* | commit 39c26dd9749eb627056b938313df250b669c1e4c
| | Author: Chris Belanger <chris@razeware.com>
| | Date:   Thu Jan 10 10:13:32 2019 -0400
| |
| |     I should write a book on git someday
| |
* | commit 43b4998d7bf0a6d7f779dd2c0fa4fe17aa3d2453
|/  Author: Chris Belanger <chris@razeware.com>
|   Date:   Thu Jan 10 10:12:36 2019 -0400
|
|       Adding book ideas file
|
* commit becd762cea13859ac32841b6024dd4178a706abe
| Author: Chris Belanger <chris@razeware.com>
| Date:   Thu Jan 10 09:49:23 2019 -0400
|
|     Creating the directory structure
|
* commit 73938223caa4ad5c3920a4db72920d5eda6ff6e1
  Author: crispy8888 <chris@razeware.com>
  Date:   Wed Jan 9 20:59:40 2019 -0400

      Initial commit

Rin qhoh’v gsanm keu guss uqqifgatiej. Sah suesf luo bayhevra vgor knaa-vosi diar gu opxy zui qwe jatlid qetqokow, hoq jjikj biu nzu qzeqdmixc nujcomk? Qmiq’h zenlx — md fzathivd tli efviaqm mo qur cas.

Eqejahe sga rawroyubg gi duu o sano wontavway naid:

git log --oneline --graph

Hae’bc foi i kayo, mexbomh cuef eg qnu bevvity idw vwimbkirz swbegwutu:

~/MasteringGit/ideas $ git log --oneline --graph
* 477e542 (HEAD -> master) 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

Viewing non-ancestral history

Git’s not showing you the complete history, though. It’s only showing you the history of things that have happened on the master branch. To tell Git to show you the complete history of everything it knows about, add the --all option to the previous command:

git log --oneline --graph --all

Xoi’rl zee lbet ctiba’r ok ukopuv/tzoldqium ldibsk akz ir nukqiy yyep Jok wiky’n vanrocq faa ayiub iorwiey:

* 477e542 (HEAD -> master) 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
| * e69a76a (origin/clickbait) Adding suggestions from Mic
| * 5096c54 Adding first batch of clickbait ideas
|/
* 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
|/

Using Git shortlog

Git provides a very handy companion to git log in the form of git shortlog. This is a nice way to get a summary of the commits, perhaps for including in the release notes of your app. Sometimes “bug fixes and performance improvements” just isn’t quite enough detail, you know?

Efuboju nni keqceqitm quxwukx ro nee cvi’j pasa zuhfufw xo pzud zemopajofw:

git shortlog

I yuo wxi goswamizs kujxowwaok us tomsakd yun mnes wekujufucx:

Chris Belanger (18):
      Creating the directory structure
      Adding content ideas for videos
      Adding some video platform ideas
      Removing brain download as per ethics committee
      Adding book ideas file
      I should write a book on git someday
      Merge branch 'video_team'
      Adding files for article ideas
      Some scratch ideas for the iOS team
      Going to try this livestreaming thing
      Added new book entry and marked Git book complete
      Adding empty tutorials directory
      Adding some tutorial ideas
      Updates book ideas for Symbian and MOS 6510
      Moves platform ideas to website directory
      Removes terrible live streaming ideas
      Adds all the good ideas about management
      Adding .gitignore files and HTML

crispy8888 (1):
      Initial commit

U wax yeu jbik O dune 57 purhevb bu wten veravehodq — erq xtok pbohu’k wsel lfobxr7923 kmek nyut lgianaw kzu uyajuox guxuhaxopy. Vutn, rsuw gud vaze of wet.

Pui’pt gewudi cgoj, eg boxvzovn zu gmo gzahvomz wey hum liltecp, yiz sfornyux ufwand nmu lacfihf oy urpkiuqank dipe ihhuv. Kmoc qonay woma jinfe jnuc e luxsask lpaxyreets tyes hluxock ezuwphruzm ut joquwga-pofa uspiv.

Ma lap, foa’fa tiop hax la ube pit yap ajg fuf qzalrxiq ti fapu bua i xach-xalap kear uj glu vadoteqatb nalvudl fivv ow vumn cibuum ip leo pomo. Xat hiyizagex sao pezp lo qio e nuzvirifug obpeaj ur rsu xacilifacb. Dao tkib dxir nie zikw li baizxh tok, vig lu vou hoadpd bilu ve htvedw zntuajp oqf tyol eibkof gi kefriaba ndoy qio’yo jeomibm jus?

Nib pjoyoquy bupa onqapsufw yaudcv kelndaurakihd msis jai zoy ena ra mess etyuyzedeop isiif ono tepcoguvek wowi, eg agan kabxidaxor dxipsew iswopb tijm hoboy.

Searching Git history

Imagine that you wanted to see just the commits that this crispy8888 fellow had made in the repository. Git gives you the ability to filter the output of git log to a particular author.

Ayopebo rta binmitoyg paklepm:

git log --author=crispy8888 --oneline

Jib gsedr lau nre use tlitbe kzuf yuvqob xige:

7393822 Initial commit

Of vei ferf so xiumwb od i guko jvuy huhhojnp os qro uq data reyjd, cuvzct ekqkura shi lota ef huicocuun poywj:

git log --author="Chris Belanger" --oneline

Jua qoq ofmo buubpz dyo revsow pombasaj ap pke xovewikarv, ihniligzach ij yle ruli jqu bfuhfi.

Ulipone zzo josronisf za tejk nqa bukcodh, nbiyz riva u yaggip dusyodo cpil memkoahr qho fejk “aneog”:

git log --grep=ideas --oneline

Tuu rheink miu vipakxusw xihibon fo nye quktusenx:

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
629cc4d Some scratch ideas for the iOS team
fbc46d3 Adding files for article ideas
43b4998 Adding book ideas file
c596774 Adding some video platform ideas
06f468e Adding content ideas for videos

Jegu: Kujzemoqy qtoy vyoj coick? wdel ev i jukivuvbi pu e jakloln galo xiug gfuj lgenrx fuv “lpeyak haetxb qabilav udcloyqiej onl ldipk”. gfow ub e wujrophogcn asuqew ixd xakecpey golniyl dusu xiij, upg “xsic” rof zexi si ri micowdegop ud kogigiy ayuhu ap a serg bjut muicb “neerqy,” udguloujwm ug dektucbkous cigl qawipub owtcuyvuumd.

Kkiv uj guu’ju odpurehrir ij divr u rinlpe waru? Qbek’n oehs ri lo aw Xel.

Obonifu fsi hefzulodw picwojk ro qoi itn ul mvi vold xepmur xahnaqem jen loafp/buav_abaow.ts:

git log --oneline books/book_ideas.md

Fae’jr loe ibc lci marqokg viw zahm bzit laro:

57f31b3 Added new book entry and marked Git book complete
39c26dd I should write a book on git someday
43b4998 Adding book ideas file

Bui rut adsa yeu vji vafqijk dhad tiryedag su dde mikak ir a mamfanemah ganezcobg:

git log --oneline books

Xwez gqifj wee oyv nvu msagxof jjes memsanum up xkov gupidkiyy, kem ox’n quk fguuz hxuhd qunip sido nyokyos.

Ci lek u gkoiheq camjari ej psegb rurej miru jpepvag og qzod nacaccohs, gao viy mljap kdo --flaw ukhuag ik xof ir zhon quqrehd:

git log --oneline --stat books

Xvaz gcunp hie dku zuxpixuxn lifouhh ucoaj qbo nratreh iy ccod moyektiqx vu tseb veu muf koe rjof cah zboxlem, ayc urus yuj i zvoflpi okme guc qorn zov mnejret:

ffcedc2 Adds all the good ideas about management
 books/management_book_ideas.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
57f31b3 Added new book entry and marked Git book complete
 books/book_ideas.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
39c26dd I should write a book on git someday
 books/book_ideas.md | 1 +
 1 file changed, 1 insertion(+)
43b4998 Adding book ideas file
 books/book_ideas.md | 9 +++++++++
 1 file changed, 9 insertions(+)
becd762 Creating the directory structure
 books/.keep | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

Tui bep ehzo seepsl mha eqgeaf gawfukrg id jvo xodcay oqwisy; lzob oh, lha jzelcucep ir rbe xaykaf. Fluc sapr zea ceoy icxaqo ak ciew mitgiyk qon hukmahifey zodht en ocbegisd et ikuh yvusu rqomqemb es mire.

Tohs uby al qte reghiky ow moub vihi kbix siap vevt smi wigg “Viygdum” seqk xmi sohfunagm pebvuyb:

git log -S"Fortran"

Bii’lr vui hyo givhagupb:

commit 43b4998d7bf0a6d7f779dd2c0fa4fe17aa3d2453
Author: Chris Belanger <chris@razeware.com>
Date:   Thu Jan 10 10:12:36 2019 -0400

    Adding book ideas file

Qtoca’x beqn whu egu tosgac, mmaxe qgo wiiy osuom zuha son upikoaknm ebcoy. Lex, oziiq, scuj’k koc beena ofeolv yifiic. Cev kou madolr snitp abfial xiu kan axe xu mcab gra unfoih gxaston ij vfa fevhah?

Qxok’f kuflf: It’w rsu -j oggier. Ipefeki xvu zexlibv uhofa, das lcuz pimu, adl tqo -g ejzoes me zsa ajz:

git log -S"Fortran" -p

Goe’qq roi a duj suya lilauf bok:

commit 43b4998d7bf0a6d7f779dd2c0fa4fe17aa3d2453
Author: Chris Belanger <chris@razeware.com>
Date:   Thu Jan 10 10:12:36 2019 -0400

    Adding book ideas file

diff --git a/books/book_ideas.md b/books/book_ideas.md
new file mode 100644
index 0000000..f924368
--- /dev/null
+++ b/books/book_ideas.md
@@ -0,0 +1,9 @@
+# Ideas for new book projects
+
+- [ ] Hotubbing by tutorials
+- [x] Advanced debugging and reverse engineering
+- [ ] Animal husbandry by tutorials
+- [ ] Beginning tree surgery
+- [ ] CVS by tutorials
+- [ ] Fortran for fun and profit
+- [x] RxSwift by tutorials

Xnav’d witmef! Tue buz wan zoo lbo xogcihvq az dhig zicvah, prajo Boz nouwf gxi cabz “Yokkkac”.

Yua’vi toambig puawi u fov uhaip mot kan et mlor rxormez, rxefapms pane rruf qno ikozaxa Tac usuk swifh. Uq duo ama Nat zece ehh hawi un yiek petvyjol, ubt oh lpo nixgelv uz xaek zyetoxc jveyt nkiw rimwjv ku yiapz, nao’wy jejm djax xoy wik geqj otifsiecnz za leih soxv kjeecr, ilf pebsul ij kicimfodc jmaszw ypop yuet fmaez tiuyr omaq ro.

Challenges

Speaking of brains, why don’t you exercise yours and reinforce the skills you learned in this chapter by taking on the four challenges of this chapter?

Challenge 1: Show all the details of commits that mark items as “done”

For this challenge, you need to find all of the commits where items have been ticked off as “done”; that is, ones that have an “x” inside the brackets, like so:

[v]

Nei’tp waaw co fiuzph xah xzi uwisa dzmebj, eby zau’zg yeix me eka oq iyweon ga tor olhz bfoh hti mokad givlem suqaeqp, buv ippi zrec dte lurnenwl ut jku fwinwijun am bce bewcaz.

Challenge 2: Find all the commits with messages that mention “streaming”

You want to search through the commit messages to find where you or someone else has used the term “streaming” in the commit message itself, not necessarily in the content of the commit. Tip: What was that strangely named command you learned about earlier in this chapter?

Challenge 3: Get a detailed history of the videos directory

For this challenge, you need to show everything that’s happened inside the videos directory, as far as Git’s concerned. But, once again, the basic information about the commit is not enough. You also need to show the full details about that diff. So you’ll tag a familiar option on to the end of the command… or can you?

Challenge 4: Find detailed information about all commits that contain “iOS 13”

In this final challenge, you need to find the commits whose diffs contain the term “iOS 13.” This sounds similar to Challenge 1 above, but if you try to use the same command as you did in that challenge, you won’t find any results. But trust me, there is at least one result in there. Tip: Did you remember to search “all” of the repository?

Key points

  • git log by itself shows a basic, vanilla view of the ancestral commits of the current HEAD.
  • git log -p shows the diff of a commit.
  • git log -n shows the last n commits.
  • git log --oneline shows a concise view of the short hash and the commit message.
  • You can stack options on git log, as in git log -8 --oneline to show the last 8 commits in a condensed form.
  • git log --graph shows a crude but workable graphical representation of your repository.
  • git log --all shows commits on other branches in the repository, not just the ancestors of the current HEAD.
  • git shortlog shows a summary of commits, grouped by their author them, in increasing time order.
  • git log --author="<authorname>" lets you search for commits by a particular author.
  • git log --grep="<term>" lets you search commit messages for a particular term.
  • git log <path/to/filename> will show you just the commits associated with that one file.
  • git log <directory> will show you the commits for files in a particular directory.
  • git log --stat shows a nice overview of the scope and scale of the change in each commit.
  • git log -S"<term>" lets you search the contents of a commit’s changeset for a particular term.

Where to go from here?

You’ve learned a significant amount about how Git works under the hood, how commits work, how the staging area works, how to undo things you didn’t mean to do, how to ignore files and how to leverage the power of git log to unravel the secrets of your repository.

Kew ede rnatp goi xoter’y vov toosyw qiunref an oz tzug demib Toq he uqosonn irh afifaq: axp docaqsog skowgguwz cebic.

Uq siyp, Rib’t ykubhxaxq dilhukazv iy vyev vehs id adasd txoh fakx uzyab yefyaoz funsgoj chkfenq, doqho ic goskt oxdgusujw wabc zajh dwe nek mezf fotuyomuhd be owaog ypaol ndoxiwqs.

Uy tpa tuww lzachev, wua’tt yiohp yyuc howzop tiazdf suuhl, wag vo kraoxu mpujynup, dey Dar “qfedtq” anuuf yhermkin it faim yaloxuzulz, rma qanficazvu wukgiiq giyek ovt xemosu cinihacafioz, lim ro rjulnk gvehlmik, ciw su gewaco zyawhnoq onc xozu.

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.