effective git with eclipse

57
Effective Git http://eclipse.org/egit http://code.google.com/p/gerrit Matthias Sohn (SAP) + = Stefan Lay (SAP) Chris Aniszczyk(Redha t) Shawn Pearce (Google)

Upload: chris-aniszczyk

Post on 07-May-2015

6.764 views

Category:

Documents


3 download

DESCRIPTION

An introduction to Git and Gerrit and how the eclipse.org ecosystem plans to use Gerrit for code reviews.

TRANSCRIPT

Page 1: Effective Git with Eclipse

Effective Githttp://eclipse.org/egit

http://code.google.com/p/gerrit

Matthias Sohn(SAP)

+ =

Stefan Lay(SAP)

Chris Aniszczyk(Redhat)

Shawn Pearce(Google)

Page 2: Effective Git with Eclipse

Git… a distributed revision control system built by the Linux project to facilitate code review

Distributed means no central repository• No central authority!• Easy offline usage• Easy to branch a project• Protected against manipulation by cryptographic hashes

Really good at merging• Coordination only needed "after the fact”• Easier to rejoin (or refresh) branches

Structured around commits (i.e. patches)• Tools for identifying problem commits (git bisect)• Tools for restructuring branches w/ specific commits

Page 3: Effective Git with Eclipse

Git at Eclipse

Eclipse defined a roadmap to move to GitCVS has been deprecated

EGit is an Eclipse Team provider for Git• http://www.eclipse.org/egit/

JGit is a lightweight Java library implementing Git • http://www.eclipse.org/jgit/

The goal is to build an Eclipse community around Git.

EGit/JGit are still beta and we want to establish a feedback loop to improve the tooling.

Page 4: Effective Git with Eclipse

Modern Code Review – What is it ?

When one developer writes code, another developer is asked to review that code

A careful line-by-line critique

Happens in a non-threatening context

Goal is cooperation, not fault-finding

Integral part of coding process

Otherwise this will happen: Debugging someone else's broken code – Involuntary code review: Not so good; emotions may flare

Guido van Rossum [1]

[1] http://code.google.com/p/rietveld/downloads/detail?name=Mondrian2006.pdf

Page 5: Effective Git with Eclipse

Code Review – Benefits

Four eyes catch more bugso Catch bugs early to save hours of debugging

Mentoring of new developers / contributorso Learn from mistakes without breaking stuff

Establish trust relationships o Prepare for more delegation

Good alternative to pair programmingo asynchronous and across locations

Coding standardso Keep overall readability & code quality high

Guido van Rossum [1]

[1] http://code.google.com/p/rietveld/downloads/detail?name=Mondrian2006.pdf

Page 6: Effective Git with Eclipse

Developer PC

Gerrit

git gitgitgit

Developer PC

gitgit

Hudson

- clone repository - fetch / push changes

- verify proposed changes- continuous integration builds

Page 7: Effective Git with Eclipse

Developer PC

gitgit

Gerrit

git gitgitgit

push improved change 10

Developer PC

gitgit

fetch change 23 to try it

master

change 12

change 10

change 23

submit accepted change 12

fetch master to get updates

Page 8: Effective Git with Eclipse

Git Configuration

Page 9: Effective Git with Eclipse

Git Concepts – config files

• git config –l• git config –e• --system• --global

System<gitinst>/etc/gitconfig

Global~/.gitconfig

Repository Specific.git/config

Page 10: Effective Git with Eclipse

Basic Concepts

Page 11: Effective Git with Eclipse

Making Changes

• Structure in the file system• One working tree per repo•.git folder is the Git repo• Files/folders under the parent of .git

are the working tree

Page 12: Effective Git with Eclipse

Making Changes

• Checkout: populate working tree with the commit you want to start working fromo most of the time you will checkout a brancho checkout the commit pointed to by the branch

(aka: tip of the branch)o per file checkout means revert !

Calculator

.git

<working tree>

git checkout master

Page 13: Effective Git with Eclipse

Making Changes

• Just start doing your changeso modify, add, delete files

• Tell Git which changes you intend to commit

o git add

o EGit helps by auto-detecting what you changed

Page 14: Effective Git with Eclipse

Commiting Changes

git commit

•Provide a commit message• First line is header• separated by a blank line follows the body• last paragraph is for meta data in key: value format

•commit represents a version of the complete repository•commits are identified by a globally unique ID (SHA1)•If two Git repos both contain a commit with the same ID then the content in these two commits is identical

Page 15: Effective Git with Eclipse

Commits

• Commit historyo B is successor of Ao C is successor of B

A

B

C

Page 16: Effective Git with Eclipse

Branches

• Branch is a named pointer to a commit• Commit command moves the pointer

A

B

Cmaster

A

B

C

master D

commit

Page 17: Effective Git with Eclipse

Branches

• The (branch) pointer can also be moved “manually” to any commit

o git reset

A

B

C

master D

A

B

C

master

Dreset B

Page 18: Effective Git with Eclipse

Branches

• What happens on next git commit ?• C and D continue to exist but they are not in

the history or the master branch

A

B

C

master

