GIT BASICS
LEVEL 1
SAME OLD STORY

es!
Issu
tion
ora
llab
Co
LEVEL 1 — GIT BASICS
VERSION CONTROL SYSTEMS
Merging
Ti

psule
e Ca
m
REPOSITORY LOCATIONS
Central Repository

LEVEL 1 — GIT BASICS

Distributed Repository
Git is a

DISTRIBUTED VERSION CONTROL SYSTEM
(DVCS)
ORIGINS
• Linux Kernel project.
• Meant to be distributed, fast and more natural.
• Capable of handling large projects.

LEVEL 1 — GIT BASICS
WORKING WITH GIT
• Command line interface
• Many GUI tools available
• Official Git Site —
http://git-scm.com/

start here
LEVEL 1 — GIT BASICS
GIT HELP
$ git help
usage: git [--version] [--exec-path[=<path>]] [--html-path]
[-p|--paginate|--no-pager] [--no-replace-objects]
[--bare] [--git-dir=<path>] [--work-tree=<path>]
[-c name=value] [--help]
<command> [<args>]
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
...

LEVEL 1 — GIT BASICS
GIT HELP
$ git help config
GIT-CONFIG(1)

Git Manual

GIT-CONFIG(1)

pass in any git command
NAME
git-config - Get and set repository or global options
SYNOPSIS
git config [<file-option>] [type] [-z|--null] name [value [value_regex]]
git config [<file-option>] [type] --add name value
...

LEVEL 1 — GIT BASICS
SETTING UP GIT
$ git config --global user.name "Gregg Pollack"

Who gets credit for changes

$ git config --global user.email gregg@codeschool.com
$ git config --global color.ui true

LEVEL 1 — GIT BASICS

What email you use
Pretty command line colors
STARTING A REPO
$ mkdir store
$ cd store
$ git init
Initialized empty Git repository in /Users/gregg/store/.git/

git metadata is stored here

LEVEL 1 — GIT BASICS
GIT WORK FLOW
Jane creates README.txt file

Starts as untracked
Add file to staging area

Getting ready to take a picture
Commit changes

A snapshot of those on the stage
LEVEL 1 — GIT BASICS
GIT WORK FLOW
Jane creates README.txt file
Add file to staging area
Commit changes
Jane modifies README.txt file & adds LICENSE
Add both files to staging area
Commit changes
LEVEL 1 — GIT BASICS
Jane creates README.txt file
$ git status

To check what’s changed since last commit

# On branch master
#
# Initial commit
#
# Untracked files:
#
(use "git add <file>..." to include in what will be committed)
#
Our newly created file
#
README.txt
nothing added to commit but untracked files present (use "git add" to track)

LEVEL 1 — GIT BASICS
Add file to staging area
$ git add README.txt
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#
(use "git rm --cached <file>..." to unstage)
#
#
new file:
README.txt
#

Our staged file

LEVEL 1 — GIT BASICS
Commit changes

Commit message
what work was done?

timeline

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

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

No new or modified files since last commit
LEVEL 1 — GIT BASICS
Jane modifies README.txt file & adds LICENSE
$ git status
# On branch master
# Changed but not updated:
#
# modified:
README.txt
#
# Untracked files:
#
# LICENSE
no changes added to commit

LEVEL 1 — GIT BASICS

master
Add both files to staging area
$ git add README.txt LICENSE

OR
$ git add --all

Adds all new or modified files

$ git status
# On branch master
# Changes to be committed:
#
# new file:
LICENSE
# modified:
README.txt
#
LEVEL 1 — GIT BASICS

master
Commit changes
$ 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

LEVEL 1 — GIT BASICS

master
GIT TIMELINE HISTORY
$ git log
commit 1b0019c37e3f3724fb2e9035e6bab4d7d87bf455
Author: Gregg Pollack <gregg@codeschool.com>
Date:
Thu Jul 5 22:31:27 2012 -0400
Add LICENSE and finish README.
commit 5acaf86b04aaf9cbbb8ebb9042a20a46d0b9ce76
Author: Gregg Pollack <gregg@codeschool.com>
Date:
Thu Jul 5 22:00:46 2012 -0400
Create a README.

LEVEL 1 — GIT BASICS

master
DIFFERENT WAYS TO ADD
$ git add <list of files>

Add the list of files

$ git add --all

Add all files

$ git add *.txt

Add all txt files in current directory

