Smalltalk on Git
-
Upload
mattmatt -
Category
Technology
-
view
5.335 -
download
1
description
Transcript of Smalltalk on Git
Git in a NutshellSort of...
Mathias Meyerwww.paperplanes.de
Ruby User Group Berlin
What the git?
• Git is not the next Subversion
• Git is a content tracker
• Git is almost a versioned file system
• Git is distributed
What the git?
• Git is a huge collection of commands
• Git is f***ing fast
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
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
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
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
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
Tree
• A simple structure containing names of blobs and other trees
• Represents a snapshot of the source tree
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
Tag
• Glued to a specific object
• Marks a specific point in the Git timeline with a name
HEAD
branch
commit
tree
tree
tree
blob
blob
blob
Git Branches
• master - default development branch
• origin - default upstream branch
• HEAD - current branch
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....
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
Git Branches
Rrright.
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
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
How Do I Get Started?
• mkdir project.git
• cd project.git
• git init
• Start hacking
How Do I Get Started?
• Or go to GitHub
• Best GUI for Git evah
Everyday Git
• Some of the commonly used Git commands
• Called the Porcelain
Set up camp
• git config --global user.name “Mathias Meyer”
• git config --global user.email “[email protected]”
git clone
• Creates a local working copy of a remote project
• git clone git://github.com/mattmatt/macistrano.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
git branch
• Shows, creates and deletes branches
• git branch master* show_me_the_money
• git branch new_branch
• git branch -d new_branch
git fetch
• Fetches all objects from a remote repository which are not in the local repository
git add
• Schedule changes in one or more files for the next commit
git rm
• Removes files
git mv
• Moves files and directories around
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
git status
• Shows staged and unstaged changes
• staged = added
• unstaged = new, conflicts, changed
git push
• Pushes your changes to a remote repository
• git push origin pushes the current branch
• git push origin master pushes the master branch
git pull
• Different way to do a merge
• git pull = git fetch + git merge
git log
• Shows the commit history
• Can be verbose if you want it to
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
git tag
• Duh!
• Associates a tag with the
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
git show
• Shows the details of a specified, or the last commit
git archive
• Creates an export of your repository
• Default is tar
• Convenient, no?
• git archive release_2_1 > release_2_1.tar
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
Git-Svn
• The gateway drug for Subversion users
• Warning: You don’t want to use the svn command ever again
• Ever!
Git-Svn
• Basically a couple of Perl scripts
• Using the Subversion bindings
• Translates Subversion commits to Git commits and vice versa
Show me how!
• mkdir webistrano
• git svn init -s http://labs.peritor.com/svn/webistrano
• git svn fetch
• Get a coffee...
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
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
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
Everyday Git-Svn - Merging
• The alternative
• dcommit from the branch
• rebase the changes on master
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
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
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!
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
The Bad Stuff
• Poor documentation, be prepared to spend some time on Google
• Complex beast, lots of small commands
• No API
Resources• Git Home (http://www.git.or.cz)
• Git User’s Manual (http://www.kernel.org/pub/software/scm/git/docs/user-manual.html)
• Git PeepCode (http://peepcode.com/products/git)
• Must-read: Git Internals (http://peepcode.com/products/git-internals-pdf)
• GitCasts (http://www.gitcasts.com/)