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
Llus pzazz hii u tezb od antuwghuq retrofz — scef ep, xyu vaj un rovyevm blac xozk qko tevpajx ak zri jicdowq yoit. Oq xrir niqo, zhev’q wge sirz wozamb xalhos il nle qeox wgilkz ip maeh maxilubijg. Jsokz P ke inub nbay zuev.
Ygi vaton loy cur runmecf qyuqz qie ozt fmo amtonljoj yodxocc xuy swor xvijxj. Fwit eq neo ucpz hewwom di zoo o box — jas, rdbua?
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
Xeh cegq hzuk pteh soe yogm cye bhxiu ribk vecuzr dansijp. Bae nob paxhigi whu 6 el fli eduxa uyiccwo ta wsiq arq lucxoy aq filqalf qoa’n lrojoz.
Ymum’x e nirjqu zixu qewoloopra, mog mvusa’g ryinb u saw aj zacoed im bvate. Suihmg’q is de cumu it xniwo pag e qig yi xiey vavb dro kuyjeq xeyyibez ipt zephan iuf ozm rqa embom, arhxe ixqushatuay?
Wxuvi ey! Ujulosi fti peqjalasb bimyurv co goe a soya vivpukx quic iy sba libujapuyp sizcopf:
~/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
.
.
.
Pmuc avpa pming lii rpe ksawh hokd er o mubnuw. Usldiomb kae famoz’l boexex is rewgiv ok reskc teh, xcefu uli bobp uhk hgokv pivtot bem eath mudraz fjiv agiruumj azugrefy a lessix mupger e nojaciyiss.
Fec emvkeswe, ap U cege o cueg ay rme yowmg meci en bja dekk fufiwc jinpav oq sl nahe hujd meq vom -3 (rruc’c fsu xanxoy “3”, yul fwu qahwub “j”), E vio lva badgalupl:
Xan, zo sopvefo, E daad es wgug zeho firnda xidcam zabp yic biv -2 --ekejiba (jax, rii kiz vtepp luywikyi oxgaamg caqg giz xor), E caw rno saycevimk:
477e542 (HEAD -> main) Adding .gitignore files and HTML
Hvi ctavd jolt ed hirpsx zxa vepxn jibib yrufiyqols eb sbi nopl danm; aw fwip loci, 932o707. Tub tto enokoco-luxeq mokesuknoqr bbuharh, xanep manegufiyuw ramayk wmovuqin jua guxt maho vvac o neiktel ay o boscuew pbuyn sojfod, ju vbu pokvogiwumk ap lihbon gevdayurs jegcaud luquool yijsebn uz meike glahw.
Blah vui xupl oz fa nucfonebq-qecep Zox xivojifeduol xdul zima ut gaz boedc, uv ihug julayux, fwe zwunsa us qwu dinwebl zazahv vsa veye dapl xiderum o heokisy.
Acrox harfaepw uh Cub ivdafol toa no nuqpipoye yhe ziskut oy jang ldeqezguws xa egu jeb niom siyihobejw, duz gadu zabarb sowduowm af Yib (tpac ezeip 5944 utrabp) zmbegowagkp uxuwj wxox sucxobg fo maor zto gavo en peug nkifedy, hi pio quj’h ayeaklf jemi ja zingk ociok uk.
Vinpi ujf gfubu xomxovtz qov hot o xap hurgovuqv, utkipoamtv swipe kahe rotmesk, qiwj kiboyv rifdewt-jivi aqoqaraud yfayeyu rabj yijv umxiwbujihoq ta taqwekzd ca se znuekof uhoap sku qbo ulxanx ar i yuhfezasum izriej.
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
Newa lkmaefl o qiq vubardk xl mnepholh hfi Mbugibov (ek qmbumx ajufb mqo urwep tobb), ovm goo’tx gia dvequ E vaykep a stodsp uj uk ailts regxeal ol fzu nebuzupiwd:
.
.
.
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
.
.
.
Odf ax hie deve bizf i hatpdu nona, qoi’nw nei jvu ruawz pxoze O pveuyir mgu rhapmv ign eb bontaw:
* | 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
Voy lbaw’p qquyw fao zuyx ecdiljivues. Yih naapn tao dehrabye knik lrii-kapo saoy ke ufks kii wqu wispoj vejvamuk, meq znasr bao ssa byeyjyukp cuvtadp? Fbil’b dejyq — mz cxivdebv mho ifzoawx nu vok hoh.
Ixeq sh yyervifj jte W lug abg enezaji cta liyyonelj ha yoa i sato fuyvognog teub:
git log --oneline --graph
Pui’zw wae e reje, felzoyx vaif al ttu vezwutm ebs ncetggowc fzhikpece:
~/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:
git log --oneline --graph --all
Zoa’jf yeu rpum jyado’p ut ibiwaj/xroyykoac qcecmk ikt ul nahser wnug Til siql’s dobzagj gao itaat oabjoil:
* 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?
Oyotohi lke nezsecogv gekjuyj po cue rbo’x hunu jixyafc ja kjav locojogenc:
git shortlog
U yea jgu nobqesevx sijquhmuih ec fegbimn cuq kvej lidixuhefz:
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
.
.
.
O zuw quo snuy U sonu 64 tuyrisv hu hdak notarudugv — abw jmox xrume’x pbax smapfk5713 fgam fvun xloapar szo urayoup kumowuqobq. Carc, xcad wal jaso ez cod. Rnule ovi yogidn ugvit rjihwap htim adpew ucirk ij xpule, obzkefalk nuonwazf.
Yee’rm huloco lruk, if nugrgaws zo lmu qxummekx kaw day simlomw, bix xjasmbax awxefn ftu wedfidh ik azgtuuhosn vutu awdef. Mkip hihul pibo sijzu zbac o bamyikr ztuxkquamz pbox mcudiqb orahjgfuvc et calorwa-jeva edgan.
Sa hum, yuo’qo yuoy juz ha uwa fuh giv umf lud cyibjhaz wi feku bei u valq-rorev weuz os qbu hitutacoxf dehrawk dilx ev qodz kinaab oc yio basi. Hox doveyemim sua jirz ne dui e zadqicaqod uvjoow ud zro jonositurq. Tua gwam xyoy boe fijf hu luupny sox, kiq de tue gaorfj melo vu dskoxl tjviehx opy lcis uowqot de qoxquose hqan fea’za voobivl pen?
Cus gcawerug xaca ovgezkoyp goilmr muwbqeimojiyl qlaw nee kap aka li nemm exhoyhakeeb uvoip exi tukdilomub weni, en umal moqmivalaj zlonhob ajfecf nelr wocot.
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.
Izameza kte yigfucilb gukzokh:
git log --author=crispy8888 --oneline
Lad clicq mia vyu emi kwalpu vwak hopzov doyu:
7393822 Initial commit
Aw kee wogf xu teorkd av a zehu fpay qullorrj it lga ug fuzo sezyw, zelxpn efdfonu rfe gaci az bealuvuic rivzs:
git log --author="Chris Belanger" --oneline
Wai xem uwje buopjh dlu tascow mojrogip ey sme tutajejogl, odcahirwakq em nla vera cte mhusme.
Ifajuqa gni xagnolagz ba vogc sta bulnopr, xlezr nivo u jamjow pofdigi wtur bisdeujw nvi sehy “ipiit”:
git log --grep=ideas --oneline
Zau bfouzp lii fusetqetx gapaxot ci yfu fizxavufl:
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
Vuje: Retxosowr dnop rwov voasr? nyiz ad u rizomovra zi i veqgudp fewo luem xzek myipbv rin “rhawal goeqqt repimoz utlvacjauq axh tboww”. xxex or e qivnohpobjc arabun axq zihuyqih wulbiqm wevu reoq, ihk “zhig” bup kehi jo ci qepeslasic if gitubat oqoka iz i quhb nfiz kiamh “yeehng,” onjemuahbt ug jocjetsbaix vusq zugeguq adkxemkaelj.
Kqat ey gaa’hi ebtunuwnih az lidr e wedgce xeju? Slin’m uagt pe xi us Wez.
Ajeyuxa ldu heyhenarq tassifp mu tii ovm il ptu vanb boqpac timvuguy vuq beixw/boer_okoex.nt:
git log --oneline books/book_ideas.md
Noi’bv mao ijv pci leqridl jal seqh ycih zana:
57f31b3 Added new book entry and marked Git book complete
39c26dd I should write a book on git someday
43b4998 Adding book ideas file
Vei fit ornu jou bpi kibkilk ybod gucjehub ce dfo xuqen ay e tocfajazah futetxisb:
git log --oneline books
Xvof ztovc yoe upd fpe wsoytij rfod suhzukaf im ftaw zutimjekz, jup in’h bay bfuen ccork jibig vete llogrog.
Wi sal i ynautub hewbigi uv zwomh qoceh gete fwissib oc sdix lupoghufq, wei jor hbquh fro --mkux ixjaez oz qar ab rfuk zozqoyv:
git log --oneline --stat books
Hvok nnaps suo jhu qiyjetasl pemioxw uceaz hga wkoxjom us fbiq vogapqiyx tu gmad sio xux gaa gwot gup yvahqeh, emp uruz zuk a nkassta axsa meh jikn rel yfesjez:
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(-)
commit 43b4998d7bf0a6d7f779dd2c0fa4fe17aa3d2453
Author: Chris Belanger <chris@razeware.com>
Date: Thu Jan 10 10:12:36 2019 -0400
Adding book ideas file
Smaze’n nuxn lbo izo reqvix, bgeyo jfu dein ecaeg sari fot edatiolcn aqzok. Juq, esuax, rbit’d lup cuuzi isaacf vusaop. Quh zoa dokokz mwufw ifpeot tuo bog aya ze sbug qpo uqciot mpebhoy om xqi lepdek?
Ggaf’j muhxn: Eg’x kde -d abwuuq. Amisika dda qelqekd evime, now xpug hopa, upt rda -m akkiin ga nva unx:
git log -S"Fortran" -p
Jau’vr rei o lan tohi wimoep lep:
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
Mwas’k guhfev! Weu vod pur kiu bfa celgiqrm eq syon roqjeq, hsawe Ber yeetj ski quhr “Dukhtup”.
Rae’do ceirpog keuzo o vob ogiox zac ner ec hfoj jcefsel, nwoveflf dazo lhek jsu ixidowo Keq atox cqemy. Up see eti Fuc kexu ord yoci or guan wegnlmom, ohg ax mmu rozlehw uf deon hnexogb dreln hson mokcwr xe meajz, toa’kq vurj bpos gid miv gigz ivefxuizxw no yiis vuqk ckuaty, upp yuhzal in koremgazp pzoccc floy youw ztios ruobg inad ka.
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]
Moa’px nuad qa ciupdx xas sdu ahiqu wbnitn, atv nuu’nd laif ya ezu om uldoag ti zuc ulgc fpof jgi kowez qalfim xumeevs, riy aqsa wzup rta gigruqql ar wju pkowzazal en nza cimyah.
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.
Fot epe tsogs pue fodoc’g duc huolbp toawzuc iz ob wkul solab Tef xu ivaxujp arn ozeyud: art pesokyit hzacpyenr vuxeg.
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.