+ All Categories
Transcript
Page 1: Advanced Git Tutorial

Advanced Git Tutorialby Sarah Sharp

Page 2: Advanced Git Tutorial

WARNING:I am a unique snowflake

Page 3: Advanced Git Tutorial

WARNING:This tutorial may make you lazy

Page 4: Advanced Git Tutorial

WARNING:Some Git features are

dangerous!

Page 5: Advanced Git Tutorial

What is Git?

● Distributed● Fast● Flexible

Page 6: Advanced Git Tutorial

Git Basics

● See Everyday Git Tutorial:– http://www.kernel.org/pub/software/scm/git/doc

s/everyday.html

● My git commands:– git add - git commit

– git diff - git log - git show

– git push - git pull

– git fetch - git rebase

Page 7: Advanced Git Tutorial

Naming commits<Commitish>

● (Indirect) hash of repo files, current commit message, and ancestor commits.

● HEAD refers to the last commit● ~ at the end means commit before that

– e.g. HEAD~– ^ is roughly equivalent to ~

● A branch points to a specific commit● see git rev-parse

Page 8: Advanced Git Tutorial

Git Philosophy

Page 9: Advanced Git Tutorial

Git Philosophy

● Commit early, commit often● One commit represents one idea or one

change.– Makes it easy to read patches– Easy to revert unwanted changes later

● Your working directory, index, and local repo are your scratch pads.

Page 10: Advanced Git Tutorial

Infrequent UseFrequent Use

Page 11: Advanced Git Tutorial

The Index, the staging area

Front stage:Changes to be committed

Back stage:Uncommited changes

and unadded files

Page 12: Advanced Git Tutorial

Staging Changes

● git add <file> – adds a file to the Index● git commit – commits added changes to

the local repo● But what about files not added to the

Index?

Page 13: Advanced Git Tutorial

Staging Changes

● git add <file> – adds a file to the Index● git commit – commits added changes to

the local repo● But what about files not added to the

Index?– Answer: they aren't included in the commit.

● Key idea: You can add and commit files separately from other files.

– This makes separating changes into small patches easier.

Page 14: Advanced Git Tutorial

What changed?

workspaceindex

localrepository

git diff git diff --cached

git diff HEAD

● git status● git diff

Page 15: Advanced Git Tutorial

Advanced Staging

Page 16: Advanced Git Tutorial

Advanced Staging

● git add --patch– try the "split" option to split across hunks

● git add -i– Very powerful tool with lots of options

● Key idea: You can add and commit different parts of a file separately.

Page 17: Advanced Git Tutorial

Unstaging changes

● Revert to the last commit– git reset --hard HEAD

● Remove all added changes from the index– git reset --mixed HEAD

● Remove some files added to index– git add -i and choose revert, or– git reset HEAD filename(s)

Page 18: Advanced Git Tutorial

Viewing History

Page 19: Advanced Git Tutorial

Viewing History

● git log● git log <commit A>..<commit B>– shows history after commit A, up to commit B– can omit either commit– e.g. `git log` `git log origin..` `git log ..v2.6.30`

● git log -p– shows log as a series of patches

● git log --pretty=oneline –abbrev-commit

Page 20: Advanced Git Tutorial
Page 21: Advanced Git Tutorial

Viewing old files

● Contents of a file at a particular commit– git show <commitish>:<path to file>

● Contents of a directory– git show <commitish>:<directory>

Page 22: Advanced Git Tutorial

Pointing Fingers:git blame

Page 23: Advanced Git Tutorial

Pointing Fingers

● git blame <file>– show who committed each line

● git blame <commit ID> <file>– show the line history before that commit

Page 24: Advanced Git Tutorial

Branches

Page 25: Advanced Git Tutorial

Branches

● Only one branch can be checked out– trunk ~= master

● show all branches– git branch -a

● switching branches– git checkout name

● creating new branches– git checkout -b name <commit>

Page 26: Advanced Git Tutorial

Advanced Branching

● Merge branches with git merge– creates a "merge commit"

● Rebase current branch against branch B– find a common ancestor commit– apply commits from branch B– apply commits from current branch

● Apply a commit from one branch– git cherry-pick

Page 27: Advanced Git Tutorial

Interacting with other people

Page 28: Advanced Git Tutorial

Interacting with other people

● Creating a patchset, starting at commitA– git format-patch -o directory commitA^

--cc=<cced-email>– use git send-email or `mutt -H <gitpatch>`

● Applying a patch– git am patchfile– can also take a mailbox or maildir or stdin