D

A

B

Cmaster

D

E

commit

Page 19: Effective Git with Eclipse

Branches

• Usually there are many branches in a Git repository

• Branches can also be deleted

A

B

Corigin/master

D

E

feature 1Fbugfix 15

G feature 2

Page 20: Effective Git with Eclipse

HEAD

• HEAD – pointer to a branch• Means:

“Current Branch” – the branch which you have checked out

A

B

C

D

E

feature 1Fbugfix 15 HEAD

origin/master

Page 21: Effective Git with Eclipse

Cloning & Fetching

Page 22: Effective Git with Eclipse

Clone Remote Repository

• Git is a distributed versioning systemo git clone <remote-repo>o cloned repo gets local name “origin” (by

default)

A

B

C

master D

E

F

HEAD

feature-1

A

B

C

master D

E

F

HEAD

origin/feature-1

origin/master

Remote “origin” Local clone

clone

Page 23: Effective Git with Eclipse

Clone Remote Repository

• Remote tracking branches, full names: o remotes/origin/mastero remotes/origin/feature-1

A

B

C

master D

E

F

HEAD

origin/feature-1

origin/master

Local clone

Page 24: Effective Git with Eclipse

Remote Tracking Branches

• Just like any other branch, but read-onlyo possible: git checkout origin/feature1o However, HEAD gets detached!

A

B

C

master D

E

F

HEAD

origin/feature-1

origin/master

Page 25: Effective Git with Eclipse

Fetch• git fetch will update all remote tracking

branches to reflect the changes done in the “origin” repo

A

B

C

master D

E

F

HEAD feature-1

Remote “origin”

G

feature-1

A

B

C

master D

E

F

HEADorigin/feature-1

origin/master

Local clone

G

origin/feature-1

fetch

Page 26: Effective Git with Eclipse

Fetch

• Always safe to do• Updates only remote tracking branches• Does never change local branches

Page 27: Effective Git with Eclipse

Merge & Rebase

Page 28: Effective Git with Eclipse

Merge

• git merge feature-1o will replay all changes done in feature-1

since it diverged from 1.0 (E and F)

A

B

C

D

E

F

HEAD

feature-1

A

B

C

1.0

D

E

F

HEAD

feature-1

G

1

2

1 2

1.0

merge feature-1

Page 29: Effective Git with Eclipse

Merge

• Easy Case - Fast Forwardo git merge feature-1o no new commit, just move the pointer

A

B

EHEAD

feature-1

A

B

EHEAD feature-11.0

1.0

merge feature-1

Page 30: Effective Git with Eclipse

Git Concepts – Cherry Pick• git cherry-pick F

o applies changes introduced by F, means delta-2o no merge relation

A

B

C

1.0 D

E

F

HEAD

feature-1

1

2

A

B

C

1.0

D

E

F

HEAD

feature-1

G

2

cherry-pick F

Page 31: Effective Git with Eclipse

Git Concepts - Rebase

• Alternative to Merge - Keeping history linear• git rebase 1.0• after rebase fast-forward possible!

A

B

C

1.0 D

E

F

HEAD

feature-1

A

B

C

1.0 D

E’

F’

HEAD

feature-1

1

2

1

2

rebase 1.0

Page 32: Effective Git with Eclipse

Pushing

Page 33: Effective Git with Eclipse

Push

• git push origin HEAD:master

• From local to remote repositoryo more precisely: from a local to a remote branch

A

B origin/master

C

Local repo

feature-1 HEAD

A

B

C master

Remote “origin” repo

push

Page 34: Effective Git with Eclipse

Push

• Which commits get pushed?

• ALL commits from the local branch not available in the remote branch

A

B origin/master

C

Local repo

feature-1 HEADD

A

B

C

masterD

Remote “origin” repo

push

Page 35: Effective Git with Eclipse

Push

• Remote branch has changedo git push will fail because fast forward is not

possible

A

B origin/master

C

Local repo

feature-1 HEAD

A

B

D master

Remote “origin” repopush

Page 36: Effective Git with Eclipse

Git Concepts - Push

• Possibility Oneo pull (fetch + merge), push

A

B origin/master

C

Local repo

feature-1 HEAD

A

B

D

master

Remote “origin” repo

D

E

C

E

push

Page 37: Effective Git with Eclipse

Push

• Possibility Twoo fetch, rebase, push

A

B origin/master

Local repo

feature-1 HEAD

D

C’

A

B

D

master

Remote “origin” repo

C’

push

Page 38: Effective Git with Eclipse

Push

• Which graph do you like more ?

A

B

D

master

Remote “origin” repo

C

E

A

B

D

masterC’

Remote “origin” repo

Page 39: Effective Git with Eclipse

Gerrit Concepts

Page 40: Effective Git with Eclipse

Push• Push to Gerrit is the same like push to Git

o with one Gerrit speciality: refs/for in the target branch name

• Compare:

o Push to Git:git push origin HEAD:master

o Push to Gerrit:git push origin HEAD:refs/for/master

Page 41: Effective Git with Eclipse

Push

• It seems like every push to Gerrit goes to the same branch refs/for/master

