Date post: | 18-Jun-2015 |
Category: |
Technology |
Upload: | tack-mobile |
View: | 1,072 times |
Download: | 0 times |
PRESENTATION ANDEVCON • MAY 14, 2012
For the Android DeveloperTony Hillerson, AnDevCon Spring 2012#AnDevCon @tackmobile @thillersonhttp://www.slideshare.net/thillerson/git-for-android-developers
Git
PRESENTATION tackmobile.com
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 ANDEVCON • MAY 14, 2012
Diving Right InLearning by Doing
tackmobile.comPRESENTATION
orgitinit
changes
gitadd git commit
changes
gitadd git commit
changes
gitadd git commit
... ∞
86650c185eda50c9f9d58e2fbdf8b7113e5dee54
6facfd9f34173f4fb024196996e948a87c85eb56
b02ef5bf190e28ba24eab3ffab6133181cb5b5ef
gitclone
PRESENTATION tackmobile.com
.gitignore
• Can be nested deeply
• https://github.com/github/gitignore
PRESENTATION tackmobile.com
Git Log - The Project’s History
• What got committed?
• Commit messages
• Content
• When? Who?
PRESENTATION tackmobile.com
Remotes
• remote add
• clone
• fetch
• pull
• push
PRESENTATION tackmobile.com
master
Tagging
fb4f5d9 c5083fa 3f43fa3
git tag -a -m"Tagging v1.0" v1.0 c5083fa
• 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 ANDEVCON • MAY 14, 2012
PreliminariesGetting Git and Getting Set Up
PRESENTATION tackmobile.com
What’s a Git?A completely ignorant, childish person with no manners. - http://urbandictionary.com
Linus Torvaldshttp://en.wikipedia.org/wiki/Linus_Torvalds
PRESENTATION 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
WIN
MAC
Gooies!• Git Tower - http://git-tower.com
• Source Tree - Mac App Store
• Brother Bard’s GitX fork - http://brotherbard.com/blog/2010/03/experimental-gitx-fork/
• Tortoise Git - http://code.google.com/p/tortoisegit/
PRESENTATION tackmobile.com
Eclipse Integration• http://www.eclipse.org/egit/
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 ANDEVCON • MAY 14, 2012
The Command LineA Short Sermon
PRESENTATION ANDEVCON • MAY 14, 2012
The Guts of GitThe Little Bits that Make Git Different
PRESENTATION tackmobile.com
What’s With all the Characters?
• SHA1 Hash
• Uniquely identifies a commit
• Secure - very unlikely that someone can tamper with content in a repository
86650c185eda50c9f9d58e2fbdf8b7113e5dee54
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
e8d5cf6579a3b1
PRESENTATION tackmobile.com
Trees Give Structure
b84ed8ed
e8d5cf6
579a3b1
9899d2c
foo.txt
bar.txt
baz.html
3ffb35b /imagestrees can point to other trees
PRESENTATION tackmobile.com
Commits Point to Trees
b84ed8ed
e8d5cf6
579a3b1
9899d2c
foo.txt
bar.txt
baz.html
3ffb35b /images
d414c3e“Updated the main activity”
PRESENTATION tackmobile.com
Commits Have Parents
d414c3e
090c953
4493671
c1d1f60
“Updated the main activity”
“Fixed bug #42”
“Added RoboGuice”
“Initial commit”
PRESENTATION tackmobile.com
Refs Point to Commits
d414c3e
090c953
4493671
c1d1f60
“Updated the main activity”
“Fixed bug #42”
“Added RoboGuice”
“Initial commit”
HEAD
tackmobile.comPRESENTATION
And That’s All You Need To Know About
Git
tackmobile.comPRESENTATION
(Mostly)
And That’s All You Need To Know About
Git
PRESENTATION ANDEVCON • MAY 14, 2012
Sweet Moves with GitSweet, Sweet Moves
PRESENTATION ANDEVCON • MAY 14, 2012
Interactive AddBuilding Semantic Commits
PRESENTATION tackmobile.com
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 ANDEVCON • MAY 14, 2012
Amending A CommitFix the Last Commit
PRESENTATION tackmobile.com
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 ANDEVCON • MAY 14, 2012
Git RevertMore Like Git Reverse
PRESENTATION tackmobile.com
git revert
• Commits the reverse of a commit
• The previous commit is still there
• != svn revert
PRESENTATION ANDEVCON • MAY 14, 2012
Git StashLike a Little Repo In Your Repo
PRESENTATION tackmobile.com
git stash
• remember: git help stash
• Stash away changes in a safe place
PRESENTATION ANDEVCON • MAY 14, 2012
BranchingHitting Save Before You Fight the Level Boss
PRESENTATION tackmobile.com
Branching
• checkout -b
• merging
• rebasing
PRESENTATION tackmobile.com
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
add_login_activity
master
Branching
fb4f5d9 c5083fa
9aa8827 fe594ce ccb6f5e
git checkout -b add_login_activity
PRESENTATION tackmobile.com
add_login_activity
master
Branching: Merging
fb4f5d9 c5083fa
9aa8827 fe594ce ccb6f5e
3f43fa3
git checkout master
9aa8827 fe594ce ccb6f5e
git merge add_login_activity
PRESENTATION tackmobile.com
add_login_activity
master
Branching: Rebasing
fb4f5d9 c5083fa
9aa8827 fe594ce ccb6f5e
3f43fa3
add_login_activity
master
fb4f5d9 c5083fa
9aa8827 fe594ce ccb6f5e
3f43fa3
after`git rebase master`
before
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 ANDEVCON • MAY 14, 2012
Cherry PickI’ll Take One Of Those... And One Of Those...
PRESENTATION tackmobile.com
add_login_activity
master
Cherry-pick
fb4f5d9 c5083fa
9aa8827 fe594ce ccb6f5e
3f43fa3
git cherry-pick fe594ce
A new commit with the changes from
fe594ce
PRESENTATION ANDEVCON • MAY 14, 2012
Interactive RebaseRewrite History
PRESENTATION tackmobile.com
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 ANDEVCON • MAY 14, 2012
Whoops!Lots Of Ways To Fix It
PRESENTATION tackmobile.com
git checkout
• `git checkout [filename]` = remove all unstaged changes
PRESENTATION tackmobile.com
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.
tackmobile.comPRESENTATION
Thank you!#AnDevCon@tackmobile@thillerson
http://github.com/thillersonhttp://slideshare.com/thillerson
For the Android Developer • Tony Hillerson • AnDevCon Spring 2012