Smalltalk on Git

53
Git in a Nutshell Sort of... Mathias Meyer www.paperplanes.de Ruby User Group Berlin

description

An introduction on using git and git-svn.

Transcript of Smalltalk on Git

Page 1: Smalltalk on Git

Git in a NutshellSort of...

Mathias Meyerwww.paperplanes.de

Ruby User Group Berlin

Page 2: Smalltalk on Git

What the git?

• Git is not the next Subversion

• Git is a content tracker

• Git is almost a versioned file system

• Git is distributed

Page 3: Smalltalk on Git

What the git?

• Git is a huge collection of commands

• Git is f***ing fast

Page 4: Smalltalk on Git

Ancient History

• Developed to replace BitKeeper for the Linux kernel development

• Started out as a couple of scripts built by Linus Torvalds

• Used by Rails, Merb, Ubuntu, X.org, Wine, Rubinius and Linux (whoa!)

• Started out focused on development with a central maintainer

Page 5: Smalltalk on Git

Basics

• Every working copy is a full-fledged repository

• Git only tracks content

• Content is identified by a hash

• Though that content has a name

• The same content is only stored once

Page 6: Smalltalk on Git

Basics

• Everything is stored in one .git directory in the top level of your working copy

• Git uses an index to find changes in the working directory

• The index is a snapshot of a specific tree in the repository

Page 7: Smalltalk on Git

Git Objects

• Git knows four types of objects

• Have SHA1 IDs

• Can be addressed with the six first bytes of the hash

• Are compressed with gzip

Page 8: Smalltalk on Git

Commits

• Refers to a tree and usually a parent commit (usually the commit before the current one)

• Can have two or more parents, then they represent a merge

• Or no parent at all

• Stored with a log message

Page 9: Smalltalk on Git

Tree

• A simple structure containing names of blobs and other trees

• Represents a snapshot of the source tree

Page 10: Smalltalk on Git

Blob

• Contains data, e.g. file content

• Blobs don’t have names

• Their names are derived from the tree

• Will be found through associations from trees and commits

Page 11: Smalltalk on Git

Tag

• Glued to a specific object

• Marks a specific point in the Git timeline with a name

Page 12: Smalltalk on Git

HEAD

branch

commit

tree

tree

tree

blob

blob

blob

Page 13: Smalltalk on Git

Git Branches

• master - default development branch

• origin - default upstream branch

• HEAD - current branch

Page 14: Smalltalk on Git

Git Branches

• HEAD~2, master^1, wtf?

• ~N references the Nth generation grandparent of a commit

• ^N references the Nth parent of a commit, only useful for merges of two or more commits

• So....

Page 15: Smalltalk on Git

Git Branches

• HEAD~2 is the second generation grand-parent of the last commit on the current branch

• master^2 is the second parent of the last commit on master

• master~2^2 is the second parent of the second generation grand-parent of the last commit on the current branch

Page 16: Smalltalk on Git

Git Branches

Rrright.

Page 17: Smalltalk on Git

Git Branches

• Branches are cheap and easy

• A branch is an ID pointing to a tree and a parent commit

• Merging is cheap, fast and almost painless

• Ergo: Branching in Git rocks

Page 18: Smalltalk on Git

How Do I Get Git?

• MacPorts (port install git-core +svn)

• Git Installer for Leopard

• On every Linux distribution (apt-get|rpm install git-core)

• On Windows? I think so

Page 19: Smalltalk on Git

How Do I Get Started?

• mkdir project.git

• cd project.git

• git init

• Start hacking

Page 20: Smalltalk on Git

How Do I Get Started?

• Or go to GitHub

• Best GUI for Git evah

Page 21: Smalltalk on Git

Everyday Git

• Some of the commonly used Git commands

• Called the Porcelain

Page 22: Smalltalk on Git

Set up camp

• git config --global user.name “Mathias Meyer”

• git config --global user.email “[email protected]

Page 23: Smalltalk on Git

git clone

• Creates a local working copy of a remote project

• git clone git://github.com/mattmatt/macistrano.git

Page 24: Smalltalk on Git

git checkout

• Checks out code from a branch

• Will overwrite your local changes

• git checkout -b will create a branch and check it out

Page 25: Smalltalk on Git

git branch

• Shows, creates and deletes branches

• git branch master* show_me_the_money

• git branch new_branch

• git branch -d new_branch

Page 26: Smalltalk on Git

git fetch