• However, Gerrit tricks your git client:

o it creates a new branch for the commit(s) you push

o and creates a new open Gerrit change containing the pushed commit

Page 42: Effective Git with Eclipse

Push

git push origin HEAD:refs/for/master

A

B origin/master

C

Local repo

feature-1 HEAD

A

B

C

master

Gerrit hosted “origin” repo

refs/changes/63/363/1

Gerrit DB - Open Changes:…{Change-ID = 1234,Patch-Set-1 = refs/changes/63/363/1}…

Page 43: Effective Git with Eclipse

Push• What if feature branch has 2 commits ?

• Remember Git semantics for Push?o ALL commits from the local branch not

available in the remote branch 2 changes in Gerrit !

A

B origin/master

C

Local repo

feature-1 HEADD

A

B

C

master

Gerrit hosted “origin” repo

refs/changes/63/363/1, Change 1234

D refs/changes/64/364/1, Change 1235

depends on

Page 44: Effective Git with Eclipse

Changes

• Change consists ofo Change ID (important!)o metadata (owner, project, etc..)o one or more patch-setso commentso votes

• Patch Set represents a Git Commit

Page 45: Effective Git with Eclipse

New Change vs New Patch Set

• How does Gerrit know whether to create a new Change or a new Patch Set for an existing change?

• It looks at the Commit Message and searches for String “Change-Id: <ISHA1>” in the last paragraph of the commit message

• If found it will create a new patchset for this changes, otherwise it will create a new change

Page 46: Effective Git with Eclipse

New Change vs New Patch Set

• Example Commit Message with Change-Id:

Make lib.Repository abstract and lib.FileRepository its implementation

To support other storage models other than just the local filesystem,…will rename it into storage.file.FileRepository, but to do that weneed to also move a number of other related class, which we aren'tquite ready to do.

Change-Id: I1bd54ea0500337799a8e792874c272eb14d555f7Signed-off-by: Shawn O. Pearce <[email protected]>

Page 47: Effective Git with Eclipse

Push New Patchset

• No dependencies between Patchsetso can’t push a successor commit as the next

patchseto commit D can’t be Patch Set 2 of change 1234

A

B origin/master

C

Local repo

feature-1 HEADD

Change 1234, Patch Set 1

Page 48: Effective Git with Eclipse

Push New Patchset

• If you pushed C and need to replace it by a new commit as a new patchset use

o git commit –amendo with –amend option the new commit replaces

the current instead of becoming successor

A

B origin/master

C

Local repo

feature-1 HEAD

Change 1234, Patch Set 1

A

B origin/master

C

Local repo

feature-1 HEADD

Change 1234, Patch Set 1

Page 49: Effective Git with Eclipse

Push New Patch Set

• A Common Mistakeo author of the Patch Set 1 is not available and

somebody else needs to continue and provide Patch Set 2

o use git pull to get the Patch Set 1 into a local branch

o Fix issues in commito Push (including the same Change-Id)o Gerrit rejects!

Page 50: Effective Git with Eclipse

Push New Patchset

• A Common Mistake

o git pull origin refs/changes/66/366/1

o D is successor of C and cannot be Patch Set 2

A

B

Local repo

HEAD

A

B

C

Local repo

Change 1234, Patchset 1

master

D HEADmaster

Page 51: Effective Git with Eclipse

Push New Patch Set

• The right way:

o fetch (don’t pull)

o create a new branch based on the fetched patchset 1

o fix the issue

o commit –amendo push

Page 52: Effective Git with Eclipse

Push New Patchset

• The right way:o commit D is not successor of Co D can become patchset 2

A

B

C

Local repo

Change 1234, Patch Set 1

D HEAD

feature-1

A

B

C

Local repo

Change 1234, Patch Set 1

HEAD

feature-1

Page 53: Effective Git with Eclipse

Review and Vote

• Show in Gerrit Web UI• Voting the lowest mark means Veto• Highest marks in all voting categories

needed for change to be merged

Page 54: Effective Git with Eclipse

Fetch Open Change Locally

• Don’t forget that every patchset is a commit• Use git fetch to fetch it locally if you

want to play with it• Hudson Gerrit plugin does just that !• Gerrit creates fetch command for you

o show in Web UI

Page 55: Effective Git with Eclipse

Best Practices

• Create local branch for each feature or bugfix you work on

o branch name tells you what your intention was

o less likely you will mix two features in the same branch

o you can have many feature branches at a timeo and switch between them

Page 56: Effective Git with Eclipse

Best Practices

• Push finished features onlyo who wants to review non finished feature ?o who wants non-finished features in history ?

• Push complete feature as one commito even if you created many commits squash them

into one before pusho otherwise you create one change in Gerrit per

each commit !o use multiple changes if feature can be split into

smaller logical units and use last change to switch on the new feature

Page 57: Effective Git with Eclipse

Best Practices

• Write good commit messageo First line is summaryo Empty line between paragraphso Explain WHY you did the change not WHAT you

did (this is visible from the commit)

• Prefer many small changes to one bigo still each small change must be logically

complete