GitFor the Android DeveloperTony Hillerson, AnDevCon Fall 2011#AnDevCon #effectiveui @thillersonhttp://www.slideshare.net/thillerson/git-for-android-developers
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
Tagging git tag -a -m"Tagging v1.0" v1.0 c5083famasterMac fb4f5d9 c5083fa 3f43fa3➡ Both “-v1.0” and c5083fa will point to c5083fa➡ Push this tag with `git push --tags`➡ Can be cryptologically signed
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
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
The Guts of GitThe Little Bits that Make Git Different
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 “... 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)
In Git There Are Only...➡ Blobs➡ Trees➡ Commits
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
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`
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
Refs➡ Point to commits➡ .git/refs/heads - the latest commits in local branches➡ HEAD - the latest commit on the current branch
Interactive Add - Building 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
How To Think About Branching➡ Topic Branches➡ Mainline➡ What do you want “master” to mean?➡ Branching examples
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
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
Branching: Rebasing master Mac fb4f5d9 c5083fa 3f43fa3 add_login_activity before Mac 9aa8827 fe594ce ccb6f5emasterMac fb4f5d9 c5083fa 3f43fa3 add_login_activity after Mac 9aa8827 fe594ce ccb6f5e `git rebase master`
Branching: Rebasing➡ Better than merging➡ Don’t use if you’ve pushed your branch to a remote➡ Can override with `git push -force`
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`
Cherry PickI’ll Take One Of Those... And One Of Those...
Cherry-pick git cherry-pick fe594ce A new commit withmaster the changes from fe594ceMac fb4f5d9 c5083fa 3f43fa3 add_login_activity Mac 9aa8827 fe594ce ccb6f5e
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
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
git reset soft➡ git reset --soft [commit]➡ Moves HEAD to commit➡ Puts the “popped” contents on the index
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
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
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!
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.
Thank you! #AnDevCon #effectiveui @thillerson http://github.com/thillerson http://slideshare.com/thillersonHalf Off My Git Course These SlidesGit For the Android Developer • Tony Hillerson • AnDevCon Fall 2011
A particular slide catching your eye?
Clipping is a handy way to collect important slides you want to go back to later.