a brief introduction to working with git

32
Business Informatics Group Institute of Software Technology and Interactive Systems Vienna University of Technology Favoritenstraße 9-11/188-3, 1040 Vienna, Austria phone: +43 (1) 58801-18804 (secretary), fax: +43 (1) 58801-18896 [email protected], www.big.tuwien.ac.at A Brief Introduction to Working with Git 10.03.2014 VUT, Vienna, Austria Philip Langer

Upload: philip-langer

Post on 01-Nov-2014

325 views

Category:

Technology


1 download

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

Page 1: 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) [email protected], www.big.tuwien.ac.at

A Brief Introduction to Working with Git

10.03.2014VUT, Vienna, Austria

Philip Langer

Page 2: A Brief Introduction to Working with Git

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 …

Page 3: A Brief Introduction to Working with Git

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

Page 4: A Brief Introduction to Working with Git

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

Page 5: A Brief Introduction to Working with Git

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

Page 6: A Brief Introduction to Working with Git

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

Page 7: A Brief Introduction to Working with Git

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

Page 8: A Brief Introduction to Working with Git

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

Page 9: A Brief Introduction to Working with Git

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

!

Page 10: A Brief Introduction to Working with Git

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

Page 11: A Brief Introduction to Working with Git

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

Page 12: A Brief Introduction to Working with Git

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

Page 13: A Brief Introduction to Working with Git

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

Page 14: A Brief Introduction to Working with Git

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)

Page 15: A Brief Introduction to Working with Git

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

Page 16: A Brief Introduction to Working with Git

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

Page 17: A Brief Introduction to Working with Git

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

Page 18: A Brief Introduction to Working with Git

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.

!

Page 19: A Brief Introduction to Working with Git

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!

Page 20: A Brief Introduction to Working with Git

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!

Page 21: A Brief Introduction to Working with Git

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>

Page 22: A Brief Introduction to Working with Git

22

Branching

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

CurrentBranch

Page 23: A Brief Introduction to Working with Git

23

Branching

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

Page 24: A Brief Introduction to Working with Git

24

Branching

Local branches may link to “tracking branches”

CurrentBranch

Page 25: A Brief Introduction to Working with Git

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

Page 26: A Brief Introduction to Working with Git

26

Merging Branches

git checkout mastergit merge iss53

Page 27: A Brief Introduction to Working with Git

27

Merging Branches

git checkout mastergit merge iss53

Note that git pull is a git fetch & git merge

Page 28: A Brief Introduction to Working with Git

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

Page 29: A Brief Introduction to Working with Git

29

Keeping the History of Topic Branches Clean: Rebase

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

Page 30: A Brief Introduction to Working with Git

30

Keeping the History of Topic Branches Clean: Rebase

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

Page 31: A Brief Introduction to Working with Git

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!

Page 32: A Brief Introduction to Working with Git

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