1. Git
For the Android Developer
Tony Hillerson, AnDevCon Fall 2013
#AnDevCon @tackmobile @thillerson
2. About Me
•
@thillerson, +thillerson
•
Developer at Tack Mobile
(tackmobile.com), @tackmobile
•
Android, iOS, and Mobile Web
•
Rails, Node, maybe Elixir (one day)
Presentation
tackmobile.com
8. 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
9. 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
10. 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
12. What’s a Git?
A completely ignorant, childish person with no
manners. - http://urbandictionary.com
Linus Torvalds
http://en.wikipedia.org/wiki/Linus_Torvalds
Presentation
tackmobile.com
13. 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
14. Getting Set Up on Mac
•
Homebrew
http://mxcl.github.com/homebrew/
•
•
brew install git
MacPorts
http://www.macports.org/
Presentation
tackmobile.com
15. Getting Set Up on Windows
•
msysgit
http://code.google.com/p/msysgit/
Presentation
tackmobile.com
16. Getting Set Up on Linux
•
apt, etc - you probably know the drill
Presentation
tackmobile.com
21. The Guts of Git
The Little Bits that Make Git Different
22. What’s With all the Characters?
•
SHA1 Hash e.g.
86650c185eda50c9f9d58e2fbdf8b7113e5dee54
•
Uniquely identifies a commit
•
Secure - very unlikely that someone can tamper
with content in a repository
Presentation
tackmobile.com
23. 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
24. In Git There Are Only...
•
Blobs
•
Trees
•
Commits
Presentation
tackmobile.com
25. 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
26. 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
27. 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
39. 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
42. Branching
•
New branch: git checkout -b <name>
•
A branch is a named ref
•
merging
•
rebasing
Presentation
tackmobile.com
43. How To Think About Branching
•
Mainline
•
What do you want “master” to mean?
•
Topic Branches
•
Branching examples
Presentation
tackmobile.com
44. 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
45. 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
49. 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`
•
… but don’t
Presentation
tackmobile.com
50. Git Pull --rebase
•
Also available: `git pull --rebase`
•
Helpful for avoiding merge commits
•
May cause problems if git can’t automatically
merge
•
Presentation
`git reset HEAD` and start over with normal
`git pull`
tackmobile.com
51. Git Stash
Like a Little Repo In Your Repo
Presentation
tackmobile.com
52. git stash
•
remember: git help stash
•
Stash away changes in a safe place
•
A Workflow:
Stash -> Fix & Commit -> Pop Stash
Presentation
tackmobile.com
53. Cherry Pick
I’ll Take One Of Those... And One Of Those...
Presentation
tackmobile.com
54. Cherry Pick
•
When you need a commit’s changes
•
But not its history
Presentation
tackmobile.com
55. Cherry-pick
git cherry-pick fe594ce
A new commit
with the changes
from fe594ce
master
fb4f5d9
c5083fa
3f43fa3
add_login_activity
9aa8827
Presentation
fe594ce
ccb6f5e
tackmobile.com
58. git revert
•
Commits the reverse of a commit
•
The previous commit is still there
•
!= svn revert
Presentation
tackmobile.com
59. 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
60. 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
61. git reset
•
`git reset [filename]` = opposite of `git add
[filename]`
•
`git reset HEAD` = same as above - acts on all
tracked changes
•
`git reset HEAD^` (also ^^, or ~1, ~42, etc.) =
rollback commits to working tree
•
All examples of “mixed” reset
Presentation
tackmobile.com
62. git reset --soft [commit]
1. Moves HEAD to [commit]
2. Puts the “popped” contents on the index
Presentation
tackmobile.com
63. git reset [commit] (“mixed” - default)
1. Moves HEAD to [commit]
2. Puts the “popped” contents on the index
3. Moves the index’s changes to the working tree
4. Clears the index
Presentation
tackmobile.com
64. git reset --hard [commit] (DESTRUCTIVE!!!)
1. Moves HEAD to [commit]
2. Puts the “popped” contents on the index
3. Moves the index’s changes to the working tree
4. Clears the index
5. Makes the working copy look like the index
Presentation
tackmobile.com
65. 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 different
branch!
Presentation
tackmobile.com
67. Git Flow
•
Conventions to follow
•
Tools to help you follow conventions
•
http://nvie.com/posts/a-successful-gitbranching-model/
Presentation
tackmobile.com
68. Git Flow Conventions: Master Branch
•
The master branch is what is publicly available
now
•
You don’t commit directly to master
Presentation
tackmobile.com
69. Git Flow Conventions: Develop Branch
•
A branch called “develop” is what will become
the next version
•
Day to day work happens on develop
•
“Integration branch”
Presentation
tackmobile.com
70. Git Flow Conventions: Feature Branches
•
Long running development go on feature
branches: “feature/foo”
•
Long running: “more than one commit”
•
Can be pushed to the server and shared
•
Branch from develop
Presentation
tackmobile.com
71. Git Flow Conventions: Hotfixes
•
OMG Problems in Production, create a hotfix:
“hotfix/foo”
•
Branch from master (not develop)
Presentation
tackmobile.com
72. Git Flow Conventions: Releases
•
When a release is almost ready on develop,
create a release branch: “release/2.0.4”
•
Branch from develop
•
Develop continues on for the next release
•
Small changes to release go on release branch
Presentation
tackmobile.com
73. Branch Lifecycle
•
Features
•
•
•
Start from develop
Finished and merged to develop
Releases
•
Start from develop
•
Finished and merged to master and develop
Presentation
tackmobile.com
74. Git Flow in Action: Features
master
develop
feature/somefeature
Presentation
tackmobile.com
76. 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
77. Thank you!
Git for the Android Developer • Tony Hillerson
•
Questions?
•
We’re Hiring! careers@tackmobile.com
•
Excellent Team
•
Awesome Projects
•
Great Office