Skip to content

Latest commit

 

History

History
1380 lines (966 loc) · 37.8 KB

source.md

File metadata and controls

1380 lines (966 loc) · 37.8 KB

Themes

Set your presentation theme:
Black (default) - White - League - Sky - Beige - Simple
Serif - Blood - Night - Moon - Solarized

H:

Introduction to git

by Jean Pierre Charalambos
Universidad Nacional de Colombia
Presentation best seen online
See also the source code

H:

Index

  1. Introduction
  2. Getting started
  3. Git basics
  4. Git branching
  5. Github-based projects
  6. References
  7. Workshop

H:

Introduction

  1. The problem
  2. Version control system types
  3. What's git?
  4. Why use git?

V:

Introduction: The problem

working on a project comprising several source files

A presentation

V:

Introduction: The problem

working on a project comprising several source files

A book

V:

Introduction: The problem

working on a project comprising several source files

Any other software

V:

Introduction: The problem

and wanna keep track of history

Why?

V:

Introduction: The problem

To time travel...

V:

Introduction: The problem

... in order to:

  1. Go back in time and check out a previous state
  • Recover it undoing a mistake
  • Explore it
  • Make edits starting from it (creating a branched history)
  1. Come back to the present
  • merge other branches
  • (or do it the other way around)

V:

Introduction: The problem

Conclusion

'Creativity' (as when writting a book, coding a program) is:

a non-linear iterative process of experimentation towards an open goal*

* no matter how you do it, a goal that can anytime be revised and/or broken up into accomplishable stages

V:

Introduction: VCS types

Local Version Control Systems

V:

Introduction: VCS types

centralized Version Control Systems

N:

Disadvantages:

  1. Remote nature of versioning commands
  2. Data corruption

V:

Introduction: VCS types

Distributed Version Control Systems

V:

Introduction: What is git

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

V:

Introduction: What is git

git is British English slang meaning "unpleasant person"

I'm an egotistical bastard, and I name all my projects after myself. First 'Linux', now 'git' -- Torvalds

V:

Introduction: Why use git?

  1. Private creativity affairs
  2. Team creativity affairs

V:

Introduction: Why use git?

Private creativity affairs

To safely keep track of some project sources sequence of commits (previous explicitly recorded states)

V:

Introduction: Why use git?

Team creativity affairs

Subversion-Style Workflow

N:

Works like subversion

V:

Introduction: Why use git?

Team creativity affairs

Integration Manager Workflow

N:

  1. The project maintainer pushes to their public repository
  2. A contributor clones that repository and makes changes
  3. The contributor pushes to their own public copy
  4. The contributor sends the maintainer an email asking them to pull changes
  5. The maintainer adds the contributor’s repo as a remote and merges locally
  6. The maintainer pushes merged changes to the main repository

V:

Introduction: Why use git?

Team creativity affairs

Dictator and Lieutenants Workflow

N:

  1. Regular developers work on their topic branch and rebase their work on top of master. The master branch is that of the reference directory to which the dictator pushes
  2. Lieutenants merge the developers' topic branches into their master branch
  3. The dictator merges the lieutenants' master branches into their master branch
  4. The dictator pushes their master to the reference repository so the other developers can rebase on it

V:

Introduction: Why use git?

Team creativity affairs

Pull requests

H:

Getting started

  1. Recorded history
  2. File states
  3. First time setup
  4. Getting help

V:

Getting started: Recorded history

Sequence of snapshots

V:

Getting started: File states