$ git add docs/*.txt
$ git add docs/
$ git add "*.txt"

LEVEL 1 — GIT BASICS

Add all txt files in docs directory
Add all files in docs directory
Add all txt files in the whole project
STAGING & REMOTES
LEVEL 2
GIT DIFF
LICENSE
Copyright (c) 2012 Envy Labs LLC
...
Permission is hereby granted,
free of charge, to any person
obtaining a copy

LICENSE

edit

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

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

differences since last commit

Line removed
Line added
VIEWING STAGED DIFFERENCES
$ git add LICENSE
$ git diff

No differences, since all changes are staged

$ git diff --staged

View staged differences

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

LEVEL 2 — STAGING & REMOTES
UNSTAGING FILES
$
#
#
#
#
#
#
$

Unstage Tip
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified:

LICENSE

Refers to last commit

git reset HEAD LICENSE

Unstaged changes after reset:
M LICENSE

LEVEL 2 — STAGING & REMOTES

master
HEAD
DISCARD CHANGES
$ git status
# On branch master
# Changed but not updated:
#
(use "git add <file>..." to update what will be committed)
#
(use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:
LICENSE
#

$ git checkout -- LICENSE
$ git status

Blow away all changes
since last commit

nothing to commit (working directory clean)
LEVEL 2 — STAGING & REMOTES
SKIP STAGING AND COMMIT
Readme.txt
here is my readme

Readme.txt

edit

and now I can sleep

here is my readme
the cake is a lie

Add changes from all tracked files
$ git commit -a -m "Modify readme"
[master d00fefc] Modify readme
1 files changed, 1 insertions(+), 1 deletions(-)

Doesn’t add new (untracked) files
LEVEL 2 — STAGING & REMOTES

master
HEAD
UNDOING A COMMIT
Whoops, we forgot something on that commit.

Reset into staging
$ git reset --soft HEAD^
$
#
#
#
#
#
#

git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

Move to commit before ‘HEAD’

modified:

README.txt

Now I can make changes, and re-commit
LEVEL 2 — STAGING & REMOTES

master
HEAD
ADDING TO A COMMIT
Maybe we forgot to add a file

Add to the last commit
$ git add todo.txt

master

New commit message

$ git commit --amend -m "Modify readme & add todo.txt."
[master fe98ef9] Modify readme and add todo.txt.
2 files changed, 2 insertions(+), 1 deletions(-)
create mode 100644 todo.txt

Whatever has been staged is added to last commit
LEVEL 2 — STAGING & REMOTES

HEAD
USEFUL COMMANDS
$ git reset --soft HEAD^

Undo last commit, put changes into staging

$ git commit --amend -m "New Message"
$ git reset --hard HEAD^

$ git reset --hard HEAD^^

LEVEL 2 — STAGING & REMOTES

Change the last commit

Undo last commit and all changes
Undo last 2 commits and all changes
HOW TO SHARE?
Remote Repository

push
master

pull
pull

“git remote” command
Git doesn’t take care of access control
LEVEL 2 — STAGING & REMOTES
REMOTE REPOSITORY HOSTING
Hosted

Self Managed

• GitHub

• Gitosis

• BitBucket

• Gitorious

push
master
LEVEL 2 — STAGING & REMOTES
LEVEL 2 - STAGING & REMOTES
LEVEL 2 - STAGING & REMOTES
ADDING A REMOTE
$ git remote add origin https://github.com/Gregg/git-real.git

New remote

our name for this remote
show remote repositories

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

LEVEL 2 — STAGING & REMOTES

address

origin
PU SHING TO R EMOTE
remote repository name

local branch to push

$ git push -u origin master

push

Username for 'https://github.com': Gregg
Password for 'https://Gregg@github.com':
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

Password caching

master

https://help.github.com/articles/set-up-git

origin
LEVEL 2 - STAGING & REMOTES
Same information from “git log”

LEVEL 2 - STAGING & REMOTES
PU LLING FROM REMOTE
To pull changes down from the remote
$ git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
It’s
Unpacking objects: 100% (3/3), done.
From https://github.com/Gregg/git-real
fe98ef9..4e67ded master
-> origin/master
Updating fe98ef9..4e67ded
Fast-forward
todo.txt | 1 +
1 file changed, 1 insertion(+)
LEVEL 2 — STAGING & REMOTES

pull
origin

good

often
o this
to d
HAVING MULTIPLE REMOTES

production

origin

test
LEVEL 2 — STAGING & REMOTES
WORKING WITH REMOTES
To add new remotes
$ git remote add <name> <address>

To remove remotes
$ git remote rm <name>

To push to remotes
$ git push -u <name> <branch>

usually master
LEVEL 2 — STAGING & REMOTES
HEROKU REMOTE
git repo ssh address

$ heroku create
Creating dev-server-1426... done, stack is cedar
http://dev-server-1426.herokuapp.com/ | git@heroku.com: dev-server-1426.git
Git remote heroku added
$ git remote -v
heroku git@heroku.com: dev-server-1426.git (fetch)
heroku git@heroku.com: 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
$ git push heroku master
LEVEL 2 — STAGING & REMOTES

triggers deploy
USEFUL COMMANDS
$ git reset --soft HEAD^

Don’t do these after

$ git commit --amend -m "New Message"
$ git reset --hard HEAD^

$ git reset --hard HEAD^^

LEVEL 2 — STAGING & REMOTES

you push
CLONING & BRANCHING
LEVEL 3
COLLABORATING
“I want a copy”
“Clone the repo!”

egg
Gr

Jane
push

local repo

github

How do we start collaborating?
LEVEL 3 — CLONING & BRANCHING

?
FINDING THE REPO URL

URL of the remote repository
LEVEL 3 — CLONING & BRANCHING
FINDING THE REPO URL

URL of the remote repository
LEVEL 3 — CLONING & BRANCHING
CLONING A REPOSITORY
$ git clone https://github.com/codeschool/git-real.git
Cloning into 'git-real'...

URL of the remote repository
$ git clone https://github.com/codeschool/git-real.git git-demo
Cloning into 'git-demo'...

local folder name

LEVEL 3 — CLONING & BRANCHING
GIT CLONE
1 - Downloads the entire repository into a new git-real directory.
2 - Adds the ‘origin’ remote, pointing it to the clone URL.

$ git remote -v
origin
origin

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

3 - Checks out initial branch (likely master).

sets the head
LEVEL 3 — CLONING & BRANCHING

master
HEAD
BRANCHING OUT
Need to work on a feature that will take some time?
Time to branch out.
$ git branch cat

Jane
cat

branch created from master
HEAD

$ git branch
cat
* master

HEAD still on master
LEVEL 3 — CLONING & BRANCHING

master
SWITCHING TO A BRANCH
Time to jump on that new 'cat' branch.

Jane
cat

$ git checkout cat
Switched to branch 'cat'

HEAD

HEAD is now on ‘cat’
master
LEVEL 3 — CLONING & BRANCHING
WORKING ON A BRANCH
$ echo "Schrödinger" > 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

cat
HEAD

committed to the
“cat” branch
master
LEVEL 3 — CLONING & BRANCHING
WORKING ON A BRANCH
$ ls
README.txt cat.txt

see the cat?

cat
HEAD

master
LEVEL 3 — CLONING & BRANCHING
BACK TO MASTER
$ git checkout master
Switched to branch 'master'
$ ls
README.txt

cat.txt is gone!
and we’re back on master

$ git log
commit 1191ceb7252c9d4b1e05c9969a55766a8adfce3b
Author: Gregg <gregg@codeschool.com>
Date:
Wed Jun 27 23:11:20 2012 -0700
Add README.

nothing in the log either

LEVEL 3 — CLONING & BRANCHING

cat

HEAD

master
BACK TO CAT
$ git checkout cat
Switched to branch 'cat'
$ ls
README.txt cat.txt

cat

phew, still here

HEAD

master
LEVEL 3 — CLONING & BRANCHING
TIME TO MERGE
Done with that feature branch? Time to merge it into 'master '.
$ git checkout master
Switched to branch 'master'
$ ls
README.txt

HEAD

no cat, as expected

$ git merge cat
Updating 1191ceb..ab48a3f
Fast-forward
cat.txt |
1 +
1 file changed, 1 insertion(+)
create mode 100644 cat.txt

what’s that?

merge brings one branch’s changes into another

master
cat
FAST-FORWARD TO THE FUTURE
Conditions for a fast-forward merge

master
HEAD

cat

nothing new

LEVEL 3 — CLONING & BRANCHING

something new
BRANCH CLEAN UP
When you’re done with a branch, you can safely remove it.
$ git branch -d cat
Deleted branch cat (was 957dbff).

LEVEL 3 — CLONING & BRANCHING

master
HEAD

cat
NON-FAST-FORWARD
Let’s work on a new admin feature.

branch
s out
check
es and
creat

$ git checkout -b admin
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'

“Please fix the bugs on master.”
LEVEL 3 — CLONING & BRANCHING

master
admin
HEAD
BUG FI XING ON MASTER
Time to put out the fire. We’ll get back to that admin branch later.
$ git checkout master
Switched to branch 'master'
$ 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

master
admin
HEAD

HEAD
BACK TO OUR BRANCH
$ git checkout admin
Switched to branch 'admin'
...

master
admin

When ready to bring in changes
$ git checkout master
Switched to branch 'admin'
$ git merge admin

LEVEL 3 — CLONING & BRANCHING

HEAD
HEAD
AND SUDDENLY...
Git uses Vi if no default editor is set to edit commit messages.
1
2
3
4
5
6
7

Merge branch 'admin'
#
#
#
#
#

:wq

DON

’T P

ANI

Please enter a commit message to explain why this merge is necessary,
especially if it merges an updated upstream into a topic branch.
Lines starting with '#' will be ignored, and an empty message aborts
the commit.

+ hit Enter to write (save) & quit

Vi commands
j

down

k

up

ESC

leave mode

:wq

save & quit

h

left

l

right

i

insert mode

:q!

cancel & quit

C
RECURSIVE MERGING
Git can’t fast-forward since changes were made in both branches.
Merge made by the 'recursive' strategy.
0 files changed
create mode 100644 admin/dashboard.html
create mode 100644 admin/users.html

master

merge commit

admin

A commit was created to merge the two branches.
$ git log
commit 19f735c3556129279bb10a0d1447dc5aba1e1fa9
Merge: 5c9ed90 7980856
Author: Jane <Jane@CodeSchool.com>
Date:
Thu Jul 12 17:51:53 2012 -0400
Merge branch 'admin'

2 commits

2 commits
COLLABORATION BASICS
LEVEL 4
I want a co
py

github

push

Gregg

?

Jane

Clone the repo
$ git clone https://github.com/codeschool/git-real.git
Start making changes

Jane adds two files
TWO NEW FILES
jane $ git status
# On branch master
# Untracked files:
#
(use "git add <file>..." to include in what will be committed)
#
# product.rb
# store.rb
nothing added to commit but untracked files present
jane $ git add --all
jane $ git commit -m "Add store and product models."
[master 30ce481] Add product and store models.
2 files changed, 2 insertions(+)
create mode 100644 product.rb
create mode 100644 store.rb
COMMIT FLOW
Sends her new commit

jane $ git push
Counting 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

github

push new commits
master
LEVEL 4 — COLLABORATION BASICS
DIFFERENT GIT COMMITS
gregg $ git commit -am "Update the readme."
[master c715339] Update the readme.
1 file changed, 1 insertion(+), 1 deletion(-)

gregg

different

github

same

LEVEL 4 — COLLABORATION BASICS

ns now?
at happe
Wh
GIT PUSH REJECTED
gregg $ git push

Cannot write over Jane’s commit

To 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 behind
hint: 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!

LEVEL 4 — COLLABORATION BASICS
UNDERSTANDING PULL
$ git pull
1. Fetch (or Sync) our local repository with the remote one
gregg

$ git fetch

github

origin

Fetch doesn’t actually update any of our local code
UNDERSTANDING PULL
$ git pull
1. Fetch (or Sync) our local repository with the remote one
gregg

master

origin/master

$ git fetch

github

master

2. Merges the origin/master with master $ git merge origin/master
MERGE COMMIT
$ git pull
1. Fetch (or Sync) our local repository with the remote one
2. Merges the origin/master with master $ git merge origin/master

Create a new commit for this merge
1
2
3
4
5
6
7

my editor

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

Please enter a commit message to explain why this merge is necessary,
especially if it merges an updated upstream into a topic branch.
Lines starting with '#' will be ignored, and an empty message aborts
the commit.
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/master
Merge 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
2. Merges the origin/master with master

master

merge commit

origin/master

$ git fetch
$ git merge origin/master
PU SHING COMMITS
$ git push
Update origin/master be at the same state as our local repo

origin/master
master

merge commit

github
OUR LOG
gregg $ git log
commit ee47baaedcd54e1957f86bda1aaa1b8a136185da
Merge: 87c5243 57501d5
Author: Gregg Pollack <Gregg@CodeSchool.com>

The problem with pull

Merge branch 'master' of https://github.com/Gregg/git-real
commit 87c5243d2266f05cd9fda8b1c9137f11b3fe6f31
Author: Gregg Pollack <Gregg@CodeSchool.com>
Update the readme.
commit 57501d595b16e2d1198a9c04c547a5b1380a6618
Author: Gregg Pollack <Gregg@CodeSchool.com>
Add store and product models.
MERGE CONFLICTS
README

README

Gregg

here is my readme

committed

different
same

Jane

the cake is telling the truth!

the cake is a lie

gregg

here is my readme

github

committed & pushed
MERGE CONFLICT
gregg $ git pull
remote: 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/master
Auto-merging README.txt
CONFLICT (content): Merge conflict in README.txt
Automatic merge failed; fix conflicts and then commit the result.

Git modified this file with the diff
LEVEL 4 — COLLABORATION BASICS
MERGE CONFLICT
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 <file>..." 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

LEVEL 4 — COLLABORATION BASICS
MERGE CONFLICT
README

Edit file and correct

here is my readme

here is my readme

Our local version
the
Jane’s version

<<<<<<< HEAD
the cake is a lie.
=======
the cake is telling the truth!
>>>>>>>
4e76d3542a7eee02ec516a47600002a90a4e4b48
gregg $ git commit -a

Merge commit
LEVEL 4 — COLLABORATION BASICS

cake is a lie.
COMMIT EDITOR
gregg $ git commit -a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Merge commit

Editor

Merge branch 'master' of https://github.com/Gregg/git-real
Conflicts:
▸ README.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#▸.git/MERGE_HEAD
# and try again.

#
#
#
#
#

Please enter the commit message for your changes. Lines starting
with '#' will be ignored, and an empty message aborts the commit.
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
MERGE COMMIT
origin/master
master

master
Merge commit

Merge commit

origin/master
$ git push
COLLABORATION BASICS
LEVEL 4
REMOTE BRANCHES & TAGS
LEVEL 5
WHY CREATE A REMOTE BRANCH?
• When you need other people to work on your branch.
• Any branch that will last more than a day.

Gregg

LEVEL 5 — REMOTE BRANCHES AND TAGS
CREATING A REMOTE BRANCH
$ git checkout -b shopping_cart
Switched 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)

LEVEL 5 — REMOTE BRANCHES AND TAGS
PU SHING 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 push
Counting 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 BRANCH
Hey Jane, I star
ted a branch

ck it out
t, I’ll che
Swee

LEVEL 5 — REMOTE BRANCHES AND TAGS
PU LLING NEW BRANCHES
$ git pull
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_cart
Updating 4e76d35..786d7a1
Fast-forward
README.txt | 2 +1 file changed, 1 insertion(+), 1 deletion(-)

LEVEL 5 — REMOTE BRANCHES AND TAGS

remote branch
PU LLING NEW BRANCHES
$ git branch
* master
$ git branch -r
origin/master
origin/shopping_cart

list all remote branches

$ 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

nd push!
ntribute a
we can co
Now

LEVEL 5 — REMOTE BRANCHES AND TAGS
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
$ git push origin :shopping_cart

Deletes remote branch

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

Must delete local branch manua

lly

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).

LEVEL 5 — REMOTE BRANCHES AND TAGS
WHAT ABOUT GREGG?

Jane

Gregg

LEVEL 5 — REMOTE BRANCHES AND TAGS
ON DELETED REMOTE BRANCH
$ git commit -m -a "Add ability to pay."
[shopping_cart 9851887] Add ability to pay.
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push

No remote to push to (it’s jus

Everything up-to-date

Gregg
t a local branch now)

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

$ git remote prune origin

To clean up deleted remote br
anches

Pruning origin
URL: https://github.com/codeschool/git-real.git
* [pruned] origin/shopping_cart
REMOTE BRANCH NAMES
Heroku deploys only master bra

$ git branch
* staging
master
$ git push heroku-staging staging

Would not work, would push to staging

local:remote
$ git push heroku-staging staging:master

Will push and deploy staging on heroku
LEVEL 5 — REMOTE BRANCHES AND TAGS

nc h

heroku-staging
TAGGING
A tag is a reference to a commit (used mostly for release versioning)
$ git tag
v0.0.1
v0.0.2

list all tags

$ git checkout v0.0.1

out code at commit
check
Text

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

To push new tags
$ git push --tags
LEVEL 5 — REMOTE BRANCHES AND TAGS
REMOTE BRANCHES & TAGS
LEVEL 5
REBASE BELONG TO US
LEVEL 6
MERGE COMMITS ARE BAD
Merge branch 'cats'

origin/master
master

Add Cats.

merge commit

Merge branch 'master' of http...
Update the Readme.
Add product and store models.

M

seless
feel u
mmits
rge co
e

LEVEL 6 — REBASE BELONG TO US
DIFFERENT GIT COMMITS
gregg $ git commit -am "Update the readme."
[master c715339] Update the readme.
1 file changed, 1 insertion(+), 1 deletion(-)

gregg

different

github

same

LEVEL 6 — REBASE BELONG TO US

s commit
Jane’
GIT PUSH REJECTED
gregg $ git push

Cannot write over Jane’s commit

To 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 behind
hint: 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

ope!
N

...
LEVEL 6 — REBASE BELONG TO US
FETCH
gregg $ git fetch
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
f35f2f1..71a4650 master
-> origin/master

gregg

github

Syncs
but doesn’t merge

LEVEL 6 — REBASE BELONG TO US

master

origin/master
REBASE
gregg $ git rebase

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

temp

master

origin/master

LEVEL 6 — REBASE BELONG TO US
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.

temp

master

origin/master

3. Run all commits in the temporary area, one at a time.
LEVEL 6 — REBASE BELONG TO US
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.

master
Update the Readme.

No M

erge

Add product and store models.

Comm
it!
LOCAL BRANCH REBASE
$ git checkout admin
Switched to branch 'admin'
$ git rebase master
...

master
admin

Rebase

master
admin
I F AL L GOES WELL, MERGE MAS TER
$ git checkout master
Switched to branch 'master'
$ git merge admin
...

master
admin
WHAT ABOUT CONFLICTS
gregg

github

le!
fi
me
sa

Add shopping cart.

ed
dit
E

Add lie to readme.

same

LEVEL 6 — REBASE BELONG TO US

Add truth to readme.

Add product and store models.
FETCH
gregg $ git fetch

master

origin/master

Add shopping cart.

Add truth to readme.

Add lie to readme.

Add product and store models.

LEVEL 6 — REBASE BELONG TO US
REBASE
gregg $ git rebase

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

origin/master

temp

Add truth to readme.

Add product and store models.

master
REBASE
gregg $ git rebase

2. Run all origin/master commits.

temp

master
Add shopping cart.

Add truth to readme.

Add product and store models.
Add lie to readme.

3. Run all commits in the temporary area, one at a time.
REBASE CONFLICT
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
<stdin>: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.txt
CONFLICT (content): Merge conflict in README.txt
Failed to merge in the changes.
Patch failed at 0001 Add lie to readme.

master
CONFLICT

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".
REBASE CONFLICT
gregg $ git status
# Not currently on any branch.
# Unmerged paths:
#
(use "git reset HEAD <file>..." to unstage)
#
(use "git add/rm <file>..." 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 $

master
REBASED LOG
master
Add shopping cart.
Add lie to readme.

Add truth to readme.

Add product and store models.
REBASE BELONG TO US
LEVEL 6
HISTORY & CONFIGURATION
LEVEL 7
VIEWING THE LOG
$ git log
commit 915f242e262052b11c511dc07bef237fabb7ed85
SHA
Author: Gregg <gregg@codeschool.com>
Date:
Thu Jun 28 02:10:57 2012 -0700
Update index.
commit message

hash
COLORIZING THE LOG
$ git config --global color.ui true
$ git log
commit 915f242e262052b11c511dc07bef237fabb7ed85
Author: Gregg <gregg@codeschool.com>
Date:
Thu Jun 28 02:10:57 2012 -0700
Update index
$ git log --pretty=oneline
08f202691c67abd12eb886b587ac7b26d51005c7 Update index
LOG FORMAT
$ git log --pretty=format:"%h %ad- %s [%an]"
placeholder

replaced with

%ad

author date

%an

author name

%h

SHA hash

%s

subject

%d

ref names

run “git help log” for more options!
LEVEL 7 — HISTORY & CONFIGURATION

any string you want
& placeholder data
PATCH
$ git log --oneline -p
3ea7f70 I'm telling you, it's 'Octopi'.
diff --git a/index.html b/index.html
index 021a54e..640d66d 100644
--- a/index.html
+++ b/index.html
@@ -8,7 +8,7 @@
<nav>
<ul>
<li><a href="cat.html">Cats</a></li>
<li><a href="octopus.html">Octopuses</a></li>
+
<li><a href="octopi.html">Octopi</a></li>
LEVEL 7 — HISTORY & CONFIGURATION
STATS
$ git log --oneline --stat
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(-)

LEVEL 7 — HISTORY & CONFIGURATION
GRAPH
$ git log --oneline --graph
*
30b1f8f Merge branch 'bird' into master
|
| * 8b8f950 Revise silly hipster name for bird aisle.
* | 915f242 Add emphasis.
|/
* 69728cd Update index descriptions.

visual representation of the branch merging into master

LEVEL 7 — HISTORY & CONFIGURATION
DATE RANGES
$ git log --until=1.minute.ago

until

$ git log --since=1.day.ago

since (days)

$ git log --since=1.hour.ago

since (hours)

$ git log --since=1.month.ago --until=2.weeks.ago

since & until (relative)

$ git log --since=2000-01-01 --until=2012-12-21

since & until (absolute)
DIFFS
$ git diff
diff --git a/index.html b/index.html
@@ -8,7 +8,10 @@
<nav>
<ul>
<li><a href="cat.html">Cats</a></li>
<li><a href="octopus.html">Octopuses</a></li>
+
<li><a href="birds.html">Birds</a></li>
+
<li><a href="hamsters.html">Hamsters</a></li>
</ul>
</nav>
</body>

removed line

added lines

LEVEL 7 — HISTORY & CONFIGURATION
UNCOMMITTED CHANGES
$ git diff HEAD
diff --git a/index.html b/index.html
index 021a54e..1ceb9d6 100644
diff between last commit
@@ -8,7 +8,10 @@
& current state
<ul>
<li><a href="cat.html">Cats</a></li>
...
diff --git a/octopus.html b/octopus.html
index 55806be..ce8a2c7 100644
@@ -2,6 +2,6 @@
<html lang="en">
...

includes both staged and unstaged files
EARLIER COMMITS
parent of latest commit

$ git diff HEAD^
$ 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

LEVEL 7 — HISTORY & CONFIGURATION
EARLIER COMMITS
$ git diff f5a6sdfsfsdfsdfff9..4sdsdfsdfsdfsdffb063f

range of SHAs

$ git log --oneline
257256c cat
4fb063f Add index
f5a6ff9 Add catalog pages

$ git diff 4fb063f..f5a6ff9
$ git diff master bird

range of abbreviated SHAs
diff between two branches

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

time-based diff
BLAME
$ git blame index.html --date short
...
96776a42 (Gregg 2012-06-29 9) <ul>
96776a42 (Gregg 2012-06-29 10)
<li>Cats</li>
3ea7f709 (Jane
2012-06-30 11)
<li>Octopi</li>
96776a42 (Gregg 2012-06-29 12) </ul>
...

commit hash author

date

line # content

LEVEL 7 — HISTORY & CONFIGURATION
EXCLUDING FILES
$ git status
# Untracked files:
#
(use "git add <file>..." to include in what will be committed)
#
# experiments/
we don’t want to commit this...
.git/info/exclude

experiments/

will exclude this folder from git

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

the experiment directory is now invisible to git
EXCLUDE PATTERNS
tutorial.mp4
*.mp4
experiments/
logs/*.log

LEVEL 7 — HISTORY & CONFIGURATION

exclude this file
exclude all .mp4 files
exclude directory
exclude .log files in logs directory
EXCLUDING FROM ALL COPIES
$
#
#
#
#
#

git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
logs/server.log

don’t commit log files, they create conflicts

.gitignore

logs/*.log

add this pattern

$ git status
no more logs
# On branch master
nothing to commit (working directory clean)
REMOVING FILES
$ git rm README.txt
$ git status
# Changes to be committed:
#
# deleted:
README.txt

DELETED from the local filesystem & untracked
$ git commit -m “Remove readme”

LEVEL 7 — HISTORY & CONFIGURATION
UNTRACKING FILES
$ git rm --cached development.log

what if you’re already tracking log files?

$ git status
# Changes to be committed:
#
# deleted:
development.log

not deleted from the local file system, only from Git

LEVEL 7 — HISTORY & CONFIGURATION
UNTRACKING FILES
.gitignore

logs/*.log

will ignore all .log files inside the logs directory

$ git add .gitignore
$ 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

LEVEL 7 — HISTORY & CONFIGURATION
CONFIG
$ git config --global user.name "Gregg Pollack"
$ git config --global user.email "gregg@codeschool.com"

remember these? there’s more
$ git config --global core.editor emacs

$ git config --global merge.tool opendiff

LEVEL 7 — HISTORY & CONFIGURATION

use emacs for interactive commands
OS X o
use opendiff for merging conflictsnly
LOCAL CONFIG
$ git config user.email "spamme@example.com" sets email for current repo
$ git config --list
user.name=Gregg
user.email=gregg@codeschool.com
color.ui=true
core.editor=mate -w
user.email=spamme@example.com

same key can
be set twice

$ git config user.email
spamme@example.com

the global config loaded first, then repo config
ALIASES

aliases for log formats

$ 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"
$ git mylog
*
19f735c
|
| * 7980856
* | 5c9ed90
|/
*
ab48a3f

Merge branch 'admin' [Jane]
Add user admin [Jane]
Add dashboard. [Jane]
Create quantum cat. [Jane]
ALIASES

git config alias.<name> <command>

$ git config --global alias.st status

git st

git status

$ git config --global alias.co checkout

git co

git checkout

$ git config --global alias.br branch

git br

git branch

$ git config --global alias.ci commit

git ci

git commit

$ git st
# On branch master
nothing to commit (working directory clean)
Git Concepts, Commands and Connectivity

Git Concepts, Commands and Connectivity

  • 2.
  • 3.
  • 4.
  • 5.
    REPOSITORY LOCATIONS Central Repository LEVEL1 — GIT BASICS Distributed Repository
  • 6.
    Git is a DISTRIBUTEDVERSION CONTROL SYSTEM (DVCS)
  • 7.
    ORIGINS • Linux Kernelproject. • Meant to be distributed, fast and more natural. • Capable of handling large projects. LEVEL 1 — GIT BASICS
  • 8.
    WORKING WITH GIT •Command line interface • Many GUI tools available • Official Git Site — http://git-scm.com/ start here LEVEL 1 — GIT BASICS
  • 9.
    GIT HELP $ githelp usage: git [--version] [--exec-path[=<path>]] [--html-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [-c name=value] [--help] <command> [<args>] 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 ... LEVEL 1 — GIT BASICS
  • 10.
    GIT HELP $ githelp config GIT-CONFIG(1) Git Manual GIT-CONFIG(1) pass in any git command NAME git-config - Get and set repository or global options SYNOPSIS git config [<file-option>] [type] [-z|--null] name [value [value_regex]] git config [<file-option>] [type] --add name value ... LEVEL 1 — GIT BASICS
  • 11.
    SETTING UP GIT $git config --global user.name "Gregg Pollack" Who gets credit for changes $ git config --global user.email [email protected] $ git config --global color.ui true LEVEL 1 — GIT BASICS What email you use Pretty command line colors
  • 12.
    STARTING A REPO $mkdir store $ cd store $ git init Initialized empty Git repository in /Users/gregg/store/.git/ git metadata is stored here LEVEL 1 — GIT BASICS
  • 13.
    GIT WORK FLOW Janecreates README.txt file Starts as untracked Add file to staging area Getting ready to take a picture Commit changes A snapshot of those on the stage LEVEL 1 — GIT BASICS
  • 14.
    GIT WORK FLOW Janecreates README.txt file Add file to staging area Commit changes Jane modifies README.txt file & adds LICENSE Add both files to staging area Commit changes LEVEL 1 — GIT BASICS
  • 15.
    Jane creates README.txtfile $ git status To check what’s changed since last commit # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # Our newly created file # README.txt nothing added to commit but untracked files present (use "git add" to track) LEVEL 1 — GIT BASICS
  • 16.
    Add file tostaging area $ git add README.txt $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README.txt # Our staged file LEVEL 1 — GIT BASICS
  • 17.
    Commit changes Commit message whatwork was done? timeline $ git commit -m "Create a README." [master abe28da] Create a README. 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 README.txt master $ git status # On branch master nothing to commit (working directory clean) No new or modified files since last commit LEVEL 1 — GIT BASICS
  • 18.
    Jane modifies README.txtfile & adds LICENSE $ git status # On branch master # Changed but not updated: # # modified: README.txt # # Untracked files: # # LICENSE no changes added to commit LEVEL 1 — GIT BASICS master
  • 19.
    Add both filesto staging area $ git add README.txt LICENSE OR $ git add --all Adds all new or modified files $ git status # On branch master # Changes to be committed: # # new file: LICENSE # modified: README.txt # LEVEL 1 — GIT BASICS master
  • 20.
    Commit changes $ gitcommit -m "Add LICENSE and finish README." [master 1b0019c] Add LICENSE and finish README. 2 files changed, 21 insertions(+), 0 deletions(-) create mode 100644 LICENSE LEVEL 1 — GIT BASICS master
  • 21.
    GIT TIMELINE HISTORY $git log commit 1b0019c37e3f3724fb2e9035e6bab4d7d87bf455 Author: Gregg Pollack <[email protected]> Date: Thu Jul 5 22:31:27 2012 -0400 Add LICENSE and finish README. commit 5acaf86b04aaf9cbbb8ebb9042a20a46d0b9ce76 Author: Gregg Pollack <[email protected]> Date: Thu Jul 5 22:00:46 2012 -0400 Create a README. LEVEL 1 — GIT BASICS master
  • 22.
    DIFFERENT WAYS TOADD $ git add <list of files> Add the list of files $ git add --all Add all files $ git add *.txt Add all txt files in current directory $ git add docs/*.txt $ git add docs/ $ git add "*.txt" LEVEL 1 — GIT BASICS Add all txt files in docs directory Add all files in docs directory Add all txt files in the whole project
  • 25.
  • 26.
    GIT DIFF LICENSE Copyright (c)2012 Envy Labs LLC ... Permission is hereby granted, free of charge, to any person obtaining a copy LICENSE edit Copyright (c) 2012 Code School LLC ... Permission is hereby granted, free of charge, to any person obtaining a copy Show unstaged $ git diff diff --git a/LICENSE b/LICENSE index 7e4922d..442669e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2012 Envy Labs LLC +Copyright (c) 2012 Code School LLC differences since last commit Line removed Line added
  • 27.
    VIEWING STAGED DIFFERENCES $git add LICENSE $ git diff No differences, since all changes are staged $ git diff --staged View staged differences diff --git a/LICENSE b/LICENSE index 7e4922d..442669e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2012 Envy Labs LLC +Copyright (c) 2012 Code School LLC LEVEL 2 — STAGING & REMOTES
  • 28.
    UNSTAGING FILES $ # # # # # # $ Unstage Tip gitstatus On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: LICENSE Refers to last commit git reset HEAD LICENSE Unstaged changes after reset: M LICENSE LEVEL 2 — STAGING & REMOTES master HEAD
  • 29.
    DISCARD CHANGES $ gitstatus # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: LICENSE # $ git checkout -- LICENSE $ git status Blow away all changes since last commit nothing to commit (working directory clean) LEVEL 2 — STAGING & REMOTES
  • 30.
    SKIP STAGING ANDCOMMIT Readme.txt here is my readme Readme.txt edit and now I can sleep here is my readme the cake is a lie Add changes from all tracked files $ git commit -a -m "Modify readme" [master d00fefc] Modify readme 1 files changed, 1 insertions(+), 1 deletions(-) Doesn’t add new (untracked) files LEVEL 2 — STAGING & REMOTES master HEAD
  • 31.
    UNDOING A COMMIT Whoops,we forgot something on that commit. Reset into staging $ git reset --soft HEAD^ $ # # # # # # git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) Move to commit before ‘HEAD’ modified: README.txt Now I can make changes, and re-commit LEVEL 2 — STAGING & REMOTES master HEAD
  • 32.
    ADDING TO ACOMMIT Maybe we forgot to add a file Add to the last commit $ git add todo.txt master New commit message $ git commit --amend -m "Modify readme & add todo.txt." [master fe98ef9] Modify readme and add todo.txt. 2 files changed, 2 insertions(+), 1 deletions(-) create mode 100644 todo.txt Whatever has been staged is added to last commit LEVEL 2 — STAGING & REMOTES HEAD
  • 33.
    USEFUL COMMANDS $ gitreset --soft HEAD^ Undo last commit, put changes into staging $ git commit --amend -m "New Message" $ git reset --hard HEAD^ $ git reset --hard HEAD^^ LEVEL 2 — STAGING & REMOTES Change the last commit Undo last commit and all changes Undo last 2 commits and all changes
  • 34.
    HOW TO SHARE? RemoteRepository push master pull pull “git remote” command Git doesn’t take care of access control LEVEL 2 — STAGING & REMOTES
  • 35.
    REMOTE REPOSITORY HOSTING Hosted SelfManaged • GitHub • Gitosis • BitBucket • Gitorious push master LEVEL 2 — STAGING & REMOTES
  • 36.
    LEVEL 2 -STAGING & REMOTES
  • 37.
    LEVEL 2 -STAGING & REMOTES
  • 38.
    ADDING A REMOTE $git remote add origin https://github.com/Gregg/git-real.git New remote our name for this remote show remote repositories $ git remote -v origin https://github.com/Gregg/git-real.git (fetch) origin https://github.com/Gregg/git-real.git (push) LEVEL 2 — STAGING & REMOTES address origin
  • 39.
    PU SHING TOR EMOTE remote repository name local branch to push $ git push -u origin master push Username for 'https://github.com': Gregg Password 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 Password caching master https://help.github.com/articles/set-up-git origin
  • 40.
    LEVEL 2 -STAGING & REMOTES
  • 41.
    Same information from“git log” LEVEL 2 - STAGING & REMOTES
  • 42.
    PU LLING FROMREMOTE To pull changes down from the remote $ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (1/1), done. remote: Total 3 (delta 1), reused 3 (delta 1) It’s Unpacking objects: 100% (3/3), done. From https://github.com/Gregg/git-real fe98ef9..4e67ded master -> origin/master Updating fe98ef9..4e67ded Fast-forward todo.txt | 1 + 1 file changed, 1 insertion(+) LEVEL 2 — STAGING & REMOTES pull origin good often o this to d
  • 43.
  • 44.
    WORKING WITH REMOTES Toadd new remotes $ git remote add <name> <address> To remove remotes $ git remote rm <name> To push to remotes $ git push -u <name> <branch> usually master LEVEL 2 — STAGING & REMOTES
  • 45.
    HEROKU REMOTE git repossh address $ heroku create Creating dev-server-1426... done, stack is cedar http://dev-server-1426.herokuapp.com/ | [email protected]: dev-server-1426.git Git remote heroku added $ git remote -v heroku [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 $ git push heroku master LEVEL 2 — STAGING & REMOTES triggers deploy
  • 46.
    USEFUL COMMANDS $ gitreset --soft HEAD^ Don’t do these after $ git commit --amend -m "New Message" $ git reset --hard HEAD^ $ git reset --hard HEAD^^ LEVEL 2 — STAGING & REMOTES you push
  • 49.
  • 50.
    COLLABORATING “I want acopy” “Clone the repo!” egg Gr Jane push local repo github How do we start collaborating? LEVEL 3 — CLONING & BRANCHING ?
  • 51.
    FINDING THE REPOURL URL of the remote repository LEVEL 3 — CLONING & BRANCHING
  • 52.
    FINDING THE REPOURL URL of the remote repository LEVEL 3 — CLONING & BRANCHING
  • 53.
    CLONING A REPOSITORY $git clone https://github.com/codeschool/git-real.git Cloning into 'git-real'... URL of the remote repository $ git clone https://github.com/codeschool/git-real.git git-demo Cloning into 'git-demo'... local folder name LEVEL 3 — CLONING & BRANCHING
  • 54.
    GIT CLONE 1 -Downloads the entire repository into a new git-real directory. 2 - Adds the ‘origin’ remote, pointing it to the clone URL. $ git remote -v origin origin https://github.com/codeschool/git-real.git (fetch) https://github.com/codeschool/git-real.git (push) 3 - Checks out initial branch (likely master). sets the head LEVEL 3 — CLONING & BRANCHING master HEAD
  • 55.
    BRANCHING OUT Need towork on a feature that will take some time? Time to branch out. $ git branch cat Jane cat branch created from master HEAD $ git branch cat * master HEAD still on master LEVEL 3 — CLONING & BRANCHING master
  • 56.
    SWITCHING TO ABRANCH Time to jump on that new 'cat' branch. Jane cat $ git checkout cat Switched to branch 'cat' HEAD HEAD is now on ‘cat’ master LEVEL 3 — CLONING & BRANCHING
  • 57.
    WORKING ON ABRANCH $ echo "Schrödinger" > 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 cat HEAD committed to the “cat” branch master LEVEL 3 — CLONING & BRANCHING
  • 58.
    WORKING ON ABRANCH $ ls README.txt cat.txt see the cat? cat HEAD master LEVEL 3 — CLONING & BRANCHING
  • 59.
    BACK TO MASTER $git checkout master Switched to branch 'master' $ ls README.txt cat.txt is gone! and we’re back on master $ git log commit 1191ceb7252c9d4b1e05c9969a55766a8adfce3b Author: Gregg <[email protected]> Date: Wed Jun 27 23:11:20 2012 -0700 Add README. nothing in the log either LEVEL 3 — CLONING & BRANCHING cat HEAD master
  • 60.
    BACK TO CAT $git checkout cat Switched to branch 'cat' $ ls README.txt cat.txt cat phew, still here HEAD master LEVEL 3 — CLONING & BRANCHING
  • 61.
    TIME TO MERGE Donewith that feature branch? Time to merge it into 'master '. $ git checkout master Switched to branch 'master' $ ls README.txt HEAD no cat, as expected $ git merge cat Updating 1191ceb..ab48a3f Fast-forward cat.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 cat.txt what’s that? merge brings one branch’s changes into another master cat
  • 62.
    FAST-FORWARD TO THEFUTURE Conditions for a fast-forward merge master HEAD cat nothing new LEVEL 3 — CLONING & BRANCHING something new
  • 63.
    BRANCH CLEAN UP Whenyou’re done with a branch, you can safely remove it. $ git branch -d cat Deleted branch cat (was 957dbff). LEVEL 3 — CLONING & BRANCHING master HEAD cat
  • 64.
    NON-FAST-FORWARD Let’s work ona new admin feature. branch s out check es and creat $ git checkout -b admin 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' “Please fix the bugs on master.” LEVEL 3 — CLONING & BRANCHING master admin HEAD
  • 65.
    BUG FI XINGON MASTER Time to put out the fire. We’ll get back to that admin branch later. $ git checkout master Switched to branch 'master' $ 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 master admin HEAD HEAD
  • 66.
    BACK TO OURBRANCH $ git checkout admin Switched to branch 'admin' ... master admin When ready to bring in changes $ git checkout master Switched to branch 'admin' $ git merge admin LEVEL 3 — CLONING & BRANCHING HEAD HEAD
  • 67.
    AND SUDDENLY... Git usesVi if no default editor is set to edit commit messages. 1 2 3 4 5 6 7 Merge branch 'admin' # # # # # :wq DON ’T P ANI Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream into a topic branch. Lines starting with '#' will be ignored, and an empty message aborts the commit. + hit Enter to write (save) & quit Vi commands j down k up ESC leave mode :wq save & quit h left l right i insert mode :q! cancel & quit C
  • 68.
    RECURSIVE MERGING Git can’tfast-forward since changes were made in both branches. Merge made by the 'recursive' strategy. 0 files changed create mode 100644 admin/dashboard.html create mode 100644 admin/users.html master merge commit admin A commit was created to merge the two branches. $ git log commit 19f735c3556129279bb10a0d1447dc5aba1e1fa9 Merge: 5c9ed90 7980856 Author: Jane <[email protected]> Date: Thu Jul 12 17:51:53 2012 -0400 Merge branch 'admin' 2 commits 2 commits
  • 71.
  • 72.
    I want aco py github push Gregg ? Jane Clone the repo $ git clone https://github.com/codeschool/git-real.git Start making changes Jane adds two files
  • 73.
    TWO NEW FILES jane$ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # product.rb # store.rb nothing added to commit but untracked files present jane $ git add --all jane $ git commit -m "Add store and product models." [master 30ce481] Add product and store models. 2 files changed, 2 insertions(+) create mode 100644 product.rb create mode 100644 store.rb
  • 74.
    COMMIT FLOW Sends hernew commit jane $ git push Counting 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 github push new commits master LEVEL 4 — COLLABORATION BASICS
  • 75.
    DIFFERENT GIT COMMITS gregg$ git commit -am "Update the readme." [master c715339] Update the readme. 1 file changed, 1 insertion(+), 1 deletion(-) gregg different github same LEVEL 4 — COLLABORATION BASICS ns now? at happe Wh
  • 76.
    GIT PUSH REJECTED gregg$ git push Cannot write over Jane’s commit To 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 behind hint: 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! LEVEL 4 — COLLABORATION BASICS
  • 77.
    UNDERSTANDING PULL $ gitpull 1. Fetch (or Sync) our local repository with the remote one gregg $ git fetch github origin Fetch doesn’t actually update any of our local code
  • 78.
    UNDERSTANDING PULL $ gitpull 1. Fetch (or Sync) our local repository with the remote one gregg master origin/master $ git fetch github master 2. Merges the origin/master with master $ git merge origin/master
  • 79.
    MERGE COMMIT $ gitpull 1. Fetch (or Sync) our local repository with the remote one 2. Merges the origin/master with master $ git merge origin/master Create a new commit for this merge 1 2 3 4 5 6 7 my editor Merge branch 'master' of https://github.com/codeschool/git-real # # # # # Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream into a topic branch. Lines starting with '#' will be ignored, and an empty message aborts the commit.
  • 80.
    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/master Merge 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
  • 81.
    MERGE COMMIT $ gitpull 1. Fetch (or Sync) our local repository with the remote one 2. Merges the origin/master with master master merge commit origin/master $ git fetch $ git merge origin/master
  • 82.
    PU SHING COMMITS $git push Update origin/master be at the same state as our local repo origin/master master merge commit github
  • 83.
    OUR LOG gregg $git log commit ee47baaedcd54e1957f86bda1aaa1b8a136185da Merge: 87c5243 57501d5 Author: Gregg Pollack <[email protected]> The problem with pull Merge branch 'master' of https://github.com/Gregg/git-real commit 87c5243d2266f05cd9fda8b1c9137f11b3fe6f31 Author: Gregg Pollack <[email protected]> Update the readme. commit 57501d595b16e2d1198a9c04c547a5b1380a6618 Author: Gregg Pollack <[email protected]> Add store and product models.
  • 84.
    MERGE CONFLICTS README README Gregg here ismy readme committed different same Jane the cake is telling the truth! the cake is a lie gregg here is my readme github committed & pushed
  • 85.
    MERGE CONFLICT gregg $git pull remote: 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/master Auto-merging README.txt CONFLICT (content): Merge conflict in README.txt Automatic merge failed; fix conflicts and then commit the result. Git modified this file with the diff LEVEL 4 — COLLABORATION BASICS
  • 86.
    MERGE CONFLICT 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 <file>..." 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 LEVEL 4 — COLLABORATION BASICS
  • 87.
    MERGE CONFLICT README Edit fileand correct here is my readme here is my readme Our local version the Jane’s version <<<<<<< HEAD the cake is a lie. ======= the cake is telling the truth! >>>>>>> 4e76d3542a7eee02ec516a47600002a90a4e4b48 gregg $ git commit -a Merge commit LEVEL 4 — COLLABORATION BASICS cake is a lie.
  • 88.
    COMMIT EDITOR gregg $git commit -a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Merge commit Editor Merge branch 'master' of https://github.com/Gregg/git-real Conflicts: ▸ README.txt # # It looks like you may be committing a merge. # If this is not correct, please remove the file #▸.git/MERGE_HEAD # and try again. # # # # # Please enter the commit message for your changes. Lines starting with '#' will be ignored, and an empty message aborts the commit. On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commit each, respectively.
  • 89.
  • 90.
  • 93.
    REMOTE BRANCHES &TAGS LEVEL 5
  • 94.
    WHY CREATE AREMOTE BRANCH? • When you need other people to work on your branch. • Any branch that will last more than a day. Gregg LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 95.
    CREATING A REMOTEBRANCH $ git checkout -b shopping_cart Switched 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) LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 96.
    PU SHING TOTHE 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 push Counting 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
  • 99.
    CREATING A BRANCH HeyJane, I star ted a branch ck it out t, I’ll che Swee LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 100.
    PU LLING NEWBRANCHES $ git pull 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_cart Updating 4e76d35..786d7a1 Fast-forward README.txt | 2 +1 file changed, 1 insertion(+), 1 deletion(-) LEVEL 5 — REMOTE BRANCHES AND TAGS remote branch
  • 101.
    PU LLING NEWBRANCHES $ git branch * master $ git branch -r origin/master origin/shopping_cart list all remote branches $ 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 nd push! ntribute a we can co Now LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 102.
    REMOTE SHOW $ gitremote 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)
  • 103.
    REMOVING A BRANCH $git push origin :shopping_cart Deletes remote branch To https://github.com/codeschool/git-real.git - [deleted] shopping_cart $ git branch -d shopping_cart Must delete local branch manua lly 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). LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 104.
    WHAT ABOUT GREGG? Jane Gregg LEVEL5 — REMOTE BRANCHES AND TAGS
  • 105.
    ON DELETED REMOTEBRANCH $ git commit -m -a "Add ability to pay." [shopping_cart 9851887] Add ability to pay. 1 file changed, 1 insertion(+), 1 deletion(-) $ git push No remote to push to (it’s jus Everything up-to-date Gregg t a local branch now) $ git remote show origin Remote branches: master tracked refs/remotes/origin/shopping_cart stale (use 'git remote prune' to remove) $ git remote prune origin To clean up deleted remote br anches Pruning origin URL: https://github.com/codeschool/git-real.git * [pruned] origin/shopping_cart
  • 106.
    REMOTE BRANCH NAMES Herokudeploys only master bra $ git branch * staging master $ git push heroku-staging staging Would not work, would push to staging local:remote $ git push heroku-staging staging:master Will push and deploy staging on heroku LEVEL 5 — REMOTE BRANCHES AND TAGS nc h heroku-staging
  • 107.
    TAGGING A tag isa reference to a commit (used mostly for release versioning) $ git tag v0.0.1 v0.0.2 list all tags $ git checkout v0.0.1 out code at commit check Text To add a new tag $ git tag -a v0.0.3 -m "version 0.0.3" To push new tags $ git push --tags LEVEL 5 — REMOTE BRANCHES AND TAGS
  • 110.
    REMOTE BRANCHES &TAGS LEVEL 5
  • 113.
    REBASE BELONG TOUS LEVEL 6
  • 114.
    MERGE COMMITS AREBAD Merge branch 'cats' origin/master master Add Cats. merge commit Merge branch 'master' of http... Update the Readme. Add product and store models. M seless feel u mmits rge co e LEVEL 6 — REBASE BELONG TO US
  • 115.
    DIFFERENT GIT COMMITS gregg$ git commit -am "Update the readme." [master c715339] Update the readme. 1 file changed, 1 insertion(+), 1 deletion(-) gregg different github same LEVEL 6 — REBASE BELONG TO US s commit Jane’
  • 116.
    GIT PUSH REJECTED gregg$ git push Cannot write over Jane’s commit To 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 behind hint: 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 ope! N ... LEVEL 6 — REBASE BELONG TO US
  • 117.
    FETCH gregg $ gitfetch 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 f35f2f1..71a4650 master -> origin/master gregg github Syncs but doesn’t merge LEVEL 6 — REBASE BELONG TO US master origin/master
  • 118.
    REBASE gregg $ gitrebase 1. Move all changes to master which are not in origin/master to a temporary area. temp master origin/master LEVEL 6 — REBASE BELONG TO US
  • 119.
    REBASE gregg $ gitrebase 1. Move all changes to master which are not in origin/master to a temporary area. 2. Run all origin/master commits. temp master origin/master 3. Run all commits in the temporary area, one at a time. LEVEL 6 — REBASE BELONG TO US
  • 120.
    REBASE gregg $ gitrebase 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. master Update the Readme. No M erge Add product and store models. Comm it!
  • 121.
    LOCAL BRANCH REBASE $git checkout admin Switched to branch 'admin' $ git rebase master ... master admin Rebase master admin
  • 122.
    I F ALL GOES WELL, MERGE MAS TER $ git checkout master Switched to branch 'master' $ git merge admin ... master admin
  • 123.
    WHAT ABOUT CONFLICTS gregg github le! fi me sa Addshopping cart. ed dit E Add lie to readme. same LEVEL 6 — REBASE BELONG TO US Add truth to readme. Add product and store models.
  • 124.
    FETCH gregg $ gitfetch master origin/master Add shopping cart. Add truth to readme. Add lie to readme. Add product and store models. LEVEL 6 — REBASE BELONG TO US
  • 125.
    REBASE gregg $ gitrebase 1. Move all changes to master which are not in origin/master to a temporary area origin/master temp Add truth to readme. Add product and store models. master
  • 126.
    REBASE gregg $ gitrebase 2. Run all origin/master commits. temp master Add shopping cart. Add truth to readme. Add product and store models. Add lie to readme. 3. Run all commits in the temporary area, one at a time.
  • 127.
    REBASE CONFLICT 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 <stdin>: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.txt CONFLICT (content): Merge conflict in README.txt Failed to merge in the changes. Patch failed at 0001 Add lie to readme. master CONFLICT 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".
  • 128.
    REBASE CONFLICT gregg $git status # Not currently on any branch. # Unmerged paths: # (use "git reset HEAD <file>..." to unstage) # (use "git add/rm <file>..." 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 $ master
  • 129.
    REBASED LOG master Add shoppingcart. Add lie to readme. Add truth to readme. Add product and store models.
  • 130.
    REBASE BELONG TOUS LEVEL 6
  • 133.
  • 134.
    VIEWING THE LOG $git log commit 915f242e262052b11c511dc07bef237fabb7ed85 SHA Author: Gregg <[email protected]> Date: Thu Jun 28 02:10:57 2012 -0700 Update index. commit message hash
  • 135.
    COLORIZING THE LOG $git config --global color.ui true $ git log commit 915f242e262052b11c511dc07bef237fabb7ed85 Author: Gregg <[email protected]> Date: Thu Jun 28 02:10:57 2012 -0700 Update index $ git log --pretty=oneline 08f202691c67abd12eb886b587ac7b26d51005c7 Update index
  • 136.
    LOG FORMAT $ gitlog --pretty=format:"%h %ad- %s [%an]" placeholder replaced with %ad author date %an author name %h SHA hash %s subject %d ref names run “git help log” for more options! LEVEL 7 — HISTORY & CONFIGURATION any string you want & placeholder data
  • 137.
    PATCH $ git log--oneline -p 3ea7f70 I'm telling you, it's 'Octopi'. diff --git a/index.html b/index.html index 021a54e..640d66d 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ <nav> <ul> <li><a href="cat.html">Cats</a></li> <li><a href="octopus.html">Octopuses</a></li> + <li><a href="octopi.html">Octopi</a></li> LEVEL 7 — HISTORY & CONFIGURATION
  • 138.
    STATS $ git log--oneline --stat 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(-) LEVEL 7 — HISTORY & CONFIGURATION
  • 139.
    GRAPH $ git log--oneline --graph * 30b1f8f Merge branch 'bird' into master | | * 8b8f950 Revise silly hipster name for bird aisle. * | 915f242 Add emphasis. |/ * 69728cd Update index descriptions. visual representation of the branch merging into master LEVEL 7 — HISTORY & CONFIGURATION
  • 140.
    DATE RANGES $ gitlog --until=1.minute.ago until $ git log --since=1.day.ago since (days) $ git log --since=1.hour.ago since (hours) $ git log --since=1.month.ago --until=2.weeks.ago since & until (relative) $ git log --since=2000-01-01 --until=2012-12-21 since & until (absolute)
  • 141.
    DIFFS $ git diff diff--git a/index.html b/index.html @@ -8,7 +8,10 @@ <nav> <ul> <li><a href="cat.html">Cats</a></li> <li><a href="octopus.html">Octopuses</a></li> + <li><a href="birds.html">Birds</a></li> + <li><a href="hamsters.html">Hamsters</a></li> </ul> </nav> </body> removed line added lines LEVEL 7 — HISTORY & CONFIGURATION
  • 142.
    UNCOMMITTED CHANGES $ gitdiff HEAD diff --git a/index.html b/index.html index 021a54e..1ceb9d6 100644 diff between last commit @@ -8,7 +8,10 @@ & current state <ul> <li><a href="cat.html">Cats</a></li> ... diff --git a/octopus.html b/octopus.html index 55806be..ce8a2c7 100644 @@ -2,6 +2,6 @@ <html lang="en"> ... includes both staged and unstaged files
  • 143.
    EARLIER COMMITS parent oflatest commit $ git diff HEAD^ $ 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 LEVEL 7 — HISTORY & CONFIGURATION
  • 144.
    EARLIER COMMITS $ gitdiff f5a6sdfsfsdfsdfff9..4sdsdfsdfsdfsdffb063f range of SHAs $ git log --oneline 257256c cat 4fb063f Add index f5a6ff9 Add catalog pages $ git diff 4fb063f..f5a6ff9 $ git diff master bird range of abbreviated SHAs diff between two branches $ git diff --since=1.week.ago --until=1.minute.ago time-based diff
  • 145.
    BLAME $ git blameindex.html --date short ... 96776a42 (Gregg 2012-06-29 9) <ul> 96776a42 (Gregg 2012-06-29 10) <li>Cats</li> 3ea7f709 (Jane 2012-06-30 11) <li>Octopi</li> 96776a42 (Gregg 2012-06-29 12) </ul> ... commit hash author date line # content LEVEL 7 — HISTORY & CONFIGURATION
  • 146.
    EXCLUDING FILES $ gitstatus # Untracked files: # (use "git add <file>..." to include in what will be committed) # # experiments/ we don’t want to commit this... .git/info/exclude experiments/ will exclude this folder from git $ git status # On branch master nothing to commit (working directory clean) the experiment directory is now invisible to git
  • 147.
    EXCLUDE PATTERNS tutorial.mp4 *.mp4 experiments/ logs/*.log LEVEL 7— HISTORY & CONFIGURATION exclude this file exclude all .mp4 files exclude directory exclude .log files in logs directory
  • 148.
    EXCLUDING FROM ALLCOPIES $ # # # # # git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) logs/server.log don’t commit log files, they create conflicts .gitignore logs/*.log add this pattern $ git status no more logs # On branch master nothing to commit (working directory clean)
  • 149.
    REMOVING FILES $ gitrm README.txt $ git status # Changes to be committed: # # deleted: README.txt DELETED from the local filesystem & untracked $ git commit -m “Remove readme” LEVEL 7 — HISTORY & CONFIGURATION
  • 150.
    UNTRACKING FILES $ gitrm --cached development.log what if you’re already tracking log files? $ git status # Changes to be committed: # # deleted: development.log not deleted from the local file system, only from Git LEVEL 7 — HISTORY & CONFIGURATION
  • 151.
    UNTRACKING FILES .gitignore logs/*.log will ignoreall .log files inside the logs directory $ git add .gitignore $ 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 LEVEL 7 — HISTORY & CONFIGURATION
  • 152.
    CONFIG $ git config--global user.name "Gregg Pollack" $ git config --global user.email "[email protected]" remember these? there’s more $ git config --global core.editor emacs $ git config --global merge.tool opendiff LEVEL 7 — HISTORY & CONFIGURATION use emacs for interactive commands OS X o use opendiff for merging conflictsnly
  • 153.
    LOCAL CONFIG $ gitconfig user.email "[email protected]" sets email for current repo $ git config --list user.name=Gregg [email protected] color.ui=true core.editor=mate -w [email protected] same key can be set twice $ git config user.email [email protected] the global config loaded first, then repo config
  • 154.
    ALIASES aliases for logformats $ 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" $ git mylog * 19f735c | | * 7980856 * | 5c9ed90 |/ * ab48a3f Merge branch 'admin' [Jane] Add user admin [Jane] Add dashboard. [Jane] Create quantum cat. [Jane]
  • 155.
    ALIASES git config alias.<name><command> $ git config --global alias.st status git st git status $ git config --global alias.co checkout git co git checkout $ git config --global alias.br branch git br git branch $ git config --global alias.ci commit git ci git commit $ git st # On branch master nothing to commit (working directory clean)