Slide 1

Slide 1 text

a handful of Git workflows for the agilist steven harman twitter: stevenharman http://stevenharman.net

Slide 2

Slide 2 text

stop worrying and start loving The Git. git is awesome - if you’re using it, you know. if not, don’t be scared, give it a try.

Slide 3

Slide 3 text

picture Git don’t be scared, it’s not as bad as it looks.

Slide 4

Slide 4 text

basic branch/feature workflow

Slide 5

Slide 5 text

remote Git repository (origin) master let’s assume there already exists a Git repository somewhere in the cloud. like maybe... The GitHub.

Slide 6

Slide 6 text

remote Git repository (origin) master local Git repository (your clone) master origin/master :> git clone [email protected]:stevenharman/foo.git :> cd foo :master> start by cloning a copy of that remote repository (conventionally known as “origin”) to our local machine.

Slide 7

Slide 7 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master :master> git checkout -b feature :feature> [... hackity-hack-hack ...] :feature> git commit -am ‘did something awesome.’ we need to work a sweet new feature. step 1) create a local branch to work in. step 2) hackity-hack-hack. step 3) commit the changes. [repeat steps 2 & 3 as necessary]

Slide 8

Slide 8 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master // someone else pushed a change to the remote. a teammate, or maybe even another you, has pushed some new changes.

Slide 9

Slide 9 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master :feature> [... more hackity-hack-hack ...] :feature> git commit -am ‘more awesomeness. bacon!’ [still continuing steps 2 & 3 from earlier]

Slide 10

Slide 10 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature :feature> git fetch origin get any new changes that are on the remote, but not local.

Slide 11

Slide 11 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master :feature> git checkout master :master> git merge origin/master merge the changes from the remote “master” branch into our local “master” branch. because there are no divergent changes on our local master, this is a “fast-forward merge” along the master’s graph.

Slide 12

Slide 12 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master :master> git merge feature now we need to merge our feature into “master” so we can release it. option 1) merge feature in. [keeps all info, but we end up with a noisy history graph that’s hard to follow]

Slide 13

Slide 13 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master OR [go back to just after we merged in the fetched changes]

Slide 14

Slide 14 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master :master> git checkout feature :feature> git rebase master option 2) rebase our “feature” branch on top of “master”. this “rewinds” our branch back to where it started, then “fast-forwards” along “master”, and finally re-applies each of our change sets. afterward, our local commits have a new SHA1 hash, meaning they are different objects than before rebase, however, the original committer info & meta-data are preserved.

Slide 15

Slide 15 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master :feature> git checkout master :master> git merge feature now we can merge our changes into “master.” because we already have all of the changes that exist in “master,” this results in a “fast-forward” merge onto “master”.

Slide 16

Slide 16 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master :master> git push origin master finally we share our sweet, sweet bacon with the rest of the world by pushing our local changes to the remote (origin).

Slide 17

Slide 17 text

remote Git repository (origin) master local Git repository (your clone) master origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master local Git repository (your clone) master origin/master feature local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master feature origin/master remote Git repository (origin) master local Git repository (your clone) master origin/master :master> git branch -d feature now everyone can enjoy the bacony-goodness!

Slide 18

Slide 18 text

derivations • branch for a spike • branches for concurrent design • push/pull changes directly from teammate • stashing changes temporarily • reset to prior commit (in case of FUBAR)

Slide 19

Slide 19 text

some cool tools for your Git utility belt • git reset • git cherry-pick • git stash • git bisect • git add -p • git reflog • git svn add -p to interactively stage hunks of a file change.

Slide 20

Slide 20 text

get Git info • http://ProGit.org (the site for THE book) • http://gitready.com • http://gitcasts.com • http://whygitisbetterthanx.com/ • http://delicious.com/stevenharman/git

Slide 21

Slide 21 text

steven harman twitter: stevenharman http://stevenharman.net fork these slides from http://github.com/stevenharman/git-workflows feel free to hit me up with any questions.