Git For the Android Developer Tony Hillerson, AnDevCon Fall 2011 #AnDevCon @tackmobile @thillerson http://www.slideshare.net/thillerson/git-for-android-developersPRESENTATION ANDEVCON • MAY 14, 2012
About Me • Worked with Android and Git for a few years now • O’Reilly Screencaster: Developing Android Applications • http://training.oreilly.com/androidapps/ • http://training.oreilly.com/androidapps2/ • Tech Reviewer PRESENTATION tackmobile.com
Diving Right In Learning by DoingPRESENTATION ANDEVCON • MAY 14, 2012
Tagging git tag -a -m"Tagging v1.0" v1.0 c5083fa master fb4f5d9 c5083fa 3f43fa3 • Both “-v1.0” and c5083fa will point to c5083fa • Push this tag with `git push --tags` • Can be cryptologically signed PRESENTATION tackmobile.com
Recap of Simple Commands • git init - Creates an empty Git repository • git add - Adds a file to the stage (“stages a file”) • git rm - Removes from version control • git commit - Commits the staged changes to the (local) repository • git log - A view of the history • git tag - Names a commit • .gitignore - tells git to ignore certain files PRESENTATION tackmobile.com
Why Source Control? • For the solo developer? • Protection against mistakes • Freedom • ... to refactor • ... to experiment • For the development team? • All of the above, plus: • Parallel development • Merging different code branches PRESENTATION tackmobile.com
Preliminaries Getting Git and Getting Set UpPRESENTATION ANDEVCON • MAY 14, 2012
What’s a Git? A completely ignorant, childish person with no manners. - http://urbandictionary.com Linus Torvalds PRESENTATION http://en.wikipedia.org/wiki/Linus_Torvalds tackmobile.com
What’s a Git? Git is a free & open source, distributed version control system designed to handle everything from small to very large projects with speed and efficiency. - http://git-scm.com PRESENTATION tackmobile.com
Getting Set Up on Mac • Homebrew - http://mxcl.github.com/homebrew/ • brew install git • MacPorts - http://www.macports.org/ PRESENTATION tackmobile.com
Getting Set Up on Windows • msysgit -http://code.google.com/p/msysgit/ PRESENTATION tackmobile.com
Getting Set Up on Linux • apt, etc - you probably know the drill PRESENTATION tackmobile.com
Gooies! Git Tower - http://git-tower.com M • • Source Tree - Mac App Store A • Brother Bard’s GitX fork - http://brotherbard.com/blog/2010/03/experimental-gitx-fork/ C • Tortoise Git - http://code.google.com/p/tortoisegit/ W I N PRESENTATION tackmobile.com
Reference • Git - http://git-scm.com/ • ProGit - http://progit.org/book/ - Scott Chacon • Insider Guide to Github - http://www.pragprog.com/screencasts/v-scgithub/insider-guide-to- github - Scott Chacon PRESENTATION tackmobile.com
The Command Line A Short SermonPRESENTATION ANDEVCON • MAY 14, 2012
The Guts of Git The Little Bits that Make Git DifferentPRESENTATION ANDEVCON • MAY 14, 2012
What’s With all the Characters? 86650c185eda50c9f9d58e2fbdf8b7113e5dee54 • SHA1 Hash • Uniquely identifies a commit • Secure - very unlikely that someone can tamper with content in a repository PRESENTATION tackmobile.com
SHA-1 Hash Keys “ ... to have a probability of a SHA1-hash collision rise to 1/2, you need about 10^24 objects ... - Scott Chacon in Pro Git (paraphrased) PRESENTATION tackmobile.com
In Git There Are Only... • Blobs • Trees • Commits PRESENTATION tackmobile.com
Blobs • The contents of your files are stored as binary files in .git/objects • Git is efficient. It only stores the same content once. • Identified by a SHA-1 • Show blob contents with e.g. git show c7fb9f5 PRESENTATION tackmobile.com
Trees • Trees give structure to blobs • Trees are also stored in .git/objects • Identified by SHA-1 • View a tree with ls-tree, e.g. `git ls-tree HEAD` PRESENTATION tackmobile.com
Commits• Identified by a SHA-1• Points to one tree• Has a required message• May have one (or more) parent commit(s)• Show the reachable commits from a commit: git rev-list HEAD PRESENTATION tackmobile.com
Refs • Point to commits • .git/refs/heads - the latest commits in local branches • HEAD - the latest commit on the current branch PRESENTATION tackmobile.com
Blobs Are Content b84ed8ed e8d5cf6 579a3b1 PRESENTATION tackmobile.com
Trees Give Structure 9899d2c b84ed8ed foo.txt 579a3b1 bar.txt e8d5cf6 baz.html trees can point 3ffb35b /images to other trees PRESENTATION tackmobile.com
Commits Point to Trees d414c3e 9899d2c “Updated the main activity” b84ed8ed foo.txt 579a3b1 bar.txt e8d5cf6 baz.html 3ffb35b /images PRESENTATION tackmobile.com
Commits Have Parents d414c3e “Updated the main activity” 090c953 “Fixed bug #42” 4493671 “Added RoboGuice” c1d1f60 “Initial commit” PRESENTATION tackmobile.com
Refs Point to Commits HEAD d414c3e “Updated the main activity” 090c953 “Fixed bug #42” 4493671 “Added RoboGuice” c1d1f60 “Initial commit” PRESENTATION tackmobile.com
And That’s All You Need To Know About GitPRESENTATION tackmobile.com
And That’s All You Need To Know About Git (Mostly)PRESENTATION tackmobile.com
Sweet Moves with Git Sweet, Sweet MovesPRESENTATION ANDEVCON • MAY 14, 2012
Interactive Add Building Semantic CommitsPRESENTATION ANDEVCON • MAY 14, 2012
Interactive Add - Building Semantic Commits • `git add` simply adds to the stage • `git commit -a` will commit all changes to tracked files (add and commit) • `git add -i` -- a command line tool to interactively add changes • Individual commits shouldn’t leave things broken • Try to commit some useful feature or bug fix all together PRESENTATION tackmobile.com
Amending A Commit Fix the Last CommitPRESENTATION ANDEVCON • MAY 14, 2012
git commit --amend • Oops! I misspelled something in the commit message • Oops! I did `git commit -a` and forgot to `git add` a file • Oops! I just committed a bug • USE ONLY BEFORE YOU SHARE CHANGES PRESENTATION tackmobile.com
Git Revert More Like Git ReversePRESENTATION ANDEVCON • MAY 14, 2012
git revert • Commits the reverse of a commit • The previous commit is still there • != svn revert PRESENTATION tackmobile.com
Git Stash Like a Little Repo In Your RepoPRESENTATION ANDEVCON • MAY 14, 2012
git stash • remember: git help stash • Stash away changes in a safe place PRESENTATION tackmobile.com
Branching Hitting Save Before You Fight the Level BossPRESENTATION ANDEVCON • MAY 14, 2012
How To Think About Branching • Mainline • What do you want “master” to mean? • Topic Branches • Branching examples PRESENTATION tackmobile.com
Topic Branches • Branching is about controlling feature sets • Make a new branch for a story • Make a new branch for a bug fix • Make a new branch to spike something PRESENTATION tackmobile.com
Team Branching Strategies • What do you want “master” to mean? • Keep master deployable? • one strategy for web software • Use “master” as an integration branch? • Each developer uses topic branches and integrates to master • Make a branch for releases PRESENTATION tackmobile.com
Branching: Rebasing master fb4f5d9 c5083fa 3f43fa3 add_login_activity before 9aa8827 fe594ce ccb6f5e master fb4f5d9 c5083fa 3f43fa3 add_login_activity after 9aa8827 fe594ce ccb6f5e `git rebase master` PRESENTATION tackmobile.com
Branching: Rebasing • Better than merging in some ways... • Don’t use if you’ve pushed your branch to a remote • Can override with `git push -force` PRESENTATION tackmobile.com
Git Pull --rebase • Also available: `git pull --rebase` • Helpful for avoiding merge commits • May cause problems if git can’t automatically merge • `git reset HEAD` and start over with normal `git pull` PRESENTATION tackmobile.com
Cherry Pick I’ll Take One Of Those... And One Of Those...PRESENTATION ANDEVCON • MAY 14, 2012
Cherry-pick git cherry-pick fe594ce A new commit with master the changes from fe594ce fb4f5d9 c5083fa 3f43fa3 add_login_activity 9aa8827 fe594ce ccb6f5e PRESENTATION tackmobile.com
Interactive Rebase Rewrite HistoryPRESENTATION ANDEVCON • MAY 14, 2012
Interactive Rebase - Fixing History • git rebase -i [commit] • A list of all commits in the current order • Reorder • Fix a certain commit • Squash commits together • Delete commits • DON’T USE AFTER YOU’VE PUSHED PRESENTATION tackmobile.com
Whoops! Lots Of Ways To Fix ItPRESENTATION ANDEVCON • MAY 14, 2012
git reset • `git reset [filename]` = opposite of `git add [filename]` • `git reset HEAD` = same as above - acts on all changes • `git reset HEAD^` (also ^^, or ~1, ~42, etc.) = rollback commits to working tree • All examples of “mixed” reset PRESENTATION tackmobile.com
git reset soft • git reset --soft [commit] • Moves HEAD to commit • Puts the “popped” contents on the index PRESENTATION tackmobile.com
git reset mixed (default) • git reset [commit] • Moves HEAD to commit • Puts the “popped” contents on the index • Moves the index to the working tree as changes PRESENTATION tackmobile.com
git reset hard • git reset --hard [commit] • Moves HEAD to commit • Puts the “popped” contents on the index • Moves the index to the working tree as changes • Makes the working tree look like the index • DESTRUCTIVE PRESENTATION tackmobile.com
git reset use cases • Back that last commit up (git reset HEAD^) • Don’t forget `commit --amend` • Oops, didn’t mean to commit that file • I meant that commit to be on a branch! PRESENTATION tackmobile.com
The Take Home • SCM Is Important • No matter what kind of developer you are • Git is fundamentally different from the others • It’s not a database of patches • It’s a history of filesystem snapshots • It gives you freedom to innovate, make mistakes, and collaborate. PRESENTATION tackmobile.com
Thank you! #AnDevCon @tackmobile @thillerson http://github.com/thillerson http://slideshare.com/thillerson For the Android Developer • Tony Hillerson • AnDevCon Spring 2012PRESENTATION tackmobile.com