Git, an Illustrated Primer

Preview:

DESCRIPTION

Given at the July BCSPHP Meeting

Citation preview

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

GIT: An Illustrated Primer

http://mojolive.com/profile/dcousineau

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

History

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

BitKeeper No Longer Free To Use

Linux Kernel RequiresDistributed

Performant

SVN and CVS... Not So Much

“CVS is what we should NOT do...”

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

GITthus,

gItting started

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Linux

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> sudo apt-get install git$> sudo yum install git$> echo "Seriously?"

+OSX

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

http://git-scm.com

+OSX

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)$> brew install git$> say "Win!"

+Windows

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

http://windows.github.com

+Gitting STarted

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+My First Repo

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Stage New Files

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Commit Staging

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+staging?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

working directory

index

repository

+staging?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

working directory

index

repository

“staging”

+staging?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

working directory

index

repository

modify

+staging?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

working directory

index

repository

git add

+staging?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

working directory

index

repository git commit

+Directories

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Modify

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Branch!

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Back to Master

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Merge!

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+stashing

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Popping

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

branching

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

a b c

MASTER

HEAD

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

a b c

MASTER

DEVELOP

create new branch

HEAD

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

a b c

MASTER

DEVELOP

Checkout new branch

HEAD

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

a b c

MASTER

DEVELOP

commit to develop

d

HEAD

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

commit to master HEAD

a b c

MASTER

DEVELOP

d

e

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

a b c

MASTER

DEVELOP

merge Develop

d

e

f

Remote

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

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

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Create a Project

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Create a Project

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Doing as I am told

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+did as I was told

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Push Again!

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Fetching & Merging

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Pulling

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Two Authors Two Pushes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Two Authors Two Pushes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+AFtermath

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Aftermath

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Aftermath

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+AFtermath

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+forking

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+pull requests

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+MAke Changes IN A NEW BRANCH

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Push Changes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+See Our New Branch

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Create Pull Request

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Oh Look, Our Pull Request

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Oh Look Our Pull Request

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Oh Look, It’s Merged In!

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Remotes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Adding Another Remote

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+create and sync new branches

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Delete local and remote branches

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Pull From One, Push To Another

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

GIT FLow

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

htt

p://

nv

ie.c

om

/po

sts/

a-

suc

ce

ssfu

l-g

it-

br

an

ch

ing

-m

od

el/

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

Subversion and GIT

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+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

+Workflow

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

Normal GIT Workflow

+Sync

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> git svn dcommit --dry-run$> git svn dcommit$> git svn rebase

+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 wellsvn... not so much

+Local Branching

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> git merge --squash branch

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

git merge --squash localbrn

HEAD

a b

c

MASTER

localbrn

d e

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

git merge --squash localbrn

HEAD

a b

MASTER

DEC

+Why?

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

SVN is TERRIBLE at merges

git-svn will do it if you don’tand when it fails, it does so spectacularly

you’ll just litter your commit history

+tracking svn branches

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> git checkout -t remotes/branchname

+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

+personal opinion

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

except for release taggingand a develop branch

don’t bother with remote branchingjust stick to local and squashes

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

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

Advanced Usage

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+reset my local changes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> git checkout -- .

tell git “no more options!”

+Replay Last commit

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

$> git reset --mixed REF

+Gitting Ready

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Results

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+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.

+“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

+“Oops i forgot to branch”

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+“Oops i forgot to branch”

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+“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

+Oops

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Lay of the land

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Making decisions

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Reach 88MPH

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Fun with Paradoxes

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Fruits of our labor

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+“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

ಠ_ಠ

+Terrible Mistake

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+gone now, here yesterday

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+VooDoo Magic

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Results

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Cleanup The Mess

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+Look Ma, No secret.key!

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

THANKS. FOR YOUR ATTENTION

Daniel Cousineau // follow me : @dcousineau or http://dcousineau.com

+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

Recommended