An Introduction to the Git Revision Control System

advertisement
An Introduction to the
Git Revision Control System
Jonathan Adamczewski
This presentation is not
• One VCS is better than another
• Me telling you that you should use Git
• Anyone suggesting that Insomniac will stop
using Perforce
This presentation is an introduction to Git:
• How it works
• Ways that it is or isn’t like Perforce
GIT VS PERFORCE
FIGHT.
Perforce
• Submit
Git
• Commit
Perforce
• Submit
-> Changelist
Git
• Commit (verb)
-> Commit (noun)
Perforce
• Centralized storage
• Centralized history
• Centralized collaboration
• Connection to server is
required
• p4 edit
Git
• Distributed storage
• Distributed, divergent
histories
• Peer to peer collaboration
• Central server optional
• ---
Perforce
• Files are versioned
• Server-wide incrementing
changelist number
Git
• Entire working copy is
versioned (snapshots)
• Every commit has a unique
SHA-1 hash from:
–
–
–
–
Parent commit(s)
Description
Author
Content
Perforce
• Client view maps file in
depots to local files on
client system
Git
• Every clone of a git
repository stores the entire
history of the repository
“A Perforce branch is a branch of file hierarchy.
A Git branch is a branch of workspace history.”
Perforce
• One set of local changes per
file
• No history stored outside of
the server
Git
• Create arbitrary file
histories and store them in
local branches
Perforce
• Branching
– Cost scales with size
– Expressed as a duplication
and divergence in the file
hierarchy
• Branch cost depends on the
size & number of files being
branched
Git
• Branching is
– Very cheap
– Expressed as a new pointer
associated with a single
commit
• Branch cost is constant:
One 41 byte file per branch.
Perforce
• Changing branches usually
means moving to a different
directory
Git
• Changing branches usually
happens in one working
copy
cd \core\users\jadamczewski
\code
git checkout some_branch
Perforce
• One set of local changes per
file
• Looks like:
– File can be in only one
pending changelist
– Easy to miss files when
submitting
Git
• Arbitrary local histories
• Looks like
– Nothing quite like
pending changelists
– Modified files are staged and
then committed
With great power comes great blahblablah
Perforce
• One set of local changes per
file
• One resolve per file before
submit
Git
• Potentially many local
changes per file
• Potentially many resolves
per file before submit
– Not usually that bad
– git rebase
Perforce
• A mighty server dedicated
to storing all the versions of
all the files
• Handles anything and
everything – text, binary,
large, small
Git
• Every user’s machine is
their git server – not
dedicated to just git
• Not good with large,
frequently changing binary
files
– Repo size increases quickly
Perforce
• shelve
– For backup and collaboration
– Stores a copy on the server
– Allows local revert without
losing changes
• Generally inconvenient to
move uncommitted changes
between branches
Git
• branch/commit
– Store a copy in the local repo
• clone or push
(or just copy the repo)
– Duplicate the [contents of]
the repo somewhere else
– For backup and collaboration
• Many ways to get commits
from another repo
Perforce
• shelve
– Sometimes just to stash some
changes easily off to the side
Git
• stash
– Just to stash some changes
easily of to the side
– stashed changes are kept in a
stack, and can be re-applied
later
Perforce
• Submit means there is
redundancy – the data
exists on your machine and
the server.
Git
• Commit only stores changes
on your local HDD
• Need to push, copy, or
otherwise share the commit
to have a redundant copy
• Git directory structure:
repo_dir/
.git/<git’s many files>
your workspace
• How to commit a file:
– Make changes to files in the working directory.
Does not require marking for edit.
(edit, add, delete, copy, etc)
– Stage the files for commit.
Does not affect the recorded history for the
current branch
git add, git rm, git mv
– Commit the files to the repository.
git commit
• http://git-scm.com/book/en/Distributed-GitDistributed-Workflows shows what some real
world distributed workflows look like
• http://git-scm.com/book/en/Distributed-GitMaintaining-a-Project has information about
maintaining repos in a distributed
environment
Some commonly used git commands
# reset contents of working dir
git reset
# manipulate branches
git branch
# populate working dir with a commit
git checkout
# merge multiple branches
git merge
# reapply changes to a different
# commit
git rebase
# rewrite history
git rebase –i
# stage a file for commit
git add
# stage parts of files for commit
git add -i
# show the current state of the
# working dir. Lists new and modified
# files and files staged for commit
git status
# list commits in a branch from the
# most recent
git log
# list files know to git in a branch
git ls-files
# search through files known to git –
# very fast!
git grep
# show changes between things
git diff
# get a basic graphical UI
gitk
# copy commits from one branch to another
git cherry-pick
Download