A Brief Introduction to Working with Git

Post on 01-Nov-2014

327 views 1 download

Tags:

description

This slide deck is intended for Git beginners and focuses on the underlying concepts, the usage of the command line, especially the commands git reset, git checkout, git revert, git commit, and eventually introduces models for using Git and why git rebase may play an important role in some those models.

Transcript of A Brief Introduction to Working with Git

Business Informatics GroupInstitute of Software Technology and Interactive Systems Vienna University of TechnologyFavoritenstraße 9-11/188-3, 1040 Vienna, Austriaphone: +43 (1) 58801-18804 (secretary), fax: +43 (1) 58801-18896office@big.tuwien.ac.at, www.big.tuwien.ac.at

A Brief Introduction to Working with Git

10.03.2014VUT, Vienna, Austria

Philip Langer

History of Versioning Systems

Based on http://codicesoftware.blogspot.com/2010/11/version-control-timeline.html

local to central …

central to distributed …

1972

sccsdiscourage branching … everything is a branch …

3

Git: A Distributed Versioning System

There is no single repository server Every peer is a full repository instance

Single-peer versioning possible Including the complete history Committing changes is independent of peers Allows disconnected operation

Collaboration is done by pushing/pulling commits Comparable to peer-to-peer networks The role of peers is purely organizational

No technical difference among peers Single common central server possible

One peer happens to be the central repo But several other architectures are possible too

Gate-keeper architecture Teams of teams

commit

push & pull

push & pull

push & pull

<Bob>

<Alice>

<Sally>

<Server>

<Harry>

push & pull

4

The Four Layers & Transferring Changes Among Them

Every repository consists of a Workspace Index (“staging area”) Local repository Remote repositories …

Transferring changes git add

workspace to index git commit

index to local branch git push

local branch to remote branch …

Changes are organized in commits Each commit has a parent The history is basically a DAG

5

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

6

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

7

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

8

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard HEAD~

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

9

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard HEAD~

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

!

10

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

11

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

Reset index after wrong

add

12

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed] HEAD~

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

13

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed] HEAD~

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

Undo last commit, however

it‘s still there

14

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

Does nothing actualy

(HEAD is default)

15

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft HEAD~

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

16

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is HEAD? A reference pointing to the last commit (of the current branch) Thus, it will be the parent of the next commit Relative commit expressions e.g. with HEAD~2

git reset [--soft | --mixed | --hard] [commit | reference to commit] Resets HEAD in history, index, and/or workspace to [commit] git reset --hard

History, index, and workspace git reset [--mixed]

History and index git reset --soft HEAD~

Only history …

default:HEAD

default:--mixed

History

Index

Workspace

Head

Undo last commit, leaving index untouched

17

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is checkout? Get a version from the history And overwrite workspace (also for creating and changing branches … later)

git checkout -- <file/s> Get version of <file/s> from HEAD Overwrite version in workspace

History

Index

Workspace

Head

Undo last commit, leaving index untouched

18

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is checkout? Get a version from the history And overwrite workspace (also for creating and changing branches … later)

git checkout -- <file/s> Get version of <file/s> from HEAD Overwrite version in workspace

History

Index

Workspace

Head

Undo local changes to workspace.

!

19

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is revert? Does not modify history (good if you pushed already) Takes a commit from history Creates reverse patch Commits reverse patch (new commit)

git revert HEAD~1

History

Index

Workspace

Head

Must be clean!

20

Before talking about branches…Demystifying “git reset”, “git checkout”, and “git revert”

What is revert? Does not modify history (good if you pushed already) Takes a commit from history Creates reverse patch Commits reverse patch (new commit)

git revert HEAD~1

History

Index

Workspace

Head

Undo commits after you‘ve already pushed them.

Must be clean!

21

Branching

After all every change (local or remote) is a fork leading to a new branch So make branches a first-class concept No logical difference between local and remote branches Every merge is a branch merge

<Bob>

<Server>

<Alice>

22

Branching

Each commit has a parent A branch is nothing more than a pointer to a commit

CurrentBranch

23

Branching

Each commit has a parent ( DAG) A branch is nothing more than a pointer to a commit

24

Branching

Local branches may link to “tracking branches”

CurrentBranch

25

Branching

Branches can be linked in ./git/config(links are also created automatically in certain cases;or may be linked explicitly using git checkout --track)

[remote "origin"]fetch = +refs/heads/*:refs/remotes/origin/*url = https://code.google.com/a/eclipselabs.org/p/moliz/

[branch "master"]remote = originmerge = refs/heads/master

[branch "issue_18_alf"]remote = originmerge = refs/heads/issue_18_alf

26

Merging Branches

git checkout mastergit merge iss53

27

Merging Branches

git checkout mastergit merge iss53

Note that git pull is a git fetch & git merge

28

Branching Models of Git

Several different “models” All entirely organizational

The svn-like model: Only one branch Only one central repo git pull (origin master) Apply changes git commit (master) git push (origin master) Good for e.g. papers

The isolated-development model Own branch for current dev Own branch for releases Own branch for each feature

29

Keeping the History of Topic Branches Clean: Rebase

git checkout experiment… // apply changesgit commit -agit checkout mastergit merge experiment

30

Keeping the History of Topic Branches Clean: Rebase

git checkout experiment… // apply changesgit commit -agit checkout mastergit merge experiment

31

Keeping the History of Topic Branches Clean: Rebase

git checkout experiment… // apply changesgit commit -agit rebase master

Rebase is rewriting history! Never rebase pushed history!

32

Keeping the History of Topic Branches Clean: Rebase

Improving previous commits… // apply changesgit commit -a… // apply changesgit commit -agit rebase -i HEAD~2

# Rebase 710f0f8..a5f4a0d onto 710f0f8## Commands:# p, pick = use commit# e, edit = use commit, but stop for amending# s, squash = use commit, but meld into previous commit