● Pushing a new branch– git push remote branch

Page 29: Advanced Git Tutorial

Changing History

Page 30: Advanced Git Tutorial

Changing History:DANGER, WILL ROBINSON!

● After a commit, often you will find bugs– could make a new bug fix commit– or you could "amend" the previous commit

● Fix your code● git add <file>– This adds your code to the index

● git commit --amend– This modifies the commit in the local repo– useful to have vim git-commit script installed

Page 31: Advanced Git Tutorial

Changing History:DANGER, WILL ROBINSON!

● A total history rewrite:– git rebase -i <commit ID>

● Can reorder commits● Can edit commits● Can "squash" one commit into another● May have merge conflicts

– edit files, resolve conflicts surrounded by <<<< and >>>>

– git add files, git rebase --continue

Page 32: Advanced Git Tutorial

git rebase -i --dontscrewme

● No such command● git rebase -i the safe way:

– git checkout -b master-rebase– use `git rebase -i` to move one patch– resolve any merge conflicts– squash that patch using `git rebase -i`– git diff master master-rebase– git branch -M master master-old– git branch -M master-rebase master

Page 33: Advanced Git Tutorial

Git Hooks

Page 34: Advanced Git Tutorial

Git Hooks

● Hooks are scripts found in .git/hooks/

● Enable them with chmod a+x <file>

● Triggered by various git commands

– e.g. git commit, git push

– pre-commit, post-update● Examples

– shipped pre-commit hook checks for white space at the end of line, long lines, etc.

– Checking for swear words?

Page 35: Advanced Git Tutorial

Git Hooks

● Example post-update hook on remote repo:

#!/bin/sh

cd /home/sarah/blog

unset GIT_DIR

git-fetch origin

git-reset --hard origin/master

● Whenever I push to the remote repository, this goes into the server's checkout of my blog git repo and updates it unconditionally.

Page 36: Advanced Git Tutorial

Setting up aremote repository

Page 37: Advanced Git Tutorial

Setting up aremote repository

● Server needs git and sshd installed to use git+ssh to push to your repo

● Server needs webDAV installed to allow push to your repo over https

● http://github.com/ will host your repo● Next directions assume you have your

own server with git installed

Page 38: Advanced Git Tutorial

Setting up aremote repository

1. Make local repo, commit stuff, etc.

2. ssh to the server:

GIT_DIR=/path/to/repo git init --shared

3. Next, tell the local repo about the server:

git remote add origin git+ssh://hostname/path/to/repo

4. Push to the server from the local repo:

git push origin master

5. Clean up the local repo so that you can pull from the remote server:

git config branch.master.remote origin

git config branch.master.merge refs/heads/master

Page 39: Advanced Git Tutorial

Resources

● Git work flow diagrams:http://osteele.com/archives/2008/05/my-git-workflow

● The Tangled Working Copy:http://tomayko.com/writings/the-thing-about-git

● http://github.com/

● Kernel module examples at http://lwn.net/Kernel/LDD3/

● vim git-commit script will display commit messages in a more useful manner. Script kept at vim.sourceforge.net.

– sudo aptitude install vim-scripts vim-addon-manager

– vim-addons install git-commit

Page 40: Advanced Git Tutorial

Creative CommonsImage Attributions

● GIT picture: http://flickr.com/photos/29862082@N06/2908889599/

● Snowflake: http://commons.wikimedia.org/wiki/Image:SnowflakesWilsonBentley.jpg

● Danger:http://flickr.com/photos/dawvon/32305882/

● Cat: http://flickr.com/photos/jamilsoni/118499378/

● Remote: http://flickr.com/photos/markkelley/957631507/

● Philosophy: http://flickr.com/photos/paullew/2442045767/

● Branches: http://flickr.com/photos/shapeshift/136184752/

● Interacting with other people: http://www.flickr.com/photos/exlibris/3222440467/

Page 41: Advanced Git Tutorial

Creative CommonsImage Attributions

● Front stage: http://flickr.com/photos/69108241@N00/118040089/

● Back stage: http://flickr.com/photos/piotramigo/2561391320/

● Hooks:http://www.flickr.com/photos/yabanji/3175297773/

● Blame: http://flickr.com/photos/iandesign/1205496024/

● Ballet: http://www.flickr.com/photos/oudeschool/3553416511/

● Papyrus: http://flickr.com/photos/charlestilford/2548991271/

Page 42: Advanced Git Tutorial

Thank you!

● Sarah Sharp● @sarahsharp● http://sarah.thesharps.us


Top Related