A file may be in one out of three 'states':

  • _Committed_ -> safely stored in your local database
  • _Modified_ -> changed but not yet committed
  • _Staged_ -> prepared to go into your next commit

    V:

    Getting started: File states

    Git project sections

    V:

    Getting started: first time setup

  • User name and email:
    $ git config --global user.name Falcao
    $ git config --global user.email falcao@gmail.com
  • much more like _editor_, _diff tool_, ...
  • check it:
    $ git config --list

    V:

    Getting started: Getting help

    $ git help <command>

    H:

    Git basics

    1. Getting a repository
    2. Recording changes
    3. Viewing the history
    4. Undoing things
    5. Working with remotes

    V:

    Git basics: Getting a repository

  • [Init](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository#Initializing-a-Repository-in-an-Existing-Directory) ```sh $ git init ```
  • Add and commit some files ```sh $ git add *.md $ git add fig/ $ git commit -m 'initial project version' ```

    V:

    Git basics: Getting a repository

    From now on, I will be referring to the presentation itself git source code repository

  • [Cloning an existing repository](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository#Cloning-an-Existing-Repository) ```sh $ git clone https://github.com/objetos/git.git ```
  • or using a different name: ```sh $ git clone https://github.com/objetos/git.git git_slides ```

    V:

    Git basics: Recording changes

    The lifecycle of the status of your files

    V:

    Git basics: Recording changes

    Checking the status of your files

    $ git status
    
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    nothing to commit, working directory clean

    V:

    Git basics: Recording changes

    Checking the status of your files

    Suppose you edit the source.md file:

    $ git status
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    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:   source.md
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Recording changes

    Viewing your staged and unstaged changes

    To see what you've changed but not yet staged:

    $ git diff
    diff --git a/source.md b/source.md
    index 02dd0b3..5891ca3 100644
    --- a/source.md
    +++ b/source.md
    ...

    V:

    Git basics: Recording changes

    Viewing your staged and unstaged changes

    To see what you've staged that will go into your next commit

    $ git diff --staged 
    

    V:

    Git basics: Recording changes

    Checking the status of your files

    Suppose you create a fig/lifecycle.png file:

    $ git status
    
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    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:   source.md
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            fig/lifecycle.png
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Recording changes

    Tracking new files

    git add fig/lifecycle.png
    $ git status
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            new file:   fig/lifecycle.png
    
    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:   source.md

    V:

    Git basics: Recording changes

    Commiting your changes

    $ git commit -m 'life-cycle figure added'
    [gh-pages fa1ffed] life-cycle figure added
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 fig/lifecycle.png
    $ git status
    On branch gh-pages
    Your branch is ahead of 'origin/gh-pages' by 1 commit.
      (use "git push" to publish your local commits)
    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:   source.md
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Recording changes

    Skipping the stagging area

    Instead of:

    $ git add source.md
    $ git commit -m 'source update'

    you can do:

    $ git commit -am 'source update'
    $ git status
    On branch gh-pages
    Your branch is ahead of 'origin/gh-pages' by 2 commits.
      (use "git push" to publish your local commits)
    nothing to commit, working directory clean

    V:

    Git basics: Recording changes

    Skipping the stagging area

    Adding the -a option to the git commit command makes Git automatically stage every file that is already tracked before doing the commit

    V:

    Git basics: Recording changes

    Removing files

    $ rm PROJECTS.md
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    Changes not staged for commit:
      (use "git add/rm ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
            deleted:    PROJECTS.md
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Recording changes

    Removing files

    Remove it from your staging area and then commit (git rm)

    $ git rm PROJECTS.md
    rm 'PROJECTS.md'
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
        deleted:    PROJECTS.md

    V:

    Git basics: Recording changes

    Moving files

    $ git mv file_from file_to
    $ git mv README.md README
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
        renamed:    README.md -> README
    $ mv README.md README
    $ git rm README.md
    $ git add README

    V:

    Git basics: Viewing the history

    $ git log
    commit b6545c874fdc622ecc35d28747cd2f7a0be268f2
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:28:14 2015 -0500
    
        source update
    
    commit fa1ffed1052dd9a0dc26b5211aadd0b93fdfb7c7
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:19:28 2015 -0500
    
        life-cycle figure added
    
    commit 4e65f72a195de0322fe943ed561a6e826d4b7991
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Thu Aug 27 19:24:56 2015 -0500
    
        intro and getting started sections completed

    V:

    Git basics: Viewing the history

    git log --stat
    commit b6545c874fdc622ecc35d28747cd2f7a0be268f2
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:28:14 2015 -0500
    
        source update
    
     source.md | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
     1 file changed, 194 insertions(+), 1 deletion(-)
    
    commit fa1ffed1052dd9a0dc26b5211aadd0b93fdfb7c7
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:19:28 2015 -0500
    
        life-cycle figure added
    
     fig/lifecycle.png | Bin 0 -> 95510 bytes
     1 file changed, 0 insertions(+), 0 deletions(-)

    V:

    Git basics: Viewing the history

    $ git log --pretty=oneline
    6545c874fdc622ecc35d28747cd2f7a0be268f2 source update
    fa1ffed1052dd9a0dc26b5211aadd0b93fdfb7c7 life-cycle figure added
    4e65f72a195de0322fe943ed561a6e826d4b7991 intro and getting started sections completed

    V:

    Git basics: Viewing the history

    git log --pretty=format:"%h - %an, %ar : %s"
    b6545c8 - Jean Pierre Charalambos, 5 hours ago : source update
    fa1ffed - Jean Pierre Charalambos, 5 hours ago : life-cycle figure added
    4e65f72 - Jean Pierre Charalambos, 21 hours ago : intro and getting started sections completed
    

    V:

    Git basics: Viewing the history

    Useful options for git log --pretty=format

    Option Description output
    %H Commit hash
    %h Abbreviated commit hash
    %T Tree hash
    %t Abbreviated tree hash
    %P Parent hashes

    V:

    Git basics: Viewing the history

    Useful options for git log --pretty=format

    Option Description output
    %p Abbreviated parent hashes
    %an Author name
    %ae Author email
    %ad Author date (format respects the --date=option)
    %ar Author date, relative

    V:

    Git basics: Viewing the history

    Useful options for git log --pretty=format

    Option Description output
    %cn Committer name
    %ce Committer email
    %cd Committer date
    %cr Committer date, relative
    %s Subject

    V:

    Git basics: Viewing the history

    $ git log --pretty=format:"%h %s" --graph
    * b6545c8 source update
    * fa1ffed life-cycle figure added
    * 4e65f72 intro and getting started sections completed
    * 0c12be1 credits
    * 72cbdb0 readme update
    * 005edd9 readme update
    * 83d5c80 adding figs
    * 7639103 source update
    *   9120f43 Merge branch 'master' of https://github.com/hakimel/reveal.js into gh-pages
    |\  
    | * b390e66 add bower json #1067
    | *   96bef35 Merge pull request #1287 from obilodeau/patch-1
    | |\  
    | | * 98bdeae README: suggest decktape as an alternative for PDF rendering
    | |/  
    | *   7225d84 Merge pull request #1260 from pierreozoux/master
    | |\

    V:

    Git basics: Viewing the history

    Common options to git log

    Option Description
    -p Show the patch introduced with each commit
    --stat Show statistics for files modified in each commit
    --shortstat Display only the changed/insertions/deletions line from the --stat command
    --name-only Show the list of files modified after the commit information
    --name-status Show the list of files affected with added/modified/deleted information as well

    V:

    Git basics: Viewing the history

    Common options to git log

    Option Description
    --abbrev-commit Show only the first few characters of the SHA-1 checksum instead of all 40
    --relative-date Display the date in a relative format (for example, 2 weeks ago) instead of using the full date format
    --graph Display an ASCII graph of the branch and merge history beside the log output
    --pretty Show commits in an alternate format. Options include oneline, short, full, fuller, and format (where you specify your own format)

    V:

    Git basics: Viewing the history

    $ git log --since=10.hours
    commit b6545c874fdc622ecc35d28747cd2f7a0be268f2
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:28:14 2015 -0500
    
        source update
    
    commit fa1ffed1052dd9a0dc26b5211aadd0b93fdfb7c7
    Author: Jean Pierre Charalambos <nakednous@gmail.com>
    Date:   Fri Aug 28 11:19:28 2015 -0500
    
        life-cycle figure added

    V:

    Git basics: Viewing the history

    Options to limit the output of git log

    Option Description
    -(n) Show only the last n commits
    --since, --after Limit the commits to those made after the specified date
    --until, --before Limit the commits to those made before the specified date

    V:

    Git basics: Viewing the history

    Options to limit the output of git log

    Option Description
    --author Only show commits in which the author entry matches the specified string
    --committer Only show commits in which the committer entry matches the specified string
    --grep Only show commits with a commit message containing the string
    -S Only show commits adding or removing code matching the string

    V:

    Git basics: Undoing things

    To change the commit message:

    $ git commit --amend

    To add a missing file:

    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

    V:

    Git basics: Undoing things

    Unstaging a Staged File

    $ git add source.md
    $ git status
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   source.md
    $ git reset HEAD source.md
    Unstaged changes after reset:
    M       source.md

    V:

    Git basics: Undoing things

    Unstaging a Staged File

    $ git status
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    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:   source.md
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Undoing things

    Unmodifying a Modified File

    Previously we got:

    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    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:   source.md
    
    no changes added to commit (use "git add" and/or "git commit -a")

    V:

    Git basics: Undoing things

    Unmodifying a Modified File

    git checkout -- source.md
    On branch gh-pages
    Your branch is up-to-date with 'origin/gh-pages'.
    nothing to commit, working directory clean

    V:

    Git basics: Undoing things

    As a rule of thumb: everything you commited can almost always be recovered. git checkout -- [file] is thus a dangerous command

    V:

    Git basics: Remotes

    Showing Your Remotes

    $ git clone https://github.com/objetos/git.git
    $ git remote
    origin
    $ git remote -v
    origin  https://github.com/objetos/git.git (fetch)
    origin  https://github.com/objetos/git.git (push)

    V:

    Git basics: Remotes

    Adding Remote Repositories

    git remote add [shortname] [url]

    $ git remote add reveal https://github.com/hakimel/reveal.js.git
    $ git remote -v
    origin  https://github.com/objetos/git.git (fetch)
    origin  https://github.com/objetos/git.git (push)
    reveal  https://github.com/hakimel/reveal.js.git (fetch)
    reveal  https://github.com/hakimel/reveal.js.git (push)

    V:

    Git basics: Remotes

    Fetching and Pulling from Your Remotes

    $ git fetch reveal
    remote: Counting objects: 286, done.
    remote: Total 286 (delta 118), reused 118 (delta 118), pack-reused 168
    Receiving objects: 100% (286/286), 241.13 KiB | 348.00 KiB/s, done.
    Resolving deltas: 100% (157/157), completed with 55 local objects.
    From https://github.com/hakimel/reveal.js
     * [new branch]      dev        -> reveal/dev
     * [new branch]      embed      -> reveal/embed
     * [new branch]      flexbox    -> reveal/flexbox
     * [new branch]      gh-pages   -> reveal/gh-pages
     * [new branch]      master     -> reveal/master
     * [new tag]         0.3.0      -> 0.3.0
     * [new tag]         1.0.0      -> 1.0.0
     * [new tag]         1.1.0      -> 1.1.0
     * [new tag]         1.2.0      -> 1.2.0

    V:

    Git basics: Remotes

    Fetching and Pulling from Your Remotes

    $ git checkout reveal/master
    Note: checking out 'reveal/master'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b <new-branch-name>
    
    HEAD is now at b390e66... add bower json #1067
    $ git checkout master
    Previous HEAD position was b390e66... add bower json #1067
    Switched to branch 'master'`sh
    

    V:

    Git basics: Remotes

    Pushing to Your Remotes

    git push [remote-name] [branch-name]

    $ git push origin gh-pages
    Counting objects: 3, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 6.54 KiB | 0 bytes/s, done.
    Total 3 (delta 1), reused 0 (delta 0)
    To https://github.com/objetos/git.git
       b6545c8..d203838  gh-pages -> gh-pages

    V:

    Git basics: Remotes

    Inspecting a Remote

    git remote show [remote-name]

    $ git remote show origin
    * remote origin
      Fetch URL: https://github.com/objetos/git.git
      Push  URL: https://github.com/objetos/git.git
      HEAD branch: master
      Remote branches:
        gh-pages tracked
        master   tracked
      Local branches configured for 'git pull':
        gh-pages merges with remote gh-pages
        master   merges with remote master
      Local refs configured for 'git push':
        gh-pages pushes to gh-pages (up to date)
        master   pushes to master   (up to date)

    V:

    Git basics: Remotes

    Removing and Renaming Remotes

    git remote rename

    $ git remote rename reveal rv
    $ git remote
    origin
    rv

    V:

    Git basics: Remotes

    Removing and Renaming Remotes

    git remote rm

    $ git remote rm rv
    $ git remote
    origin

    H:

    Git branching

    1. Basic Branching
    2. Basic Merging

    V:

    Git branching: Intro

    Working on this presentation

    1. Create a branch struct
    2. Do some work in that branch

    V:

    Git branching: Intro

    Working on this presentation

    At this stage, you’d like to fix the formatting. You’ll do the following:

    1. Switch to your production branch
    2. Create a branch to do the formatting
    3. After it’s tested, merge the formatting branch
    4. Switch back to struct story and continue working

    V:

    Git branching: Basic Branching

    Create the struct branch

    $ git checkout -b struct
    $ git status
    On branch struct
    nothing to commit, working tree clean

    V:

    Git branching: Basic Branching

    Do some work in the struct branch

    $ git checkout status
    On branch struct
    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:   source.md

    V:

    Git branching: Basic Branching

    Create the formatting branch

    ... but first finish work on struct branch

    $ git checkout gh-pages 
    error: Your local changes to the following files would be overwritten by checkout:
            source.md
    Please commit your changes or stash them before you switch branches.
    Aborting
    $ git commit -am'more updated'
    [struct 798cdbe] more updated
     1 file changed, 51 insertions(+), 5 deletions(-)

    V:

    Git branching: Basic Branching

    Create the formatting branch

    $ git checkout gh-pages 
    Switched to branch 'gh-pages'
    Your branch is up-to-date with 'origin/gh-pages'.
    $ git checkout -b formatting

    V:

    Git branching: Basic Branching

    Do some work in the formatting branch

    $ git checkout status
    On branch formatting
    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:   source.md
    $ git commit -am'formatting done'
    [formatting 587456f] formatting done
     1 file changed, 68 insertions(+), 28 deletions(-)

    V:

    Git branching: Basic Merging

    Merge the formatting branch onto the gh-pages

    $ git checkout gh-pages
    Switched to branch 'gh-pages'
    $ git merge formatting 
    Updating b6b37b5..587456f
    Fast-forward
     source.md | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
     1 file changed, 68 insertions(+), 28 deletions(-)

    V:

    Git branching: Basic Merging

    Merge the struct branch onto the gh-pages

    finish the work in the struct branch first...

    $ git checkout struct
    Switched to branch 'struct'
    $ git commit -am'dev workflows notes'
    [struct 1a13f5a] dev workflows notes
     1 file changed, 72 insertions(+), 17 deletions(-)

    V:

    Git branching: Basic Merging

    Merge the struct branch onto the gh-pages

    ... now merge

    $ git checkout gh-pages 
    Switched to branch 'gh-pages'
    Your branch is ahead of 'origin/gh-pages' by 1 commit.
      (use "git push" to publish your local commits)
    $ git merge struct 
    Auto-merging source.md
    Merge made by the 'recursive' strategy.
     source.md | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
     1 file changed, 185 insertions(+), 4 deletions(-)

    V:

    Git branching: Basic Merging

    final result

    $ git log --graph --pretty=oneline
    * 7bd70d280d32fcdde1490aac8a57bbd33fac3d76 more updates
    *   f70757509b3aa4d5d3e5e5cb4ade636461c4ca11 Merge branch 'struct' into gh-pages
    |\  
    | * b35c44b4e739801041bb372b60ca7341511a6d5a dev workflows notes
    | * 1a13f5a34929e1a3ba10772bd3aea327e1eb5f9f dev workflows notes
    | * 5cedde5d9995b11f40007adb6d29b11d564b816c more updated
    | * 798cdbe61f66bb3b1807a97168211ab5e2b89098 more updated
    | * b3874fa1e8fae62647265bcc76b7f6ee613b15de contents added to the new branch
    * | 587456f1b4d7817cfac4c8c7319cfb6cf30c78eb formatting done
    |/  
    * b6b37b560dc39664bee74b60a6f6a63bc538e44a index and source updated to latest reveal

    H:

    Github-based projects

  • [Classroom](https://classroom.github.com/videos)
  • [Github pages](https://pages.github.com/), see also [Top Open-Source Static Site Generators](https://www.staticgen.com/)
  • [Gollum](https://github.com/gollum/gollum)
  • [Gitbook](https://www.gitbook.com/)
  • [electricbook](http://electricbook.works/)

    N:

    Pending: third party hosted option

    H:

    References

    H:

    Workshop

    • (level 1)
    1. Create a local Git repo to track some source files
    2. Create the program of your choice
    3. Begin to track your program source files with Git
    4. Commit some changes
    5. Use git tool and/or git difftool to study some changes
    • (level 2)
    1. Create a branch to test an experimental feature
    2. Merge your test branch into your master branch
    • (level 3)
    1. Find new usages for git commands
    2. Search for git-based projects such as Github pages

    N:

    Pending themes: Git on the server