Git For The Android Developer

Post on 07-May-2015

12.081 views 5 download

description

SL

Transcript of Git For The Android Developer

For the Android DeveloperTony Hillerson, AnDevCon Fall 2011 #AnDevCon #effectiveui @thillersonhttp://www.slideshare.net/thillerson/git-for-android-developers

Git

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

Conference App

➡ Get it, rate stuff

Diving Right InLearning by Doing

or

Simple Workflow

gitinit

changes

gitadd git commit

changes

gitadd git commit

changes

gitadd git commit

... ∞

86650c185eda50c9f9d58e2fbdf8b7113e5dee54

6facfd9f34173f4fb024196996e948a87c85eb56

b02ef5bf190e28ba24eab3ffab6133181cb5b5ef

gitclone

.gitignore

➡ Can be nested deeply➡ https://github.com/github/gitignore

Git Log - The Project’s History

➡ What got committed?➡ Commit messages➡ Content➡ When? Who?

Remotes

➡ remote add➡ clone➡ fetch➡ pull➡ push

Mac

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

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

PreliminariesGetting Git and Getting Set Up

What’s a Git?

A completely ignorant, childish person with no manners.- http://urbandictionary.com

Linus Torvaldshttp://en.wikipedia.org/wiki/Linus_Torvalds

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

Getting Set Up on Mac

➡ Homebrew - http://mxcl.github.com/homebrew/➡ MacPorts - http://www.macports.org/

Getting Set Up on Windows

➡ msysgit -http://code.google.com/p/msysgit/

Getting Set Up on Linux

➡ apt, etc - you probably know the drill

Mac

WIN

Mac

MAC

Gooies!

➡ Git Tower - http://git-tower.com➡ Brother Bard’s GitX fork -

http://brotherbard.com/blog/2010/03/experimental-gitx-fork/

➡ Tortoise Git - http://code.google.com/p/tortoisegit/

Eclipse Integration

➡ http://www.eclipse.org/egit/

The Command LineA Short Sermon

The Guts of GitThe Little Bits that Make Git Different

What’s With all the Characters?

“... 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)

86650c185eda50c9f9d58e2fbdf8b7113e5dee54

➡ SHA1 Hash

➡ Uniquely identifies a commit

➡ Secure - very unlikely that someone can tamper with content in a repository

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

Blobs Are Content

b84ed8ed

e8d5cf6579a3b1

Trees Give Structure

b84ed8ed

e8d5cf6

579a3b1

9899d2c

foo.txt

bar.txt

baz.html

3ffb35b /imagestrees can point to other trees

Commits Point to Trees

b84ed8ed

e8d5cf6

579a3b1

9899d2c

foo.txt

bar.txt

baz.html

3ffb35b /images

d414c3e“Updated the main activity”

Commits have Parents

d414c3e

090c953

4493671

c1d1f60

“Updated the main activity”

“Fixed bug #42”

“Added RoboGuice”

“Initial commit”

Refs Point to Commits

d414c3e

090c953

4493671

c1d1f60

“Updated the main activity”

“Fixed bug #42”

“Added RoboGuice”

“Initial commit”

HEAD

And That’s All You Need To Know About

Git

And That’s All You Need To Know About

Git(Mostly)

Sweet Moves with GitSweet, Sweet Moves

Interactive AddBuilding Semantic Commits

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

Amending A CommitFix the Last Commit

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

Git RevertMore Like Git Reverse

git revert

➡ Commits the reverse of a commit➡ The previous commit is still there➡ != svn revert

Git StashLike a Little Repo In Your Repo

git stash

➡ remember: git help stash➡ Stash away changes in a safe place

BranchingHitting Save Before You Fight the Level Boss

Branching

➡ checkout -b➡ merging➡ rebasing

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

Mac

add_login_activity

Mac

master

Branching

fb4f5d9 c5083fa

9aa8827 fe594ce ccb6f5e

git checkout -b add_login_activity

Mac

add_login_activity

Mac

master

Branching: Merging

fb4f5d9 c5083fa

9aa8827 fe594ce ccb6f5e

3f43fa3

git checkout master

9aa8827 fe594ce ccb6f5e

git merge add_login_activity

Mac

add_login_activity

Mac

master

Branching: Rebasing

fb4f5d9 c5083fa

9aa8827 fe594ce ccb6f5e

3f43fa3

Mac

add_login_activity

Mac

master

fb4f5d9 c5083fa

9aa8827 fe594ce ccb6f5e

3f43fa3

after`git rebase master`

before

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...

Mac

add_login_activity

Mac

master

Cherry-pick

fb4f5d9 c5083fa

9aa8827 fe594ce ccb6f5e

3f43fa3

git cherry-pick fe594ceA new commit with the changes from

fe594ce

Interactive RebaseRewrite History

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

Whoops!Lots Of Ways To Fix It

git checkout

➡ `git checkout [filename]` = remove all unstaged changes

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.

Git

Thank you!#AnDevCon#effectiveui@thillersonhttp://github.com/thillersonhttp://slideshare.com/thillerson

For the Android Developer • Tony Hillerson • AnDevCon Fall 2011

Half Off My Git Course These Slides