Upload
ricardoerikson
View
23
Download
0
Embed Size (px)
DESCRIPTION
Introduction to Git with distributed version control system. This document presents workflows, and the main concepts and commands used in Git.
Citation preview
Git Is Simpler Than You Think
$git me.name Ricardo Erikson$git me.email [email protected]
Scott Chacon (github co-founder)
If you are comfortable with version control and its a version control that is not git, you are going to hate git when
you start using it.
git is an open source, distributed version control
system designed for speed and efficiency.
References
http://gitref.org
http://try.github.io
http://git-scm.com/doc
http://stackoverflow.com
distributed git
every developer is potentially both a node or a hub
remote repository
remote repository
local repository
remote repository
local repository
git clone git pull
git remote
remote repository
local repository
git clone git pull
git remotegit push
you do a clone of the entire repository
which means
which means
everything is fast
every clone is a backup
work offline
no network needed
performing a diff
viewing file history
committing changes
no network needed
merging branches
obtaining other revisions of a file
switching branches
subversion-style workflow
subversion-style workflow
shared repository public
subversion-style workflow
shared repository
developer developer developer
public
private
subversion-style workflow
shared repository
developer developer developer
public
private
integration manager workflow
integration manager workflow
publicprivate
integration manager workflow
blessed repository
publicprivate
integration manager workflow
blessed repository
developer public
developer public
publicprivate
integration manager workflow
blessed repository
developer public
developer public
integration manager
publicprivate
integration manager workflow
blessed repository
developer public
developer public
developer private
developer private
integration manager
publicprivate
integration manager workflow
blessed repository
developer public
developer public
developer private
developer private
integration manager
publicprivate
git push to publish the changes (commits) to the remote repository
integration manager workflow
blessed repository
developer public
developer public
developer private
developer private
integration manager
publicprivate
merge request
integration manager workflow
blessed repository
developer public
developer public
developer private
developer private
integration manager
publicprivate
git push to publish the local changes to the blessed repository
integration manager workflow
blessed repository
developer public
developer public
developer private
developer private
integration manager
publicprivate
git pull to update the local repository
branching and merging
(git allows and encourages) multiple local branches
!
fast creation, merging and deletion !
branching is cheap
you can do things like
frictionless context switching
role-based codelines & feature based workflow
disposable experimentation
frictionless context switching
master
develop
frictionless context switching
master
develop
topic branches
frictionless context switching
master
develop
topic branches
frictionless context switching
master
develop
topic branches
role-based codelines & feature based workflow
master
develop
role-based codelines & feature based workflow
master
develop
production code
role-based codelines & feature based workflow
master
develop
production code
merge
role-based codelines & feature based workflow
master
develop
production code
merge
feature/x
feature/y
bugfix/z
disposable experimentation
master
develop
topic branches
disposable experimentation
master
develop
topic branches
disposable experimentation
master
develop
topic branches
disposable experimentation
master
develop
topic branches
staging area
staging area
Intermediate area where commits can be formatted and reviewed before
completing the commit
Automatically stage files that have been modified
and deleted
New files are not affected!
$ git commit -a
Automatically stage files that have been modified
and deleted
New files are not affected!
working directory
staging area
repository
$ git commit -a
Getting and Creating Projects
getting a git repository
getting a git repository
initialize a new one from an existing directory
getting a git repository
initialize a new one from an existing directory
clone one from a public Git repository
git init
git init$ mkdir mygitproject
git init$ mkdir mygitproject$ cd mygitproject
git init$ mkdir mygitproject$ cd mygitproject$ echo README >> README
git init$ mkdir mygitproject$ cd mygitproject$ echo README >> README$ ls -a. .. README
git init$ mkdir mygitproject$ cd mygitproject$ echo README >> README$ ls -a. .. README
$ git initInitialized empty Git repository in /tmp/mygitproject/.git/
git init$ mkdir mygitproject$ cd mygitproject$ echo README >> README$ ls -a. .. README
$ git initInitialized empty Git repository in /tmp/mygitproject/.git/
$ ls -a. .. .git README
git init$ mkdir mygitproject$ cd mygitproject$ echo README >> README$ ls -a. .. README
$ git initInitialized empty Git repository in /tmp/mygitproject/.git/
$ ls -a. .. .git README
git init
git init$ cat .git/config[core]
repositoryformatversion = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = false
git clone
git clone$ git clone git://github.com/schacon/simplegit.git
Cloning into 'simplegit'...remote: Reusing existing pack: 13, done.remote: Total 13 (delta 0), reused 0 (delta 0)Receiving objects: 100% (13/13), done.Resolving deltas: 100% (2/2), done.
git clone$ git clone git://github.com/schacon/simplegit.git
$ cd simplegit
Cloning into 'simplegit'...remote: Reusing existing pack: 13, done.remote: Total 13 (delta 0), reused 0 (delta 0)Receiving objects: 100% (13/13), done.Resolving deltas: 100% (2/2), done.
git clone$ git clone git://github.com/schacon/simplegit.git
$ cd simplegit$ ls -a
Cloning into 'simplegit'...remote: Reusing existing pack: 13, done.remote: Total 13 (delta 0), reused 0 (delta 0)Receiving objects: 100% (13/13), done.Resolving deltas: 100% (2/2), done.
. .. .git README Rakefile lib
git clone
git clone$ cat .git/config[core]
repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = false
[remote "origin"]url = git://github.com/schacon/simplegit.git fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]remote = origin merge = refs/heads/master
Basic Snapshotting
git add adds file contents to the staging areagit status view the status of your file in the working directory and stage area
git add adds file contents to the staging area
$ git status -s?? README?? hello.rb
git status view the status of your file in the working directory and stage area
git add adds file contents to the staging area
$ git status -s?? README?? hello.rb
$ git add README hello.rbA READMEA hello.rb
git status view the status of your file in the working directory and stage area
git add adds file contents to the staging area
$ git status -s?? README?? hello.rb
$ git add README hello.rbA READMEA hello.rb
$ vim README$ git status -sAM READMEA hello.rb
git status view the status of your file in the working directory and stage area
git diff shows diff of what is staged and what is modified but unstaged
git diff shows diff of what is staged and what is modified but unstaged
$ vim hello.rb$ git status -s M hello.rb$ git diffdiff --git a/hello.rb b/hello.rbindex d62ac43..8d15d50 100644--- a/hello.rb+++ b/hello.rb@@ -1,7 +1,7 @@ class HelloWorld! def self.hello- puts "hello world"+ puts "hola mundo" end! end
other diff commands
git diff --cached shows diff of staged changes
git diff HEAD shows diff of all staged or unstaged changes
git diff --stat shows summary of changes instead of a full diff
git commit records a snapshot of the staging area
git commit records a snapshot of the staging area
$ git config --global user.name 'Your Name'$ git config --global user.email [email protected]
git commit records a snapshot of the staging area
$ git config --global user.name 'Your Name'$ git config --global user.email [email protected]
$ git add hello.rb $ git status -sM hello.rb$ git commit -m 'my hola mundo changes'[master 68aa034] my hola mundo changes 1 files changed, 2 insertions(+), 1 deletions(-)
git commit records a snapshot of the staging area
$ git config --global user.name 'Your Name'$ git config --global user.email [email protected]
$ git add hello.rb $ git status -sM hello.rb$ git commit -m 'my hola mundo changes'[master 68aa034] my hola mundo changes 1 files changed, 2 insertions(+), 1 deletions(-)
$ git status# On branch masternothing to commit (working directory clean)
basic git workflow
1 Edit filesEclipse/Sublime/vim/emacs/etc
basic git workflow
1 Edit filesEclipse/Sublime/vim/emacs/etc
2 Stage the changes$git add (file)
basic git workflow
1 Edit filesEclipse/Sublime/vim/emacs/etc
2 Stage the changes$git add (file)
3 Review the changes$git diff / $git status
basic git workflow
1 Edit filesEclipse/Sublime/vim/emacs/etc
2 Stage the changes$git add (file)
3 Review the changes$git diff / $git status
4 Commit the changes$git commit
or
1 Edit filesEclipse/Sublime/vim/emacs/etc
or
1 Edit filesEclipse/Sublime/vim/emacs/etc
2 Stage and commit$git commit -a