Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
GIT: An Illustrated Primer
Slide 2
Slide 2 text
http://mojolive.com/profile/dcousineau
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 3
Slide 3 text
History
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 4
Slide 4 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
BitKeeper No Longer Free To Use
Linux Kernel Requires
Distributed
Performant
SVN and CVS... Not So Much
“CVS is what we should NOT do...”
Slide 5
Slide 5 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
GIT
thus,
Slide 6
Slide 6 text
gItting
started
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 7
Slide 7 text
+OSX
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
http://git-scm.com
Slide 8
Slide 8 text
+OSX
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> /usr/bin/ruby -e \
"$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
$> brew install git
$> say "Win!"
Slide 9
Slide 9 text
+Linux
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> sudo apt-get install git
$> sudo yum install git
$> echo "Seriously?"
Slide 10
Slide 10 text
+Windows
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
http://windows.github.com
Slide 11
Slide 11 text
+My First Repo
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 12
Slide 12 text
+Stage New Files
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 13
Slide 13 text
+Commit Staging
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 14
Slide 14 text
+staging?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
working directory
index
repository
Slide 15
Slide 15 text
+staging?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
working directory
index
repository
“staging”
Slide 16
Slide 16 text
+staging?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
working directory
index
repository
modify
Slide 17
Slide 17 text
+staging?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
working directory
index
repository
git add
Slide 18
Slide 18 text
+staging?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
working directory
index
repository
git commit
Slide 19
Slide 19 text
+Directories
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 20
Slide 20 text
+Modify
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 21
Slide 21 text
+Branch!
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 22
Slide 22 text
+Back to Master
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 23
Slide 23 text
+Merge!
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 24
Slide 24 text
+stashing
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 25
Slide 25 text
+Popping
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 26
Slide 26 text
branching
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 27
Slide 27 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
a b c
MASTER
HEAD
Slide 28
Slide 28 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
a b c
MASTER
DEVELOP
create new branch
HEAD
Slide 29
Slide 29 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
a b c
MASTER
DEVELOP
Checkout new branch
HEAD
Slide 30
Slide 30 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
a b c
MASTER
DEVELOP
commit to develop
d
HEAD
Slide 31
Slide 31 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
commit to master HEAD
a b c
MASTER
DEVELOP
d
e
Slide 32
Slide 32 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
a b c
MASTER
DEVELOP
merge Develop
d
e
f
Slide 33
Slide 33 text
Remote
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 34
Slide 34 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
SVN GIT
d
e
b
a
c
d
e
b
a
c
d d
e
b
a
c
Slide 35
Slide 35 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 36
Slide 36 text
+Create a Project
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 37
Slide 37 text
+Create a Project
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 38
Slide 38 text
+Doing as I am told
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 39
Slide 39 text
+did as I was told
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 40
Slide 40 text
+Push Again!
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 41
Slide 41 text
+Fetching & Merging
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 42
Slide 42 text
+Pulling
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 43
Slide 43 text
+Two Authors Two Pushes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 44
Slide 44 text
+Two Authors Two Pushes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 45
Slide 45 text
+AFtermath
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 46
Slide 46 text
+Aftermath
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 47
Slide 47 text
+Aftermath
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 48
Slide 48 text
+AFtermath
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 49
Slide 49 text
+forking
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 50
Slide 50 text
+pull requests
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 51
Slide 51 text
+MAke Changes IN A NEW BRANCH
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 52
Slide 52 text
+Push Changes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 53
Slide 53 text
+See Our New Branch
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 54
Slide 54 text
+Create Pull Request
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 55
Slide 55 text
+Oh Look, Our Pull Request
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 56
Slide 56 text
+Oh Look Our Pull Request
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 57
Slide 57 text
+Oh Look, It’s Merged In!
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 58
Slide 58 text
+Remotes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 59
Slide 59 text
+Adding Another Remote
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 60
Slide 60 text
+create and sync new branches
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 61
Slide 61 text
+Delete local and remote branches
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 62
Slide 62 text
+Pull From One, Push To Another
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 63
Slide 63 text
GIT FLow
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 66
Slide 66 text
Subversion
and GIT
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 67
Slide 67 text
+et voilà
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git svn clone -s -r 1000:HEAD https://url/to/repo ./wkngcpy
$> git svn show-ignore > .gitignore
Slide 68
Slide 68 text
+Workflow
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Normal GIT Workflow
Slide 69
Slide 69 text
+Sync
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git svn dcommit --dry-run
$> git svn dcommit
$> git svn rebase
Slide 70
Slide 70 text
+With some caveats
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
anything that has been dcommit’d
is set in stone! do. not. touch.
git branches well
svn... not so much
Slide 71
Slide 71 text
+Local Branching
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git merge --squash branch
Slide 72
Slide 72 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
git merge --squash localbrn
HEAD
a b
c
MASTER
localbrn
d e
Slide 73
Slide 73 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
git merge --squash localbrn
HEAD
a b
MASTER
DEC
Slide 74
Slide 74 text
+Why?
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
SVN is TERRIBLE at merges
git-svn will do it if you don’t
and when it fails, it does so spectacularly
you’ll just litter your commit history
Slide 75
Slide 75 text
+tracking svn branches
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git checkout -t remotes/branchname
Slide 76
Slide 76 text
+creating remote branches
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git svn branch -m “Creating new branch” branchname
$> git checkout -t remotes/branchname
Slide 77
Slide 77 text
+personal opinion
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
except for release tagging
and a develop branch
don’t bother with remote branching
just stick to local and squashes
Slide 78
Slide 78 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
use git svn
locally
push for
team
adoption
procure git
server
full clone
push to new
git server
Slide 79
Slide 79 text
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
use git svn
locally
push for
team
adoption
procure git
server
full clone
push to new
git server
Slide 80
Slide 80 text
Advanced
Usage
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 81
Slide 81 text
+reset my local changes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git checkout -- .
tell git “no more options!”
Slide 82
Slide 82 text
+Replay Last commit
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git reset --mixed REF
Slide 83
Slide 83 text
+Gitting Ready
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 84
Slide 84 text
+Results
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 85
Slide 85 text
+Undo Last commit
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git reset --hard HEAD^
HEAD^ means commit prior
to HEAD. HEAD^2 is 2
commits prior, etc etc.
Slide 86
Slide 86 text
+“Oops i forgot to branch”
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git branch newbranchname
$> git reset --hard SHA
commit immediately before
the intended first commit
of our new branch
Slide 87
Slide 87 text
+“Oops i forgot to branch”
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 88
Slide 88 text
+“Oops i forgot to branch”
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 89
Slide 89 text
+“Oops I accidentally the commit message”
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git rebase --interactive SHA
commit immediately
preceding the commit in
question
Slide 90
Slide 90 text
+Oops
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 91
Slide 91 text
+Lay of the land
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 92
Slide 92 text
+Making decisions
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 93
Slide 93 text
+Reach 88MPH
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 94
Slide 94 text
+Fun with Paradoxes
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 95
Slide 95 text
+Fruits of our labor
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 96
Slide 96 text
+“Oops I committed the private key”
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
$> git filter-branch --index-filter \
'git rm --cached --ignore-unmatch secret.key' \
--prune-empty --tag-name-filter cat -- --all
ಠ_ಠ
Slide 97
Slide 97 text
+Terrible Mistake
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 98
Slide 98 text
+gone now, here yesterday
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 99
Slide 99 text
+VooDoo Magic
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 100
Slide 100 text
+Results
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 101
Slide 101 text
+Cleanup The Mess
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 102
Slide 102 text
+Look Ma, No secret.key!
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 103
Slide 103 text
THANKS.
FOR YOUR ATTENTION
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
Slide 104
Slide 104 text
+further resources
Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com
http://git-scm.com/book
FREE!
Attribution-NonCommercial-ShareAlike 3.0 Unported
https://help.github.com