• Fetches all objects from a remote repository which are not in the local repository

Page 27: Smalltalk on Git

git add

• Schedule changes in one or more files for the next commit

Page 28: Smalltalk on Git

git rm

• Removes files

Page 29: Smalltalk on Git

git mv

• Moves files and directories around

Page 30: Smalltalk on Git

git commit

• Isn’t it obvious?

• It will check in your changes

• But only the ones you added

• Use git commit -a to check in all the changes without adding them

• git commit <file> will commit the file without the need to add it

Page 31: Smalltalk on Git

git status

• Shows staged and unstaged changes

• staged = added

• unstaged = new, conflicts, changed

Page 32: Smalltalk on Git

git push

• Pushes your changes to a remote repository

• git push origin pushes the current branch

• git push origin master pushes the master branch

Page 33: Smalltalk on Git

git pull

• Different way to do a merge

• git pull = git fetch + git merge

Page 34: Smalltalk on Git

git log

• Shows the commit history

• Can be verbose if you want it to

Page 35: Smalltalk on Git

git merge

• Merges the changes from a branch into your current branch

• git merge rails_2_1

• And that’s that

• In case of conflicts, these need to be resolved and then committed

Page 36: Smalltalk on Git

git tag

• Duh!

• Associates a tag with the

Page 37: Smalltalk on Git

git stash• It’s like a clipboard in your repository

• Need to work on something else but don’t want to commit your local changes yet?

• git stash save will save all your changes

• git stash apply will reapply them after you’re done

• git stash list shows all the stashes

• git stash show shows the changes of a stash

Page 38: Smalltalk on Git

git show

• Shows the details of a specified, or the last commit

Page 39: Smalltalk on Git

git archive

• Creates an export of your repository

• Default is tar

• Convenient, no?

• git archive release_2_1 > release_2_1.tar

Page 40: Smalltalk on Git

git ....

• There’s lots more

• Which you probably won’t need most of the time

• You use 20 or so for everyday work

• Some of them only on special occasions

• git-<tab> and start digging

Page 41: Smalltalk on Git

Git-Svn

• The gateway drug for Subversion users

• Warning: You don’t want to use the svn command ever again

• Ever!

Page 42: Smalltalk on Git

Git-Svn

• Basically a couple of Perl scripts

• Using the Subversion bindings

• Translates Subversion commits to Git commits and vice versa

Page 43: Smalltalk on Git

Show me how!

• mkdir webistrano

• git svn init -s http://labs.peritor.com/svn/webistrano

• git svn fetch

• Get a coffee...

Page 44: Smalltalk on Git

Everyday Git-Svn

• git checkout -b make_me_rich

• ...endless hours of coding...

• ...and writing tests...

• git add lib/monetize.rb spec/monetize_spec.rb

• git commit

Page 45: Smalltalk on Git

Everyday Git-Svn - Merging

• git commit -a

• git checkout master

• git svn rebase

• git merge make_me_rich

• ...run tests...

• git svn dcommit

• git branch -d make_me_rich

Page 46: Smalltalk on Git

Everyday Git-Svn - Merging

• The potentiel downside of using git merge:

• git svn dcommit will check in all the commits from the branch in one single svn commit

Page 47: Smalltalk on Git

Everyday Git-Svn - Merging

• The alternative

• dcommit from the branch

• rebase the changes on master

Page 48: Smalltalk on Git

Everyday Git-Svn - Merging

• git commit -a

• git svn rebase # on branch make_me_rich

• git svn dcommit # on branch make_me_rich

• git checkout master

• git svn rebase

• git branch -d make_me_rich

Page 49: Smalltalk on Git

Some Git Awesomeness

• Find out what commits will be ci’d to svn

• git svn dcommit -n (rather sparse)

• git cherry -v trunk (full glory)

• Commit partial changes of a file

• git add --patch

Page 50: Smalltalk on Git

But I don’t like the CLI

• Use git gui for a “nicer” interface

• Use Gitk to visualize commits and branches

• For both: brace yourself to be blinded

• Much nicer, less powerful: GitNub

• TextMate bundle!

Page 51: Smalltalk on Git

In the end...

• Git will blow your brains out

• In several ways

• It takes a while to get used to it

• But it’s totally worth it

• Even if you’re still using Subversion as a central repository

Page 52: Smalltalk on Git

The Bad Stuff

• Poor documentation, be prepared to spend some time on Google

• Complex beast, lots of small commands

• No API