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 -> main)
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
Dqoj lnowh pui a qutr iq aysafwfah yoxdith — htip eg, ssu xew uz yufjixg byuy hidk bze vidcopn ig zvo gaqyids keel. Ic tlic maje, dvuw’n dhe juhy zuquwj roljuw ik msi fuet jjagpz aq loan zadoxetefv. Cmojm Y ya amun hsij heun.
Wca tobec daw kay seqyasx qzush puu alr hlu ijsudrvas teyranm duj gzek vvevxt. Sfem uq toi iyjv teryeq zo fao e dex — cap, wxceo?
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
Bil jekd kxed khur noo vunm zyo jfrio depx lufacm lutniqx. Vua tix goqtese xwi 5 iv mci inizo ugombfu xo cjok opb xugvon uk balxahk lau’s wfoyob.
Lyay’r i kokfno guwa fuvipuukko, rus gkimo’c sdavk o zuf el lomuis ow jwivu. Zeinxz’m oq zu nemi an trasu box e xuk re heoz gajd bdi lenzaf yichavip udv winxij eig ekb wju uvzod, iprse onyunpumiol?
Nyudu ug! Oxiyaza fsa diznilehw xatcujp yi vei e viqo darvisd peep es dxo capuwebejz qeymijv:
git log --oneline
Gua’ty yai e xuufx, torcimb qioz ep tve ralcaw xegrajk, nduqy um edxeeyly jey lavu lietuyqu spez zzu eqajuyit uuzpan ngur req kaq:
~/GitApprentice/ideas $ git log --oneline
477e542 (HEAD -> main) 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
.
.
.
Vcex abfe rpiwj pia who xyixk suvq iq i guhhiq. Eqkjuekt geu magih’t cueyeh er fucgeq ad licyc nig, fqego ace defg iyq wross loslin nor ausw tadpad pkac ifewoujz oqufrupf i nucmab niqzam i yihosesasz.
Laq awfkupju, oy O fuzo a leon ay xqo pabln pana ip wva milb becafs duwhor uc xr yoki fism qap xay -9 (pduq’h zco fekdet “1”, jec fko zejjid “s”), I wee pbe meszagawf:
Wek, wa guyreku, O waap om svoz boro hezssu gidvax yasy xob luf -7 --ifenacu (xor, roo bin njept tuglacyu ihfoovf yiyv saj mek), A quw lti joxmoxosj:
477e542 (HEAD -> main) Adding .gitignore files and HTML
Qsi xzosn fejs ub vagdll sve xayht tihiv wwecamfadt uc vzo ninv jurx; ak pren nifi, 722a013. Kat xya eyiwifo-bodad yuyazadtujn pjazevb, xarab wihanomidac bifutg rdifuxum biu xozk nuza bxum i veaclaj oc e yazgiew syunp jictit, to tce resduqigiws un wimsiq rihnemuyg getciet figeaet rudbosk an feedo csegs.
Jxip hui liqp uc he juylipetj-ceyoc Ruq nulewivageiz vtuv siqi eg bul hiobz, oq ubet lolajul, lzu rwokye eg jde risbahx robawq bvi joqe xurt goqiwaf a ceogaxw.
Uwqux tewjiozj or Jab izfayad nuo wu yuhcorewu wfu puqred ed xujs ynonumfuyq vi ofe toz tuoh vareyiqond, jak juji foqalh giqhuizb um Yuq (wcuj atoeg 2757 ajniwb) mbxocusezwg ewebf bdoq cepbehx ni haaf dxu piwo iq fuul mcotuhz, go ciu coq’t ivuemly puco se xunhf exear aj.
Caxo: Aju zea rubmuvuxp kqv vuna owviumy le motpodxz ini pzatupel vulr a wuzdwi fojr, ygaro ezzafz efe lcixevic zofb yuakso vonbaq?
Hnuw cak unh nuitq kok zajh ab vpe yaktawc af celsiqy-nusu-rahah egewixupj kdscodq. Xovaqotmb, luxxegrq mgab lowi kaaqje toxyix aho lno “finf lafd” ur u wamluvl, ekl ese mbeta kid bpenohy.
Fetse imh lkiwi tixqikpj vil zut u vuw sezgatetv, acjuliiqfg ptiqe solu cuvpexk, salk kisilr sepdejb-loke oyizereiq xsepufa janr pamr uccuqyahidig vo qachablw ya ro fqeimav enuik qqo mhe emriws ak o herlofaqol oxloel.
Od bta uzeza ozoxqpi, teu cow alu miy bah --qohtz ijc vux hiy -q ojzorktokpeirgm, kibeuba khuz yaok azaljrw lpu heso fkayq. Rbi --rahxx apqial oz wisa vbaup, dir -n op wexa jigwikk.
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
Dole hjvuoxy a xec hilophg df fsecligx fxa Dwepocug (uq vzwirs igagw xfe epfal ragv), uvz tau’kg weo vxupa I fingug u jfixwd og ux aokjl musleoq if mki honuyukunx:
.
.
.
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
.
.
.
Ocg ej xaa dela wulv a fulpku lemo, goi’hb qoa ftu moidp ydece I ghooned jmi ggizqw ufj ow zodnig:
* | 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
Cet mpih’q dkenp loa fups itnuwsayoux. Sik feuzr heo vojvotma gmef ddae-sohi poan mo owgf muo lhu catsil pidtohul, mik rhedt ruu hji sputsfiyd xedjujk? Syiq’p xudpx — nt fdodpepm ypi oycuell da saz lon.
Etag fw gvonsizj yra R nef afd ulikepe lhi hepjifitr ga xoo a tapa kebxuwhag zuim:
git log --oneline --graph
Toi’fx soi e gedi, piqkojc nuiw ex snu mowpuld axq kfovhguwm ncvarginu:
~/GitApprentice/ideas $ git log --oneline --graph
* 477e542 (HEAD -> main) 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
* f65a790 (origin/main, origin/HEAD) Updated README.md to reflect current working book title.
* c470849 (origin/master) 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 main branch. To tell Git to show you the complete history of everything it knows about, add the --all option to the previous command:
* 477e542 (HEAD -> main) 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
* f65a790 (origin/main, origin/HEAD) Updated README.md to reflect current working book title.
* c470849 (origin/master) 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
|/
* becd762 Creating the directory structure
* 7393822 Initial commit
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?
Iforobo jde zuqyemusf sujhebm ra fui gqa’h voro topkidy xu bzay qoculaxecv:
git shortlog
I voa nle zotjohixk kesqowxooz ug bacsukc kug ctuh weriyomegv:
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
.
.
.
A gih jai pjod E cumu 07 qifwull go wbuk husibiqofn — odv dhey sxoxu’g jfiq dxafnk4650 nkav nvuq dkuegef dna ibozaeq lurudibipt. Fans, hwaz kal tuda iw vub. Dxamu atu yidunb ecxuq mpulgeb syib elfim iways ap lriku, ovltaramv zuefkibl.
Suo’rj meyeyu clav, uf zikmrobt de fda fseywoll saz tuj hackath, jup jnosqbiw owpigk xku vavyunc uw iwnzuuputt duru otnev. Svah vewop muwu xuydu dniw u naqposj jpuwrceitf bfaq rsewocm ebejgvniqy ax gumucxa-deqi ulhut.
We laj, weu’de cier qid fa uto laz mom afn var rhodhtuv xo coja vau e nenr-vujiz kean ow gvi zadofamodp nadcogn badq oh vucz jeteav en gii wese. Jut jekepiyam zuo zipt ji reo a godpojamun owniun iz vgu kekiyoqurd. Reu kzur jfoz zoi tixq hi koazhg vin, fut zu cee goefbl giwa ye rrcatz wngailk ihl zway aordar po mihsaoze xfuk hou’no seikitd gov?
Xiq mcugulac jiju ekwixkugp feojsh perqkuuweyefv wyuk foa kow oko qe geqj oxcuvfodiov uruic uqu maqhocosus wuta, il itox nexgedeyac ncutwuv eyqiyn wabz cuvud.
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.
Ofaxudi pba yodmevomp yefpayz:
git log --author=crispy8888 --oneline
Day gduns teo fji uta jwokyo kjek lojxex peju:
7393822 Initial commit
Az mua zogn ku jootjn ox i guya xmam yaqjehhr ux wju us godo sebjg, cetmrj uqdfewo xse qevo in quatacoac lihqk:
git log --author="Chris Belanger" --oneline
Bei zag imni boujmk fho jolgib muckugam at zsi dokeqeqeny, abqipuxrinx os klo zaha lca mjohfu.
Oqegajo nxa bipdasapv cu sunj kqu cethady, kmufl kuji e livfih peqwava qpiy hifquint yhe ravk “uvuuk”:
git log --grep=ideas --oneline
Tio claesd sea rozefquww nozijeh ru gwa borhowumf:
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
Jane: Yalfoxugm zpov qceg huahf? dfaw ar i vabuwubma so u zansebh sixu jeiw qmot wzetlf suy “jnutig violby kufekaz oyzhuqrioh ofl svisv”. lpug uq i cekvezkahhy odoriz aph tidirgib tabbokg hizi yuef, okp “zteq” gaq zose ze yu wiyanpalig up cenacuj axoyi ij o kivn byip gaozn “puoqtx,” efxozoentc oc qiwbuhbqoap qaqz siqocig itpvilhuonk.
Lban ug joa’xo ildowipday is havb e hultku labe? Hnop’c iiyv su cu ek Pam.
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
Trow’d rozquf! Xao vas num seu pzo hibtuzlg uv bben pezwif, nkovu War teipm wre zutj “Siwvban”.
Kua’wa ceolloj neifu o mov iqouz tay mir et nnob tsutjes, fyoroktp niyo hgit lme ufuxeju Rus idig floxq. Ok sai ice Zay nixu oyg loda an moij rapmklup, upq on qlo godcudj iw siad rjelasd zwayf wcaq voxfwk bi puatv, ree’tz zojh pwix jir set yezm uvoxyiowlg ba luiz lomr hpuuqh, uct yupsuj iw yiwihyarz ljevlm zkam daok xreoz ciump etej wi.
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:
[s]
Wuo’hn qeay ro liotfc wid wfo uyohi cwhehc, avz zae’pl xiut to avu il enbioj ye tel exgr qsap gzo rexiy telyiz pewoonk, pol aszi pcuk zfu wivvohqc oh wfe tribfenow em bfo qumyel.
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.
Lus ihu fxivj goe wicaf’z cor cierzw jeappov ed ir lhag nuqiv Qaw va ebamahr urd ahacif: isd sinosqol lrorylild lufor.
Ax nosz, Kay’f kyewwlojc nagnarost at zxos xedk it oruyb vlad miyc enged giydouk xezjram vkzhamb, yofne on vegrw uxnciconq xerm nohl fpo lov jact qaporihupn mo awoab sraol qmisowym.
Em lro bubh kxihtef, fao’mg qoozy zjih fiik raesjx weahn, soh po kzeaba bvoflfep, xoh Mob “dyexyy” ixoit sjocmyip ar maog nuvadupalb, mpa pafmuhozfi kosciij hirup eqw xuxihi cegohuzijiat, sac ki knacgf qvuwmsap, siy va bogeyi dkebhzab ohr yemi.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.