Git real slides

Embed Size (px)

DESCRIPTION

Awesome git stuff

Citation preview

  • GIT BASICSL E V E L 1

  • L E V E L 1 G I T B A S I C S

    SAME OLD STORY

    Collaboration Issues!

  • VERSION CONTROL SYSTEMSMerging

    Time Capsule

  • L E V E L 1 G I T B A S I C S

    REPOSITORY LOCATIONSCentral Repository Distributed Repository

  • DISTRIBUTED VERSION CONTROL SYSTEMGit is a

    (DVCS)

  • L E V E L 1 G I T B A S I C S

    ORIGINS Linux Kernel project.

    Meant to be distributed, fast and more natural.

    Capable of handling large projects.

  • L E V E L 1 G I T B A S I C S

    WORKING WITH GIT Command line interface

    Ocial Git Site

    start here

    http://git-scm.com/

    Many GUI tools available

  • L E V E L 1 G I T B A S I C S

    GIT HELP

    $ git help

    usage: git [--version] [--exec-path[=]] [--html-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [-c name=value] [--help] []

    The most commonly used git commands are: add Add file contents to the index bisect Find by binary search the change that introduced a bug...

  • GIT-CONFIG(1) Git Manual GIT-CONFIG(1)

    NAME git-config - Get and set repository or global options

    SYNOPSIS git config [] [type] [-z|--null] name [value [value_regex]] git config [] [type] --add name value...

    $ git help config

    L E V E L 1 G I T B A S I C S

    GIT HELP

    pass in any git command

  • L E V E L 1 G I T B A S I C S

    SETTING UP GIT

    Pretty command line colors

    Who gets credit for changesWhat email you use

    $ git config --global user.name "Gregg Pollack"

    $ git config --global user.email [email protected]

    $ git config --global color.ui true

  • L E V E L 1 G I T B A S I C S

    STARTING A REPO

    git metadata is stored here

    $ mkdir store

    $ cd store

    $ git init

    Initialized empty Git repository in /Users/gregg/store/.git/

  • L E V E L 1 G I T B A S I C S

    GIT WORK FLOW

    Jane creates README.txt le

    Add le to staging area

    Commit changes

    Getting ready to take a picture

    A snapshot of those on the stage

    Starts as untracked

  • Commit changes

    L E V E L 1 G I T B A S I C S

    GIT WORK FLOW

    Jane creates README.txt le

    Add le to staging area

    Jane modies README.txt le & adds LICENSE

    Add both les to staging area

    Commit changes

  • # On branch master## Initial commit## Untracked files:# (use "git add ..." to include in what will be committed)## README.txtnothing added to commit but untracked files present (use "git add" to track)

    L E V E L 1 G I T B A S I C S

    Our newly created file

    Jane creates README.txt le

    $ git status To check whats changed since last commit

  • L E V E L 1 G I T B A S I C S

    Our staged file

    $ git add README.txt

    git status$

    # On branch master## Initial commit## Changes to be committed:# (use "git rm --cached ..." to unstage)## new file: README.txt#

    Add le to staging area

  • L E V E L 1 G I T B A S I C S

    $ git commit -m "Create a README."

    [master abe28da] Create a README. 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 README.txt

    Commit changes

    $ git status# On branch masternothing to commit (working directory clean)

    No new or modified files since last commit

    Commit messagewhat work was done?

    timeline

    master

  • L E V E L 1 G I T B A S I C S

    # On branch master# Changed but not updated:## modified: README.txt## Untracked files:# # LICENSEno changes added to commit

    $ git status

    Jane modies README.txt le & adds LICENSE

    master

  • L E V E L 1 G I T B A S I C S

    $ git add README.txt LICENSE

    $ git add --all

    Add both les to staging area

    Adds all new or modified filesOR

    # On branch master# Changes to be committed:## new file: LICENSE# modified: README.txt#

    $ git status

    master

  • L E V E L 1 G I T B A S I C S

    $ git commit -m "Add LICENSE and finish README."

    [master 1b0019c] Add LICENSE and finish README. 2 files changed, 21 insertions(+), 0 deletions(-) create mode 100644 LICENSE

    Commit changes master

  • L E V E L 1 G I T B A S I C S

    GIT TIMELINE HISTORY

    commit 1b0019c37e3f3724fb2e9035e6bab4d7d87bf455Author: Gregg Pollack Date: Thu Jul 5 22:31:27 2012 -0400

    Add LICENSE and finish README.

    commit 5acaf86b04aaf9cbbb8ebb9042a20a46d0b9ce76Author: Gregg Pollack Date: Thu Jul 5 22:00:46 2012 -0400

    Create a README.

    $ git logmaster

  • L E V E L 1 G I T B A S I C S

    DIFFERENT WAYS TO ADD

    $ git add

    $ git add --all

    $ git add *.txt Add all txt files in current directory

    $ git add docs/*.txt Add all txt files in docs directory

    $ git add docs/ Add all files in docs directory

    $ git add "*.txt" Add all txt files in the whole project

    Add the list of filesAdd all files

  • STAGING & REMOTESL E V E L 2

  • GIT DIFF

    LICENSECopyright (c) 2012 Envy Labs LLC...Permission is hereby granted, free of charge, to any person obtaining a copy

    LICENSECopyright (c) 2012 Code School LLC...Permission is hereby granted, free of charge, to any person obtaining a copy

    diff --git a/LICENSE b/LICENSEindex 7e4922d..442669e 100644--- a/LICENSE+++ b/LICENSE@@ -1,4 +1,4 @@-Copyright (c) 2012 Envy Labs LLC+Copyright (c) 2012 Code School LLC

    edit

    Show unstaged differences since last commit

    Line removedLine added

    $ git diff

  • VIEWING STAGED DIFFERENCES$ git add LICENSE

    $ git diff

    $

    No differences, since all changes are stagedgit diff --staged View staged differences

    diff --git a/LICENSE b/LICENSEindex 7e4922d..442669e 100644--- a/LICENSE+++ b/LICENSE@@ -1,4 +1,4 @@-Copyright (c) 2012 Envy Labs LLC+Copyright (c) 2012 Code School LLC

    L E V E L 2 S T A G I N G & R E M O T E S

  • # On branch master# Changes to be committed:# (use "git reset HEAD ..." to unstage)## modified: LICENSE#

    HEAD

    UNSTAGING FILES

    $ git status

    $

    Unstage Tip

    git reset HEAD LICENSE

    Refers to last commit

    Unstaged changes after reset:M LICENSE

    L E V E L 2 S T A G I N G & R E M O T E S

    master

  • DISCARD CHANGES

    $

    Blow away all changes since last commit

    git status

    $ git checkout -- LICENSE

    # On branch master# Changed but not updated:# (use "git add ..." to update what will be committed)# (use "git checkout -- ..." to discard changes in working directory)## modified: LICENSE#

    $ git status

    L E V E L 2 S T A G I N G & R E M O T E S

    nothing to commit (working directory clean)

  • HEAD

    SKIP STAGING AND COMMIT

    Readme.txthere is my readme

    and now I can sleep

    Readme.txt

    edit

    Add changes from all tracked files

    Doesnt add new (untracked) files

    here is my readme

    the cake is a lie

    $ git commit -a -m "Modify readme"

    [master d00fefc] Modify readme 1 files changed, 1 insertions(+), 1 deletions(-)

    L E V E L 2 S T A G I N G & R E M O T E S

    master

  • UNDOING A COMMIT

    # On branch master# Changes to be committed:# (use "git reset HEAD ..." to unstage)## modified: README.txt#

    $ git reset --soft HEAD^

    git status$

    Reset into staging

    Move to commit before HEAD

    Now I can make changes, and re-commit

    Whoops, we forgot something on that commit.

    L E V E L 2 S T A G I N G & R E M O T E S

    masterHEAD

  • ADDING TO A COMMIT

    [master fe98ef9] Modify readme and add todo.txt. 2 files changed, 2 insertions(+), 1 deletions(-) create mode 100644 todo.txt

    $ git add todo.txt

    $

    Add to the last commitNew commit message

    Maybe we forgot to add a le

    git commit --amend -m "Modify readme & add todo.txt."

    Whatever has been staged is added to last commitL E V E L 2 S T A G I N G & R E M O T E S

    masterHEAD

  • USEFUL COMMANDS

    $ git reset --soft HEAD^ Undo last commit, put changes into staging

    git reset --hard HEAD^ Undo last commit and all changes$ git commit --amend -m "New Message" Change the last commit$

    git reset --hard HEAD^^ Undo last 2 commits and all changes$

    L E V E L 2 S T A G I N G & R E M O T E S

  • HOW TO SHARE?

    Git doesnt take care of access control

    git remote command

    L E V E L 2 S T A G I N G & R E M O T E S

    push pull

    pull

    Remote Repository

    master

  • REMOTE REPOSITORY HOSTING

    GitHub

    BitBucket

    Gitosis

    Gitorious

    Hosted Self Managed

    L E V E L 2 S T A G I N G & R E M O T E S

    push

    master

  • L E V E L 2 - S T A G I N G & R E M O T E S

  • L E V E L 2 - S T A G I N G & R E M O T E S

  • ADDING A REMOTE

    New remote our name for this remote address

    $ git remote add origin https://github.com/Gregg/git-real.git

    $ git remote -vorigin https://github.com/Gregg/git-real.git (fetch)origin https://github.com/Gregg/git-real.git (push)

    show remote repositories

    L E V E L 2 S T A G I N G & R E M O T E S

    origin

  • PUSHING TO REMOTE

    $ git push -u origin master

    remote repository name local branch to push

    Username for 'https://github.com': GreggPassword for 'https://[email protected]':

    Counting objects: 11, done.Delta compression using up to 4 threads.Compressing objects: 100% (6/6), done.Writing objects: 100% (11/11), 1.50 KiB, done.Total 11 (delta 0), reused 0 (delta 0)To https://github.com/Gregg/git-real.git * [new branch] master -> master

    https://help.github.com/articles/set-up-gitPassword caching

    push

    master

    origin

  • L E V E L 2 - S T A G I N G & R E M O T E S

  • L E V E L 2 - S T A G I N G & R E M O T E S

    Same information from git log

  • PULLING FROM REMOTE

    $ git pullremote: Counting objects: 5, done.remote: Compressing objects: 100% (1/1), done.remote: Total 3 (delta 1), reused 3 (delta 1)Unpacking objects: 100% (3/3), done.From https://github.com/Gregg/git-real fe98ef9..4e67ded master -> origin/masterUpdating fe98ef9..4e67dedFast-forward todo.txt | 1 + 1 file changed, 1 insertion(+)

    To pull changes down from the remote

    L E V E L 2 S T A G I N G & R E M O T E S

    pullorigin

    Its good to do this often

  • HAVING MULTIPLE REMOTES

    L E V E L 2 S T A G I N G & R E M O T E S

    origin production

    test

  • WORKING WITH REMOTES

    $ git remote add

    $ git remote rm

    To add new remotes

    To remove remotes

    $ git push -u To push to remotes

    usually masterL E V E L 2 S T A G I N G & R E M O T E S

  • HEROKU REMOTE

    $ heroku create

    $ git push heroku master

    Creating dev-server-1426... done, stack is cedarhttp://dev-server-1426.herokuapp.com/ | [email protected]: dev-server-1426.gitGit remote heroku added

    git repo ssh address

    triggers deploy

    $ git remote -vheroku [email protected]: dev-server-1426.git (fetch)heroku [email protected]: dev-server-1426.git (push)origin https://github.com/Gregg/git-real.git (fetch)origin https://github.com/Gregg/git-real.git (push)

    To push to heroku

    L E V E L 2 S T A G I N G & R E M O T E S

  • USEFUL COMMANDS

    $ git reset --soft HEAD^Dont do these after you push

    git reset --hard HEAD^$

    git commit --amend -m "New Message"$

    git reset --hard HEAD^^$

    L E V E L 2 S T A G I N G & R E M O T E S

  • CLONING & BRANCHINGL E V E L 3

  • COLLABORATING

    L E V E L 3 C L O N I N G & B R A N C H I N G

    pushgithub

    How do we start collaborating?

    JaneGreggI want a copy

    Clone the repo!

    local repo

    ?

  • FINDING THE REPO URL

    URL of the remote repositoryL E V E L 3 C L O N I N G & B R A N C H I N G

  • FINDING THE REPO URL

    URL of the remote repositoryL E V E L 3 C L O N I N G & B R A N C H I N G

  • CLONING A REPOSITORY

    $ git clone https://github.com/codeschool/git-real.gitCloning into 'git-real'...

    URL of the remote repository

    $ git clone https://github.com/codeschool/git-real.git git-demoCloning into 'git-demo'...

    local folder name

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • origin https://github.com/codeschool/git-real.git (fetch)origin https://github.com/codeschool/git-real.git (push)

    GIT CLONE

    HEAD

    master1 - Downloads the entire repository into a new git-real directory.2 - Adds the origin remote, pointing it to the clone URL.

    3 - Checks out initial branch (likely master).

    $ git remote -v

    sets the headL E V E L 3 C L O N I N G & B R A N C H I N G

  • Need to work on a feature that will take some time?

    BRANCHING OUT

    master

    catbranch created from master

    Jane $ git branch cat

    HEAD $ git branch cat* master

    HEAD still on master

    Time to branch out.

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • SWITCHING TO A BRANCH

    HEAD

    Time to jump on that new 'cat' branch.

    HEAD is now on cat

    master

    $ git checkout catSwitched to branch 'cat'

    cat

    Jane

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • master

    cat

    WORKING ON A BRANCH

    HEAD

    committed to the cat branch

    $ echo "Schrdinger" > cat.txt$ git add cat.txt$ git commit -m "Create quantum cat."[cat ab48a3f] Create quantum cat. 1 file changed, 1 insertion(+) create mode 100644 cat.txt

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • README.txt cat.txt

    master

    cat

    WORKING ON A BRANCH

    HEAD

    $ ls see the cat?

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • commit 1191ceb7252c9d4b1e05c9969a55766a8adfce3bAuthor: Gregg Date: Wed Jun 27 23:11:20 2012 -0700

    Add README. master

    cat

    BACK TO MASTER

    $ git checkout master

    HEAD

    and were back on master

    cat.txt is gone!

    $ git log

    nothing in the log either

    Switched to branch 'master'$ lsREADME.txt

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • README.txt cat.txt

    master

    cat

    BACK TO CAT$ git checkout cat

    HEADphew, still hereSwitched to branch 'cat'$ ls

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • cat

    TIME TO MERGEDone with that feature branch? master

    $ git merge cat

    HEAD

    merge brings one branchs changes into another

    whats that?

    $ git checkout masterSwitched to branch 'master'$ lsREADME.txt

    Updating 1191ceb..ab48a3fFast-forward cat.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 cat.txt

    Time to merge it into 'master '.

    no cat, as expected

  • cat

    FAST-FORWARD TO THE FUTURE

    master

    HEAD

    nothing new something new

    Conditions for a fast-forward merge

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • cat

    BRANCH CLEAN UPWhen youre done with a branch, you can safely remove it. master

    HEAD $ git branch -d catDeleted branch cat (was 957dbff).

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • admin

    NON-FAST-FORWARD

    masterLets work on a new admin feature.

    $ git checkout -b admin

    HEAD

    creates and checks out bran

    ch

    Please fix the bugs on master.

    Switched to a new branch 'admin'...$ git add admin/dashboard.html$ git commit -m 'Add dashboard'...$ git add admin/users.html$ git commit -m 'Add user admin'

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • admin

    BUG FIXING ON MASTER

    master$ git checkout master

    HEAD

    Switched to branch 'master'

    Time to put out the re. Well get back to that admin branch later.

    $ git branch admin* master$ git pull...$ git add store.rb$ git commit -m 'Fix store bug'...$ git add product.rb$ git commit -m 'Fix product'...$ git push

    HEAD

  • admin

    BACK TO OUR BRANCH

    master$ git checkout admin

    HEAD

    $ git checkout masterWhen ready to bring in changes

    Switched to branch 'admin'...

    Switched to branch 'admin'$ git merge admin

    HEAD

    L E V E L 3 C L O N I N G & B R A N C H I N G

  • 1 Merge branch 'admin' 2 3 # Please enter a commit message to explain why this merge is necessary,4 # especially if it merges an updated upstream into a topic branch.5 # 6 # Lines starting with '#' will be ignored, and an empty message aborts7 # the commit.

    AND SUDDENLY. . .Git uses Vi if no default editor is set to edit commit messages.

    + hit Enter to write (save) & quit

    h left l right

    j down k up ESC leave mode

    i insert mode

    :wq save & quit

    :q! cancel & quit

    Vi commands

    DONT PANIC

    :wq

  • Merge made by the 'recursive' strategy. 0 files changed create mode 100644 admin/dashboard.html create mode 100644 admin/users.html admin

    RECURSIVE MERGING

    master

    2 commits 2 commits

    Git cant fast-forward since changes were made in both branches.merge commit

    $ git log

    A commit was created to merge the two branches.

    commit 19f735c3556129279bb10a0d1447dc5aba1e1fa9Merge: 5c9ed90 7980856Author: Jane Date: Thu Jul 12 17:51:53 2012 -0400

    Merge branch 'admin'

  • COLLABORATION BASICSL E V E L 4

  • pushgithub

    ?

    I want a copy

    JaneGregg

    $ git clone https://github.com/codeschool/git-real.git

    Clone the repo

    Start making changes

    Jane adds two files

  • TWO NEW FILES # On branch master# Untracked files:# (use "git add ..." to include in what will be committed)## product.rb# store.rbnothing added to commit but untracked files present

    jane $ git commit -m "Add store and product models."

    jane $ git status

    [master 30ce481] Add product and store models. 2 files changed, 2 insertions(+) create mode 100644 product.rb create mode 100644 store.rb

    jane $ git add --all

  • COMMIT FLOW

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    Sends her new commitjane $ git pushCounting objects: 5, done.Compressing objects: 100% (2/2), done.Writing objects: 100% (4/4), 441 bytes, done.Total 4 (delta 0), reused 0 (delta 0)To https://github.com/codeschool/git-real.git 4e67ded..30ce481 master -> master

    push new commitsmaster

    github

  • DIFFERENT GIT COMMITS

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    same

    differentgregg github

    What happens now?

    gregg $ git commit -am "Update the readme."[master c715339] Update the readme. 1 file changed, 1 insertion(+), 1 deletion(-)

  • GIT PUSH REJECTED

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    Cannot write over Janes commitgregg $ git pushTo https://github.com/codeschool/git-real.git ! [rejected] master -> master (non-fast-forward)error: failed to push some refs to 'https://github.com/codeschool/git-real.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. Merge the remote changes (e.g. 'git pull')hint: before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.

    $ git pull

    $ git push...

    ...

    Success!

  • UNDERSTANDING PULL

    $ git pull

    1. Fetch (or Sync) our local repository with the remote one

    origin

    gregg github $ git fetch

    Fetch doesnt actually update any of our local code

  • UNDERSTANDING PULL

    $ git pull

    1. Fetch (or Sync) our local repository with the remote one

    mastermaster origin/mastergregg github

    2. Merges the origin/master with master

    $ git merge origin/master

    $ git fetch

  • MERGE COMMIT $ git pull

    1. Fetch (or Sync) our local repository with the remote one2. Merges the origin/master with master

    1 Merge branch 'master' of https://github.com/codeschool/git-real 2 3 # Please enter a commit message to explain why this merge is necessary, 4 # especially if it merges an updated upstream into a topic branch. 5 # 6 # Lines starting with '#' will be ignored, and an empty message aborts 7 # the commit.

    Create a new commit for this merge my editor $ git merge origin/master

  • GIT PUSH REJECTED $ git pull

    remote: Counting objects: 5, done.remote: Compressing objects: 100% (2/2), done.remote: Total 4 (delta 0), reused 4 (delta 0)Unpacking objects: 100% (4/4), done.From https://github.com/codeschool/git-real 4e67ded..30ce481 master -> origin/masterMerge made by the 'recursive' strategy. product.rb | 1 + store.rb | 1 + 2 files changed, 2 insertions(+) create mode 100644 product.rb create mode 100644 store.rb

    merge commit

  • MERGE COMMIT $ git pull

    1. Fetch (or Sync) our local repository with the remote one

    masterorigin/master

    2. Merges the origin/master with master

    merge commit

    $ git fetch$ git merge origin/master

  • PUSHING COMMITS $ git push

    Update origin/master be at the same state as our local repo

    masterorigin/master

    merge commitgithub

  • OUR LOG

    The problem with pullgregg $ git logcommit ee47baaedcd54e1957f86bda1aaa1b8a136185daMerge: 87c5243 57501d5Author: Gregg Pollack

    Merge branch 'master' of https://github.com/Gregg/git-real

    commit 87c5243d2266f05cd9fda8b1c9137f11b3fe6f31Author: Gregg Pollack

    Update the readme.

    commit 57501d595b16e2d1198a9c04c547a5b1380a6618Author: Gregg Pollack

    Add store and product models.

  • MERGE CONFLICTS

    READMEhere is my readme

    the cake is a lie

    READMEhere is my readme

    the cake is telling the truth!

    JaneGregg

    same

    differentgregg github

    committed committed & pushed

  • MERGE CONFLICT

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    gregg $ git pullremote: Counting objects: 5, done.remote: Compressing objects: 100% (1/1), done.remote: Total 3 (delta 1), reused 3 (delta 1)Unpacking objects: 100% (3/3), done.From https://github.com/Gregg/git-real ee47baa..4e76d35 master -> origin/masterAuto-merging README.txtCONFLICT (content): Merge conflict in README.txtAutomatic merge failed; fix conflicts and then commit the result.

    Git modified this file with the diff

  • MERGE CONFLICT

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    gregg $ git status# On branch master# Your branch and 'origin/master' have diverged,# and have 1 and 1 different commit each, respectively.## Unmerged paths:# (use "git add/rm ..." as appropriate to mark resolution)## both modified: README.txt#no changes added to commit (use "git add" and/or "git commit -a")

    Need to edit these files

  • MERGE CONFLICT

    L E V E L 4 C O L L A B O R A T I O N B A S I C S

    gregg $ git commit -a

    READMEhere is my readme

    > 4e76d3542a7eee02ec516a47600002a90a4e4b48

    here is my readme

    the cake is a lie. Our local versionJanes version

    Edit file and correct

    Merge commit

  • COMMIT EDITOR

    gregg $ git commit -a

    1 Merge branch 'master' of https://github.com/Gregg/git-real 2 3 Conflicts: 4 README.txt 5 # 6 # It looks like you may be committing a merge. 7 # If this is not correct, please remove the file 8 #.git/MERGE_HEAD 9 # and try again. 10 11 12 # Please enter the commit message for your changes. Lines starting 13 # with '#' will be ignored, and an empty message aborts the commit. 14 # On branch master 15 # Your branch and 'origin/master' have diverged, 16 # and have 1 and 1 different commit each, respectively.

    EditorMerge commit

  • MERGE COMMIT

    masterorigin/master

    Merge commit masterorigin/master

    Merge commit

    $ git push

  • COLLABORATION BASICSL E V E L 4

  • REMOTE BRANCHES & TAGSL E V E L 5

  • WHY CREATE A REMOTE BRANCH? When you need other people to work on your branch.

    Gregg

    Any branch that will last more than a day.

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • CREATING A REMOTE BRANCH

    $ git checkout -b shopping_cartSwitched to a new branch 'shopping_cart'

    $ git push origin shopping_cart

    Counting objects: 10, done.Delta compression using up to 4 threads.Compressing objects: 100% (6/6), done.Writing objects: 100% (6/6), 619 bytes, done.Total 6 (delta 2), reused 0 (delta 0)To https://github.com/codeschool/git-real.git * [new branch] shopping_cart -> shopping_cart

    Links local branch to the remote branch

    (tracking)

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • PUSHING TO THE BRANCH

    $ git add cart.rb$ git commit -a -m "Add basic cart ability."

    [shopping_cart 2a0dbf9] Add basic cart ability 1 file changed, 1 insertion(+) create mode 100644 cart.rb

    Pushed changes from branch$ git pushCounting objects: 4, done.Delta compression using up to 4 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 302 bytes, done.Total 3 (delta 1), reused 0 (delta 0)To https://github.com/codeschool/git-real.git 786d7a1..2a0dbf9 shopping_cart -> shopping_cart

  • CREATING A BRANCHHey Jane, I started a branch

    Sweet, Ill check it out

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • PULLING NEW BRANCHES

    remote: Counting objects: 13, done.remote: Compressing objects: 100% (6/6), done.remote: Total 9 (delta 3), reused 8 (delta 2)Unpacking objects: 100% (9/9), done.From https://github.com/Gregg/git-real 4e76d35..786d7a1 master -> origin/master * [new branch] shopping_cart -> origin/shopping_cartUpdating 4e76d35..786d7a1Fast-forward README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

    remote branch

    $ git pull

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • PULLING NEW BRANCHES

    list all remote branches

    Now we can contribute and push!

    $ git branch

    * master$ git branch -r

    origin/master origin/shopping_cart

    $ git checkout shopping_cart

    Branch shopping_cart set up to track remote branch shopping_cart from origin.Switched to a new branch 'shopping_cart'

    $ git branch master* shopping_cart

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • REMOTE SHOW

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

  • REMOVING A BRANCH

    Must delete local branch manually

    $ git push origin :shopping_cart

    To https://github.com/codeschool/git-real.git - [deleted] shopping_cart

    $ git branch -d shopping_cart

    error: The branch 'shopping_cart' is not fully merged.If you are sure you want to delete it, run 'git branch -D shopping_cart'.

    git branch -D shopping_cart

    Deleted branch shopping_cart (was ea0a1b9).

    $

    Deletes remote branch

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • WHAT ABOUT GREGG?

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

    GreggJane

  • ON DELETED REMOTE BRANCH

    No remote to push to (its just a local branch now)

    $ git commit -m -a "Add ability to pay."

    [shopping_cart 9851887] Add ability to pay. 1 file changed, 1 insertion(+), 1 deletion(-)

    $ git pushEverything up-to-date

    git remote show origin$

    Gregg

    Remote branches: master tracked refs/remotes/origin/shopping_cart stale (use 'git remote prune' to remove)

    git remote prune origin$

    Pruning originURL: https://github.com/codeschool/git-real.git * [pruned] origin/shopping_cart

    To clean up deleted remote branches

  • REMOTE BRANCH NAMES

    $ git branchHeroku deploys only master branch

    Would not work, would push to stagingheroku-staging

    * staging master

    $ git push heroku-staging staging

    $ git push heroku-staging staging:master

    Will push and deploy staging on heroku

    local:remote

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • TAGGING

    v0.0.1v0.0.2

    A tag is a reference to a commit (used mostly for release versioning)

    Text

    $ git tag

    $ git checkout v0.0.1

    list all tags

    check out code at commit

    $ git tag -a v0.0.3 -m "version 0.0.3"

    To add a new tag

    $ git push --tags

    To push new tags

    L E V E L 5 R E M O T E B R A N C H E S A N D T A G S

  • REMOTE BRANCHES & TAGSL E V E L 5

  • REBASE BELONG TO USL E V E L 6

  • L E V E L 6 R E B A S E B E L O N G T O U S

    MERGE COMMITS ARE BAD

    masterorigin/master

    merge commit

    Add product and store models.

    Update the Readme.

    Merge branch 'master' of http...

    Add Cats.

    Merge branch 'cats'

    Merge commits feel useless

  • DIFFERENT GIT COMMITS

    same

    differentgregg github

    Janes commit

    gregg $ git commit -am "Update the readme."[master c715339] Update the readme. 1 file changed, 1 insertion(+), 1 deletion(-)

    L E V E L 6 R E B A S E B E L O N G T O U S

  • L E V E L 6 R E B A S E B E L O N G T O U S

    GIT PUSH REJECTED

    Cannot write over Janes commitgregg $ git pushTo https://github.com/codeschool/git-real.git ! [rejected] master -> master (non-fast-forward)error: failed to push some refs to 'https://github.com/codeschool/git-real.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. Merge the remote changes (e.g. 'git pull')hint: before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.

    $ git pull

    $ git push...

    ...

    Nope!

  • L E V E L 6 R E B A S E B E L O N G T O U S

    FETCH

    gregg $ git fetchremote: Counting objects: 5, done.remote: Compressing objects: 100% (2/2), done.remote: Total 4 (delta 0), reused 4 (delta 0)Unpacking objects: 100% (4/4), done.From https://github.com/codeschool/git-real f35f2f1..71a4650 master -> origin/master

    Syncsgregggithub

    but doesnt merge

    master origin/master

  • L E V E L 6 R E B A S E B E L O N G T O U S

    REBASE

    gregg $ git rebase

    master origin/master1. Move all changes to master which are not in origin/master to a temporary area.

    temp

  • L E V E L 6 R E B A S E B E L O N G T O U S

    REBASE

    gregg $ git rebase

    1. Move all changes to master which are not in origin/master to a temporary area.

    2. Run all origin/master commits.

    3. Run all commits in the temporary area, one at a time.

    temp master origin/master

  • gregg $ git rebase

    master

    1. Move all changes to master which are not in origin/master to a temporary area.

    2. Run all origin/master commits.

    3. Run all commits in the temporary area, one at a time.

    Add product and store models.

    Update the Readme.No Merge Commit!

    REBASE

  • admin

    LOCAL BRANCH REBASE

    master

    $ git checkout adminSwitched to branch 'admin'

    adminmaster

    Rebase

    $ git rebase master ...

  • IF ALL GOES WELL, MERGE MASTER$ git checkout master

    Switched to branch 'master'

    adminmaster

    $ git merge admin ...

  • WHAT ABOUT CONFLICTS

    same

    gregg github

    Add lie to readme.Add product and store models.

    Add truth to readme.Add shopping cart.

    L E V E L 6 R E B A S E B E L O N G T O U S

    Edited same f

    ile!

  • L E V E L 6 R E B A S E B E L O N G T O U S

    FETCH

    gregg $ git fetch

    master origin/master

    Add lie to readme. Add product and store models.

    Add truth to readme.Add shopping cart.

  • gregg $ git rebase

    1. Move all changes to master which are not in origin/master to a temporary area

    temp

    REBASE

    origin/master

    Add product and store models.

    Add truth to readme.

    master

  • gregg $ git rebase

    master2. Run all origin/master commits.

    Add lie to readme.

    Add shopping cart.

    3. Run all commits in the temporary area, one at a time.

    REBASE

    temp

    Add product and store models.

    Add truth to readme.

  • gregg $ git rebase

    First, rewinding head to replay your work on top of it...Applying: Add lie to readme.Using index info to reconstruct a base tree...M README.txt:13: trailing whitespace.the cake is a lie, and I am your father! warning: 1 line adds whitespace errors.Falling back to patching base and 3-way merge...Auto-merging README.txtCONFLICT (content): Merge conflict in README.txtFailed to merge in the changes.Patch failed at 0001 Add lie to readme.

    When you have resolved this problem run "git rebase --continue".If you would prefer to skip this patch, instead run "git rebase --skip".To check out the original branch and stop rebasing run "git rebase --abort".

    master

    CONFLICT

    REBASE CONFLICT

  • gregg $ git status

    # Not currently on any branch.# Unmerged paths:# (use "git reset HEAD ..." to unstage)# (use "git add/rm ..." as appropriate to mark resolution)## both modified: README.txt#no changes added to commit (use "git add" and/or "git commit -a")

    Edit the README.txt

    gregg $ git add README.txt

    gregg $ git rebase --continue

    Applying: Add lie to readme.Applying: Add shopping cart

    gregg $

    REBASE CONFLICTmaster

  • REBASED LOGmaster

    Add lie to readme.

    Add product and store models.

    Add truth to readme.

    Add shopping cart.

  • REBASE BELONG TO USL E V E L 6

  • HISTORY & CONFIGURATIONL E V E L 7

  • $ git log

    VIEWING THE LOG

    SHA hash

    commit message

    commit 915f242e262052b11c511dc07bef237fabb7ed85

    Author: Gregg

    Date: Thu Jun 28 02:10:57 2012 -0700

    Update index.

  • COLORIZING THE LOG

    $ git config --global color.ui true

    $ git log --pretty=oneline

    $ git log

    commit 915f242e262052b11c511dc07bef237fabb7ed85Author: Gregg Date: Thu Jun 28 02:10:57 2012 -0700 Update index

    08f202691c67abd12eb886b587ac7b26d51005c7 Update index

  • LOG FORMAT

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    $ git log --pretty=format:"%h %ad- %s [%an]"

    any string you want & placeholder data

    placeholder replaced with

    %ad author date%an author name%h SHA hash%s subject%d ref names

    run git help log for more options!

  • $ git log --oneline -p

    PATCH

    3ea7f70 I'm telling you, it's 'Octopi'.diff --git a/index.html b/index.htmlindex 021a54e..640d66d 100644--- a/index.html+++ b/index.html@@ -8,7 +8,7 @@

    Cats- Octopuses+ Octopi

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

  • $ git log --oneline --stat

    STATS

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    3ea7f70 I'm telling you, it's 'Octopi'. index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)96776a4 Add index. index.html | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)

  • * 30b1f8f Merge branch 'bird' into master|\ | * 8b8f950 Revise silly hipster name for bird aisle.* | 915f242 Add emphasis.|/ * 69728cd Update index descriptions.

    $ git log --oneline --graph

    GRAPH

    visual representation of the branch merging into master

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

  • until

    DATE RANGES

    $ git log --until=1.minute.ago

    since (days)$ git log --since=1.day.ago

    since (hours)$ git log --since=1.hour.ago

    since & until (relative)$ git log --since=1.month.ago --until=2.weeks.ago

    since & until (absolute)$ git log --since=2000-01-01 --until=2012-12-21

  • diff --git a/index.html b/index.html@@ -8,7 +8,10 @@ Cats- Octopuses+ Birds+ Hamsters

    $ git diff

    removed line

    DIFFS

    added lines

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

  • diff --git a/index.html b/index.htmlindex 021a54e..1ceb9d6 100644@@ -8,7 +8,10 @@

    Cats...diff --git a/octopus.html b/octopus.htmlindex 55806be..ce8a2c7 100644@@ -2,6 +2,6 @@

    ...

    $ git diff HEAD

    UNCOMMITTED CHANGES

    diff between last commit & current state

    includes both staged and unstaged files

  • $ git diff HEAD^

    EARLIER COMMITS

    parent of latest commit

    $ git diff HEAD^^ grandparent of latest commit

    $ git diff HEAD~5 five commits ago

    $ git diff HEAD^..HEAD second most recent commit vs. most recent

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

  • 257256c cat4fb063f Add indexf5a6ff9 Add catalog pages

    $ git log --oneline

    EARLIER COMMITS

    range of abbreviated SHAs

    $ git diff master bird diff between two branches

    $ git diff --since=1.week.ago --until=1.minute.ago time-based diff

    $ git diff f5a6sdfsfsdfsdfff9..4sdsdfsdfsdfsdffb063f range of SHAs

    $ git diff 4fb063f..f5a6ff9

  • $ git blame index.html --date short

    BLAME

    commit hash author date line # content

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    ...96776a42 (Gregg 2012-06-29 9) 96776a42 (Gregg 2012-06-29 10) Cats3ea7f709 (Jane 2012-06-30 11) Octopi96776a42 (Gregg 2012-06-29 12) ...

  • # Untracked files:# (use "git add ..." to include in what will be committed)## experiments/

    $ git status

    EXCLUDING FILES

    we dont want to commit this...

    experiments/ will exclude this folder from git

    $ git status

    the experiment directory is now invisible to git

    .git/info/exclude

    # On branch masternothing to commit (working directory clean)

  • EXCLUDE PATTERNS

    exclude this filetutorial.mp4

    exclude all .mp4 files*.mp4

    exclude directoryexperiments/

    exclude .log files in logs directorylogs/*.log

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

  • # On branch master# Untracked files:# (use "git add ..." to include in what will be committed)## logs/server.log dont commit log files, they create conflicts

    $ git status

    EXCLUDING FROM ALL COPIES

    logs/*.log

    $ git status no more logs

    .gitignore

    add this pattern

    # On branch masternothing to commit (working directory clean)

  • REMOVING FILES

    $ git rm README.txt

    $ git status

    DELETED from the local filesystem & untracked

    $ git commit -m Remove readme

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    # Changes to be committed:## deleted: README.txt

  • UNTRACKING FILES

    $ git rm --cached development.log

    $ git status

    what if youre already tracking log files?

    not deleted from the local file system, only from Git

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    # Changes to be committed:## deleted: development.log

  • UNTRACKING FILES

    logs/*.log

    .gitignore

    $ git add .gitignore

    will ignore all .log files inside the logs directory

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    $ git commit -m "Ignore all log files."[master bccdc8c] Ignore all log files. 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .gitignore delete mode 100644 development.log

  • $ git config --global user.name "Gregg Pollack"

    CONFIG

    remember these? theres more

    use emacs for interactive commands$ git config --global core.editor emacs

    use opendiff for merging conflicts$ git config --global merge.tool opendiffOS X only

    L E V E L 7 H I S T O R Y & C O N F I G U R A T I O N

    $ git config --global user.email "[email protected]"

  • $ git config user.email

    LOCAL CONFIG

    $ git config user.email "[email protected]"

    $ git config --list

    same key can be set twice

    the global config loaded first, then repo config

    sets email for current repo

    [email protected]=truecore.editor=mate [email protected]

    [email protected]

  • ALIASES

    $ git config --global alias.mylog \"log --pretty=format:'%h %s [%an]' --graph"

    $ git config --global alias.lol \"log --graph --decorate --pretty=oneline --abbrev-commit --all"

    aliases for log formats

    $ git mylog* 19f735c Merge branch 'admin' [Jane]|\ | * 7980856 Add user admin [Jane]* | 5c9ed90 Add dashboard. [Jane]|/ * ab48a3f Create quantum cat. [Jane]

  • ALIASES git config alias.

    git st$ git config --global alias.st status

    $ git st

    git co$ git config --global alias.co checkout

    git br$ git config --global alias.br branch

    git ci$ git config --global alias.ci commit

    git status

    git checkout

    git branch

    git commit

    # On branch masternothing to commit (working directory clean)

  • level1level2level3level4level5level6level7