Postscript: Git hackers refer to git as "plumbing" and to Cogito and the GUIs as "porcelains", and they naturally pipe stuff to one another. When something goes wrong, there's often talk of spillage. In hindsight, it's a good thing I didn't have time to google for images to "spice up" the presentation. Why? ==== - you want to hack on the linux kernel - or on a cool SCM - it is fast even on large projects - it is _small_ even on large projects - you can work disconnected - are doing a lot of branched or parallel development - you want really smart tools to deal with renames, and figuring out where some code comes from... - and tools that are _simple_ and don't get in the way GIT for the solo developer ========================== ... add to your env GIT_AUTHOR_NAME=Martin Langhoff GIT_COMMITTER_NAME=Martin Langhoff GIT_COMMITTER_EMAIL=martin@catalyst.net.nz GIT_AUTHOR_EMAIL=martin@catalyst.net.nz ... and now to work... cd workdir cg-init ...work work work... cg-diff cg-commit cg-add cg-remove cg-commit ... you can also do emacs .gitignore ... all of this happens on a head (branch) called 'master' cg-status cg-commit ... oops! cg-admin-uncommit ... and now either cg-diff # edit and retry the commit ... or cg-reset # discard all local changes Tags ==== cg-tag -s TAGNAME cg-tag-ls ...and then release based on a tag... git-tar-tree TAGNAME Where's git hiding stuff? ========================= ls .git HEAD description index objects branches hooks info refs Now let's publish it ==================== ssh someserver mkdir ~/public_html/myproject.git GIT_DIR=~/public_html/myproject.git git-init chmod ugo+x ~/public_html/myproject.git/hooks/update cg-branch-add origin git+ssh://someserver/home/martin/public_html/myproject.git#master cg-push How does someone else work with you? ==================================== cg-clone http://someserver/~martin/myproject.git cd myproject.git ... hack hack hack... cg-commit cg-update origin cg-commit mkdir patchesforupstream git-format-patch --mbox --signoff -o patchesforupstream origin git-send-email -o patchesforupstream/0001-fixing-ugly-bug cg-update origin cg-diff -r origin:master cg-log -r origin:master A team with commit rights ========================= cg-clone git+ssh://someserver/var/git/ourproject.git # like others: sticky group set and friendly umask! cd myproject.git ... hack hack hack... cg-commit cg-update origin cg-commit cg-update ... resolve conflicts if needed ... cg-diff -r origin:master cg-log -r origin:master cg-push cg-fetch vs cg-update Get your head around branching ============================== - We call them heads - Like DARCS, each repository is a head - The word "branch" is used for "remote head", like origin - However! You can have many heads in the same repository: - a "publishing" repository can have many heads - a merging repository will know about several heads, to be able to merge - most repos only know about one (master) or two (master and origin) - Each cg-update is a merge. Git remembers how far you've merged, it'll know next time what's pending. - Branch merging is stupid+fast first. Falls back to smart Migrating from CVS or Arch? =========================== mkdir fooproject; cd fooproject git-init-db git-cvsimport -k -d /var/cvs fooproject mkdir barproject; cd barproject git-init-db git-archimport leaddeveloper@archrepo-2005/project otherdeveloper@secondaryarchrepo-2005/project Other migration needs? Tailor.py to the rescue... CVS, Subversion, darcs, monotone, Codeville, Mercurial and Baazar-NG. Powerful tools, evolving quickly ================================ - Very fast stupid merge ... and very smart, slow merges when stupid won't do - Rename/copy detection - Pickaxe - File identity smarts - Commits echoed back don't conflict, even if they show up via a strange path - StGIT Pretty GUIs =========== - gitk, included, fast, powerful, simple. - qgit -- now with StGIT support Technical ========= - Content-addressable FS - Files -> Tree -> Commit (message + parents) -> Tags - Heads vs Branches, References - the Index - Changeset/patch tracking vs identity-tracking