Git Git “The stupid content tracker”
Jan 15, 2015
GitGit“The stupid content tracker”
What is Git?What is Git?
A popular distributed version control system designed to handle very large projects with speed and efficiency.
http://git-scm.com/
Why is it stupid?Why is it stupid?It’s stupidly fast*
It’s stupidly easy to branch & merge
$ time git checkout -b newbranch
Switched to a new branch 'newbranch'
real 0m0.292s
• Repositories are stupidly small
(size of FreeBSD repo)
CVS 1.7 GB
SVN 3.9 GB
GIT 511 MB
* Cygwin is a bit slower
Git HistoryGit History2002
◦Linus uses BitKeeper to track the Linux kernel
April, 2005◦BitMover drops free license for BitKeeper◦Linus starts writing his own SCM: Git
June 2005◦Git is officially used to track the kernel
2007◦Git 1.5.0 released◦Major usability improvement
What makes Git better?What makes Git better? It’s distributed!Does not store deltas
◦ Uses SHA1 to uniquely identify a commit◦ Linus called it “a content- addressable
filesystem, used to track directory trees.”Efficiency
◦ Compresses repository very well◦ Local operations are fast◦ Online operations over git:// protocol are also
fastEasy branching & merging
◦ Each commit can have multiple parents.Cleaner
◦ Everything is stored in a single top-level .git directory
Centralized vs. Centralized vs. DecentralizedDecentralized
Centralized SCMCentralized SCM
•Operations require central server
•Single point of failure•Can be a bottleneck
Source: http://is.gd/dBd6R
Decentralized SCMDecentralized SCM
•Anyone can be a server•Everyone has a full local repository
Source: http://is.gd/dBd6R
Decentralized ExampleDecentralized Example
Clone from a remote upstream repository
Source: http://is.gd/dBd6R
Decentralized ExampleDecentralized Example
Create topic branches based on the pristine copy
Source: http://is.gd/dBd6R
Decentralized ExampleDecentralized Example
Push both branches back to upstream
Source: http://is.gd/dBd6R
Decentralized ExampleDecentralized Example
Push changes to another web server
Source: http://is.gd/dBd6R
Decentralized ExampleDecentralized Example
Push & Pull changes from another co-worker, or back to the web server
Source: http://is.gd/dBd6R
Benefits of Benefits of DecentralizationDecentralizationCommit locally
◦Keep experimental code local◦Push solid working code to main repo◦Use local topic branches◦Some idea turns out badly?
$ git branch –d my_bad_ideaNo single point of failureTrivial backupsFast operations*
Look familiar?Look familiar?
$ git status$ git diff$ git log$ git blame*$ git add FILE$ git rm FILE$ git mv FILE*$ git revert FILE
$ svn status$ svn diff | less$ svn log | less$ svn blame$ svn add FILE$ svn rm FILE$ svn mv FILE$ svn revert FILE
So what’s different?So what’s different?Ok…
The Index (Staging area)The Index (Staging area)Never have to fully commit to every
commit◦Decide exactly what you want to commit◦Group changes logically to match up with
your commit message, different topic branches, etc…
◦Stash non-staged code to test before your commit $ git add working_file.c
$ git stash --keep-index(test… commit)git stash pop
The Index (Staging area)The Index (Staging area)Good for merging
◦Non-conflicting hunks are auto-staged◦Doesn’t clutter the diff with successfully
merged code Use `git diff –cached` to see what you’re
going to commit◦Only conflicting files left for you to
resolve/addDon’t like the index?
◦$ git commit -a◦Automatically stages deleted/modified
files◦Still must use git add to add new ones
(just like SVN)
Some different commandsSome different commands
$ git commit -a$ git clone url$ git pull$ git remote
$ git tag -a name
$ svn commit$ svn checkout url
$ svn update
$ svn copy http://repo.com/svn/trunk http://repo.com/svn/tags/name
More different commandsMore different commands
$ git merge branch
$ git rebase onbranch
$ git stash
$ git submodule
$ svn merge -r 20:HEAD http://example.com/svn/branches/branch
Merge exampleMerge example$ git checkout branch_tomerge
# Fix a bug$ git commit –a –m ‘fixed a bug’$ git checkout master
# what changed between branches?$ git diff master branch_tomerge$ git merge branch_tomerge
# delete the old branch$ git branch –d branch_tomerge
RebasingRebasingWhat is rebasing?
◦Finds all committed changes since you branched
◦Resets your branch so it’s identical to the HEAD of the branch you’re rebasing onto
◦Re-applies your changes on topWhy do it?
◦Clean up your history◦Don’t have to leave old topic branches
lying aroundWhat to watch out for?
◦Don’t rework your history if you’ve already merged and pushed to a remote repo that others use
Rebase exampleRebase example# We want to rebase bugfix onto master
$ git checkout bugfix…make changes, and commit here…
# update from remote$ git checkout master$ git pull origin master
# Rebase changes on top of the updated master
$ git checkout bugfix$ git rebase master
# Now we can do a ‘fast-forward’ merge$ git checkout master$ git merge bugfix
Stashing filesStashing filesWhy?
◦You’re working on something◦You’ve got some debug code you
don’t want to commit yet◦Need to work on something else
How?◦$ git stash◦Do something else…◦$ git stash pop
Help, Git is scary!Help, Git is scary! (137 Commands)(137 Commands)
Source: http://is.gd/dBd6R
Most used…Most used… (24 Commands)(24 Commands)
Source: http://is.gd/dBd6R
Some GUI tools…Some GUI tools… (+5 Commands)(+5 Commands)
Source: http://is.gd/dBd6R
The “plumbing”The “plumbing” (most never used)(most never used)
Source: http://is.gd/dBd6R
Ok, so maybe not so Ok, so maybe not so scary…scary…Revision numbers are now SHA1
hashes◦Seems scary, but really isn’t…
Copy/Paste Specify partial hash (868bae) Use references (HEAD^, HEAD^^,
mybranch@{yesterday}) Use tags $ man git-rev-parse
Command help◦$ git help foo◦$ man git-foo◦$ git foo --help◦$ git foo -h
man pages
brief help
$ git help
Explains all the ways you can refer to things
Subversion IntegrationSubversion Integration“the best part about GIT is that no
one has to know you’re using it”A basic git-svn workflow:
$ git svn clone REPO_URL# ... hack hack hack ...$ git commit -a# ... hack hack hack ...$ git commit -a$ git svn rebase$ git svn dcommit
Subversion IntegrationSubversion Integration“the best part about GIT is that no one has to
know you’re using it”An even better git-svn workflow:
$ git svn clone REPO_URL$ git checkout -b new_branch# ... hack hack hack ...$ git commit -a$ git svn rebase$ git svn dcommit$ git checkout master$ git branch -d new_branch$ git svn rebase
Other resourcesOther resourcesCrash course for SVN users
◦ http://git.or.cz/course/svn.htmlCheat Sheet
◦ http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html
ProGit eBook (Free!)◦ http://progit.org/
Screencasts◦ http://gitcasts.com/
Extremely detailed, yet very helpful presentation◦ http://excess.org/article/2008/07/ogre-git-
tutorial/
Quick DemoQuick Demo
Questions?Questions?