Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser.
@chickamade $ whatis git
the stupid content tracker ...
git init
For the first 10 years of kernel maintenance, we literally used tarballs and patches, which is a much superior source control management system than CVS is.
There is no way to do CVS right.
Linus Torvalds
"Should I hacked together a stupid content tracker during my weekend so I can stop using this CVS/SVN shit?!?"
git was created, its design criteria:
- high performance
- non-linear development
- strong integrity
cache-concious design
all repository are created equal !!!
unless one is promoted to be the origin of all things (just like svn)
github: you may fork, but you must request to be pulled
dictator: be careful of who you trust when merging!
authentication of history
- each commit hash identify the snapshot content and the full associated history (more details comming)
- each tag is an immutable pointer to a commit hashes
- tags can be cryptographically signed with GPG
git engineering
- content-addressable object database
- Five (5) object types: blob, tree, commit, tag & branches
commits are snapshots, not deltas
each commit points to its parent (knows its own history)
merge is a commit with N parents, retaining merge history
tags & branches are simply pointers to commits
getting started
# git let you choose your display name
$ git config --global user.name "Your Name"
$ git config --global user.email you@yourdomain
# to start new repo
$ git init
# to clone an existing one
$ git clone https://github.com/git/git.git
# for access control
# you'll need to have a RSA/DSA key pair
basic operations
basic day to day work flow
- git checkout working-branch
- git fetch && git merge origin master
- vim work.py
- git diff
- git add work.py
- git commit -m 'meaningful messages'
- git push origin working-branch
partial commit with staging area (GUI recommended, e.g. GitX)
one afternoon, you made changes to 15 files; now you want to commit it in 3 parts!
$ touch foo.py bar.py bazzz.py
$ git add foo.py bar.py
# alternatively, staging patch by patch, interactively
$ git add -p
# this reset the staging area, but leaving the working tree dirty
$ git reset
cleaning up the mess
# just unstage the file, don't overwrite working copy
$ git reset HEAD -- file.py
# checkout file from HEAD, overwriting working copy
$ git checkout -- oldstuff.py
# checkout subdir from old version, overwriting working copy
git checkout v3.25.1 -- path/to/dir
# i committed and pushed something is just broken :(,
# this makes an extra commit that is
# the negatation the changes in badcommit.
$ git revert badcommit
viewing history
# idonethis!
$ git log --author=Hai-Anh --since="12 hours ago"
# list all commits since branch 3.24
$ git log v3.24..master >> release-notes.txt
# did anyone touch the config file?
$ git log v3.24..master -- src/config/settings.py
# show file diff against old version
$ git diff v2.5.1:foobar.py HEAD:foobar.py
# grepping through history
$ git grep XXX v3.25
too many branches???
use rebase for a linear history
rebase rewrites history, use it for local changes only!
git is flexible, and get the job done
# forgot to commit a new file, but local changes not pushed yet
$ git add forgotten.py
$ git commit --amend
# i want that fix in my branch, now!
$ git cherry-pick ${sha1}
# i was working on feature X, made changes to 10 files
# now i must leave it aside to work on a hotfix
$ git stash save 'partial work on feature X'
$ git checkout -b v2.30.1-hotfix v.2.30.1 # work on hotfix
$ git checkout working-branch
$ git stash pop