Git Introduction
Fast Version Control
Who am I
• Gareth Hall
• Lead Developer and Hyundai New Zealand
• Director at Communica
(http://communica.co.nz)
What is git?
• Git is a distribute version control system
developed by Junio Hamano & Linus
Torvalds.
• Git does not use a centralised server.
• Git runs on major operating system like OS
X, Windows, Unix & Linux
Why it’s named git?
• Quoting Linus: “I’m egotistical, and I name
all my projects after myself. First Linux, now
git”
• Def: git - British slang for “pig headed, they
are always correct , argumentative”
What does git do?
• Git tracks changes to content.
Advantages of git
• Everything is local (almost)
• Fast
• Every clone / branch is a backup
• Work offline
• No single point of failure
• Lightweight
• Branching is cheap and merging is easy
• Many different workflows possible
• Distributed
• Every file and commit is checksummed
• Staging area
• Free and open source
Three States
Individual Workflow
Collaborative Workflow
Gitflow 1
Gitflow II
Basic Commands
Syntax: git <subcmd>
git init
•Create an empty git repository or reinitialize
an existing one
#:>git init
Initialized empty Git repository in
/Users/garethhall/Sites/git_intro/.git/
git status
• Show the working tree status
#:>git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# includes/
# index.php
nothing added to commit but untracked files present (use "git add" to track)
git add
• Add file contents to the index
• git add .
• git add <filename> <filenname>
git status
#:>git add .
#:>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: includes/helpers.php
# new file: index.php
#
git commit
•Record changes to the repository
#:>git commit -m "first commit"
[master (root-commit) 5f8a8d4] first commit
2 files changed, 48 insertions(+)
create mode 100644 includes/helpers.php
create mode 100644 index.php
git log
•Show commit logs
#:>git log
commit 5f8a8d486ae1656b51194186c0dfb97ae1ec9835
Author: Gareth Hall <gareth@communica.co.nz>
Date: Sat Feb 16 14:43:40 2013 +1300
first commit
Edit files
#:>git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: includes/helpers.php
# modified: index.php
#
no changes added to commit (use "git add" and/or "git commit -a")
#:>git add index.php
#:>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.php
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: includes/helpers.php
#
• #:>git commit -m "Changed output to table"
[master fffacb4] Changed output to table
1 file changed, 10 insertions(+), 2 deletions(-)
#:>git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: includes/helpers.php
#
no changes added to commit (use "git add" and/or "git commit -a")
#:>git log
commit fffacb43627c5a44850b4b1543dc359f5d95edd6
Author: Gareth Hall <gareth@communica.co.nz>
Date: Sat Feb 16 16:10:45 2013 +1300
Changed output to table
commit 5f8a8d486ae1656b51194186c0dfb97ae1ec9835
Author: Gareth Hall <gareth@communica.co.nz>
Date: Sat Feb 16 14:43:40 2013 +1300
first commit
#:>git diff includes/helpers.php
diff --git a/includes/helpers.php b/includes/helpers.php
index 5c9a1fe..002256c 100644
--- a/includes/helpers.php
+++ b/includes/helpers.php
@@ -1,5 +1,4 @@
<?php
-
/**
* Pretty Print Helper
*
@@ -28,6 +27,12 @@ function dd($data, $die = false)
{
echo '<pre>';
var_dump($data);
- echo '</pre>';
- $die ? die() : null;
-}
 No newline at end of file
+ echo '</pre>';
+ $die ? die() : null;
+}
+
+function logger($user_id, $message)
+{
+ $log_entry = $user_id . ',' . $message;
+ return file_put_contents('log.log', $log_entry) ? true : false;
+}
git diff
#:>git add .
#:>git commit -m "Added logger"
[master 817dee6] Added logger
1 file changed, 9 insertions(+), 4 deletions(-)
#:>git log --oneline --decorate
817dee6 (HEAD, master) Added logger
fffacb4 Changed output to table
5f8a8d4 first commit
git show• Show various types of objects
#:>git show fffacb4
commit fffacb43627c5a44850b4b1543dc359f5d95edd6
Author: Gareth Hall <gareth@communica.co.nz>
Date: Sat Feb 16 16:10:45 2013 +1300
Changed output to table
diff --git a/index.php b/index.php
index f1f4a05..df11b0b 100644
--- a/index.php
+++ b/index.php
@@ -10,6 +10,14 @@ if (($xml = @simplexml_load_file('https://www.bnz.co.nz/XMLFeed/portal/fcs/xml')
}
}
-pp($bnz_rates, true);
-
+print '<table border="1">';
+ print '<tr>';
+ print '<th>Code</th><th>Rate</th>';
+ print '</tr>';
+ foreach ($bnz_rates as $code => $rate){
+ print '<tr>';
+ print '<th>' . $code . '</th><th>' . $rate . '</th>';
+ print '</tr>';
+ }
+print '</table>';
git branch
•List, create, or delete branches
#:>git branch outputHelper
#:>git branch
* master
outputHelper
git checkout
•Checkout a branch or paths to the working tree
#:>git checkout outputHelper
Switched to branch 'outputHelper'
#:>git branch
master
* outputHelper
Develop new Feature
#:>git status
# On branch outputHelper
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: includes/helpers.php
# modified: index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# includes/.DS_Store
# includes/output_helper.php
no changes added to commit (use "git add" and/or "git commit -a")
#:>git add includes/helpers.php
#:>git commit -m 'Added doc block to logger function'
[outputHelper df78fc4] Added doc block to logger function
1 file changed, 8 insertions(+)
#:>git commit -a -m 'Refactored with new table output helper'
[outputHelper 51da4b7] Refactored with new table output helper
3 files changed, 38 insertions(+), 11 deletions(-)
create mode 100644 includes/.DS_Store
create mode 100644 includes/output_helper.php
#:>git log --oneline --decorate --graph
* 51da4b7 (HEAD, outputHelper) Refactored with new table output helper
* df78fc4 Added doc block to logger function
* 817dee6 (master) Added logger
* fffacb4 Changed output to table
* 5f8a8d4 first commit
#:>git checkout master
Switched to branch 'master'
#:>git log --oneline --decorate --graph
* 817dee6 (HEAD, master) Added logger
* fffacb4 Changed output to table
* 5f8a8d4 first commit
git merge
• Join two or more development histories together
#:>git merge outputHelper
Updating 817dee6..51da4b7
Fast-forward
includes/.DS_Store | Bin 0 -> 6148 bytes
includes/helpers.php | 8 ++++++++
includes/output_helper.php | 36 ++++++++++++++++++++++++++++++++++++
index.php | 13 ++-----------
4 files changed, 46 insertions(+), 11 deletions(-)
create mode 100644 includes/.DS_Store
create mode 100644 includes/output_helper.php
#:>git log --oneline --decorate --graph
* 51da4b7 (HEAD, outputHelper, master) Refactored with new
table output helper
* df78fc4 Added doc block to logger function
* 817dee6 Added logger
* fffacb4 Changed output to table
* 5f8a8d4 first commit
git reset
• Reset current HEAD to the specified state
git push
• Update remote refs along with associated
objects
git fetch
• Download objects and refs from another
repository
git merge
• Join two or more development histories
together
git pull
• Fetch from and merge with another
repository or a local branch
• fetch + merge
How in Drupal?
• Add all of Drupal to git
• Use the Features module to move
configuration
• UUID Features to move content (alpha!)
Git Hosting Service
• Bitbucket (htt://bitbucket.org)
• Github (http://github.com)
• Run your own
• Gitosis
• Gitolite
Deployment
• Shell Access
• Continous Integration
• I don’t have shell access
• Setup your server as a remote
Deployment with shell
Continous Intergration
• Heroku (http://heroku.com)
• Pagoda (http://pagodabox.com)
• Bamboo
(http://atlassian.com/software/bamboo)
I don’t have shell
• Deploy (http://www.deployhq.com)
Server as Remote
• Will need to use git hooks
Git Hooks
Git Hooks
• #>vim post-receive
• #!/bin/sh
• cd ..
• GIT_DIR='.git'
• umask 002 && git reset --hard
Git GUI’s
Resources
• Git (http://git-scm.com)
• Wiki
(http://en.wikipedia.org/wiki/Git_(software)
)
• Git Essentials
(https://tutsplus.com/course/git-essentials/)
• Change Management andVersion Control
(http://buildamodule.com)
Visual Version Control
Gource (http://code.google.com/p/gource/)
Questions

Git Introduction

  • 1.
  • 2.
    Who am I •Gareth Hall • Lead Developer and Hyundai New Zealand • Director at Communica (http://communica.co.nz)
  • 3.
    What is git? •Git is a distribute version control system developed by Junio Hamano & Linus Torvalds. • Git does not use a centralised server. • Git runs on major operating system like OS X, Windows, Unix & Linux
  • 4.
    Why it’s namedgit? • Quoting Linus: “I’m egotistical, and I name all my projects after myself. First Linux, now git” • Def: git - British slang for “pig headed, they are always correct , argumentative”
  • 5.
    What does gitdo? • Git tracks changes to content.
  • 6.
    Advantages of git •Everything is local (almost) • Fast • Every clone / branch is a backup • Work offline • No single point of failure • Lightweight • Branching is cheap and merging is easy • Many different workflows possible • Distributed • Every file and commit is checksummed • Staging area • Free and open source
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
    git init •Create anempty git repository or reinitialize an existing one #:>git init Initialized empty Git repository in /Users/garethhall/Sites/git_intro/.git/
  • 14.
    git status • Showthe working tree status #:>git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # includes/ # index.php nothing added to commit but untracked files present (use "git add" to track)
  • 15.
    git add • Addfile contents to the index • git add . • git add <filename> <filenname>
  • 16.
    git status #:>git add. #:>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: includes/helpers.php # new file: index.php #
  • 17.
    git commit •Record changesto the repository #:>git commit -m "first commit" [master (root-commit) 5f8a8d4] first commit 2 files changed, 48 insertions(+) create mode 100644 includes/helpers.php create mode 100644 index.php
  • 18.
    git log •Show commitlogs #:>git log commit 5f8a8d486ae1656b51194186c0dfb97ae1ec9835 Author: Gareth Hall <gareth@communica.co.nz> Date: Sat Feb 16 14:43:40 2013 +1300 first commit
  • 19.
  • 20.
    #:>git status # Onbranch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: includes/helpers.php # modified: index.php # no changes added to commit (use "git add" and/or "git commit -a")
  • 21.
    #:>git add index.php #:>gitstatus # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.php # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: includes/helpers.php #
  • 22.
    • #:>git commit-m "Changed output to table" [master fffacb4] Changed output to table 1 file changed, 10 insertions(+), 2 deletions(-) #:>git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: includes/helpers.php # no changes added to commit (use "git add" and/or "git commit -a")
  • 23.
    #:>git log commit fffacb43627c5a44850b4b1543dc359f5d95edd6 Author:Gareth Hall <gareth@communica.co.nz> Date: Sat Feb 16 16:10:45 2013 +1300 Changed output to table commit 5f8a8d486ae1656b51194186c0dfb97ae1ec9835 Author: Gareth Hall <gareth@communica.co.nz> Date: Sat Feb 16 14:43:40 2013 +1300 first commit
  • 24.
    #:>git diff includes/helpers.php diff--git a/includes/helpers.php b/includes/helpers.php index 5c9a1fe..002256c 100644 --- a/includes/helpers.php +++ b/includes/helpers.php @@ -1,5 +1,4 @@ <?php - /** * Pretty Print Helper * @@ -28,6 +27,12 @@ function dd($data, $die = false) { echo '<pre>'; var_dump($data); - echo '</pre>'; - $die ? die() : null; -} No newline at end of file + echo '</pre>'; + $die ? die() : null; +} + +function logger($user_id, $message) +{ + $log_entry = $user_id . ',' . $message; + return file_put_contents('log.log', $log_entry) ? true : false; +} git diff
  • 25.
    #:>git add . #:>gitcommit -m "Added logger" [master 817dee6] Added logger 1 file changed, 9 insertions(+), 4 deletions(-) #:>git log --oneline --decorate 817dee6 (HEAD, master) Added logger fffacb4 Changed output to table 5f8a8d4 first commit
  • 26.
    git show• Showvarious types of objects #:>git show fffacb4 commit fffacb43627c5a44850b4b1543dc359f5d95edd6 Author: Gareth Hall <gareth@communica.co.nz> Date: Sat Feb 16 16:10:45 2013 +1300 Changed output to table diff --git a/index.php b/index.php index f1f4a05..df11b0b 100644 --- a/index.php +++ b/index.php @@ -10,6 +10,14 @@ if (($xml = @simplexml_load_file('https://www.bnz.co.nz/XMLFeed/portal/fcs/xml') } } -pp($bnz_rates, true); - +print '<table border="1">'; + print '<tr>'; + print '<th>Code</th><th>Rate</th>'; + print '</tr>'; + foreach ($bnz_rates as $code => $rate){ + print '<tr>'; + print '<th>' . $code . '</th><th>' . $rate . '</th>'; + print '</tr>'; + } +print '</table>';
  • 27.
    git branch •List, create,or delete branches #:>git branch outputHelper #:>git branch * master outputHelper
  • 28.
    git checkout •Checkout abranch or paths to the working tree #:>git checkout outputHelper Switched to branch 'outputHelper' #:>git branch master * outputHelper
  • 29.
  • 30.
    #:>git status # Onbranch outputHelper # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: includes/helpers.php # modified: index.php # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # includes/.DS_Store # includes/output_helper.php no changes added to commit (use "git add" and/or "git commit -a")
  • 31.
    #:>git add includes/helpers.php #:>gitcommit -m 'Added doc block to logger function' [outputHelper df78fc4] Added doc block to logger function 1 file changed, 8 insertions(+) #:>git commit -a -m 'Refactored with new table output helper' [outputHelper 51da4b7] Refactored with new table output helper 3 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 includes/.DS_Store create mode 100644 includes/output_helper.php
  • 32.
    #:>git log --oneline--decorate --graph * 51da4b7 (HEAD, outputHelper) Refactored with new table output helper * df78fc4 Added doc block to logger function * 817dee6 (master) Added logger * fffacb4 Changed output to table * 5f8a8d4 first commit #:>git checkout master Switched to branch 'master' #:>git log --oneline --decorate --graph * 817dee6 (HEAD, master) Added logger * fffacb4 Changed output to table * 5f8a8d4 first commit
  • 33.
    git merge • Jointwo or more development histories together #:>git merge outputHelper Updating 817dee6..51da4b7 Fast-forward includes/.DS_Store | Bin 0 -> 6148 bytes includes/helpers.php | 8 ++++++++ includes/output_helper.php | 36 ++++++++++++++++++++++++++++++++++++ index.php | 13 ++----------- 4 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 includes/.DS_Store create mode 100644 includes/output_helper.php
  • 34.
    #:>git log --oneline--decorate --graph * 51da4b7 (HEAD, outputHelper, master) Refactored with new table output helper * df78fc4 Added doc block to logger function * 817dee6 Added logger * fffacb4 Changed output to table * 5f8a8d4 first commit
  • 35.
    git reset • Resetcurrent HEAD to the specified state
  • 36.
    git push • Updateremote refs along with associated objects
  • 37.
    git fetch • Downloadobjects and refs from another repository
  • 38.
    git merge • Jointwo or more development histories together
  • 39.
    git pull • Fetchfrom and merge with another repository or a local branch • fetch + merge
  • 40.
    How in Drupal? •Add all of Drupal to git • Use the Features module to move configuration • UUID Features to move content (alpha!)
  • 41.
    Git Hosting Service •Bitbucket (htt://bitbucket.org) • Github (http://github.com) • Run your own • Gitosis • Gitolite
  • 42.
    Deployment • Shell Access •Continous Integration • I don’t have shell access • Setup your server as a remote
  • 43.
  • 44.
    Continous Intergration • Heroku(http://heroku.com) • Pagoda (http://pagodabox.com) • Bamboo (http://atlassian.com/software/bamboo)
  • 45.
    I don’t haveshell • Deploy (http://www.deployhq.com)
  • 46.
    Server as Remote •Will need to use git hooks
  • 47.
  • 48.
    Git Hooks • #>vimpost-receive • #!/bin/sh • cd .. • GIT_DIR='.git' • umask 002 && git reset --hard
  • 49.
  • 50.
    Resources • Git (http://git-scm.com) •Wiki (http://en.wikipedia.org/wiki/Git_(software) ) • Git Essentials (https://tutsplus.com/course/git-essentials/) • Change Management andVersion Control (http://buildamodule.com)
  • 51.
    Visual Version Control Gource(http://code.google.com/p/gource/)
  • 52.