Git internals book

This morning I saw at my rss feed that a book called Git Internals by Scott Chacon has been opensourced. So, having an idle afternoon, I borrowed an ebook from a relative and read it while taking a sunbath (idea! Have a tablet with a electronic ink screen and vim, and program on the beach.. I'm eager to see fast enough e. ink for that!)

The first 10-15 pages of the book are about the internal cogs of git, and they are easy to read and very well explained with diagrams. I invite you to read them, because thanks to them I now understand Git very well. The rest of the book covers how to work with git, and typical commands. Some of its bits are new to me, so I have summarized them here for you and me (well, mostly for me, I doubt anyone is reading this :P).

Possible workflows for decentralized SCM systems as git

  • Central repository model: better for small teams.


  • Dictator and leutenant model: better for large teams. Eg: Linux kernel


  • Integration manager model: community based git repos. Eg: Github


GUIs that come bundled with git

Provide simple visualization of git trees and commits:

  • gitk: Tcl/Tk based browser. Will take most of the same arguments that git log will take.

  • git instaweb: Without Tk. It fires up a web server running the gitweb CGI script, using lighttpd, apache, or webrick and then opens your default browser.

    • Open: git instaweb --httpd = lighttpd or apache or webrick
    • Close: git intaweb stop

Crypto signed tags

  • Sign tag: git tag -s (sign with email address GPG key)

    or git tag -u <keyID> v1.0 -m "release v1.0"

  • Verify signed tag: git tag -v v1.0

  • push tag to remote: git push origin [tagname]

Caring of git

From time to time, you need to take care of git repos, usually the big ones. To have them healthy and running quickly:

  • Garbage collection: git gc (it is possible to turn it off and on automatically).

  • Fsck:

    git fsck : To know if there are unreachable or corrupted objects in the DB and fix them.

    git prune : To remove dangling objects.

Sharing repos

It is done using the git-daemon, which supports these 3 protocols:

  • git: No built in integration, generally you cannot push over it.

  • ssh: If an user has ssh and write access, that user can push.

  • http: easy setup, you need just static web server. But to push, you need to run a DAV server.

Browse git objects(blobs) directly

  • git show [object]

  • git cat-file [object]

Generating patch files

  • Generate: git diff master..experiment > patchFile

  • Apply patch: patch -p1 patchFile patching file fileToPatch

Export a tree

git-archive: For exporting a snapshot of a git tree.

Interactive shells

git add -i: Provides an interactive shell to select files, and also allows to commit only chunk of files (useful for a patch).

git rebase -i: For complex rebasing.

Víctor Cuadrado Juan

I'm Víctor Cuadrado Juan, a developer and FOSS enthusiast, in love with Linux. Currently living in Nürnberg, Germany. Feel free to waste your precious time around here, or to contact me: me at .