The document provides an overview of Git as a distributed revision control system, detailing its features such as offline usage and efficient branching. It also discusses modern code review practices and tools like Gerrit to facilitate collaboration and improve code quality. Additionally, it covers key Git concepts like commits, branches, merging, and best practices for pushing changes to repositories.
In this document
Powered by AI
Introduction to Git as a distributed revision control system and Eclipse's plans for integrating Git with EGit and JGit.
Overview of code review importance, benefits like mentorship, bug detection, and maintaining code quality.
Illustration of typical Git developer workflow from clone, fetch, and checkout to making and committing changes.Explanation of branches, managing branch pointers, history tracking with commits, and HEAD pointers.How to clone and fetch remote repositories, understanding remote tracking branches.Methods to merge or rebase branches, importance of keeping history linear.
Integration of Gerrit into Git workflow, handling pushes, patch sets, and conducting reviews.Guidelines for Git collaboration including creating feature branches, writing commit messages, and pushing changes.
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
3.
Git at EclipseEclipse defined a roadmap to move to Git CVS 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.
4.
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
5.
Code Review –Benefits Four eyes catch more bugs Catch bugs early to save hours of debugging Mentoring of new developers / contributors Learn from mistakes without breaking stuff Establish trust relationships Prepare for more delegation Good alternative to pair programming asynchronous and across locations Coding standards Keep overall readability & code quality high Guido van Rossum [1] [1] http://code.google.com/p/rietveld/downloads/detail?name =Mondrian2006.pdf
Making Changes Structurein 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
12.
Making Changes Checkout: populate working tree with the commit you want to start working from most of the time you will checkout a branch checkout the commit pointed to by the branch (aka: tip of the branch) per file checkout means revert ! Calculator .git <working tree> git checkout master
13.
Making Changes Juststart doing your changes modify, add, delete files Tell Git which changes you intend to commit git add EGit helps by auto-detecting what you changed
14.
Commiting Changes gitcommit 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
Branches Branch isa named pointer to a commit Commit command moves the pointer A B C master A B C master D commit
17.
Branches The (branch)pointer can also be moved “manually” to any commit git reset A B C master D A B C master D reset B
18.
Branches What happenson 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 C master D E commit
19.
Branches Usually thereare many branches in a Git repository Branches can also be deleted A B C origin/master D E feature 1 F bugfix 15 G feature 2
20.
HEAD HEAD –pointer to a branch Means: “Current Branch” – the branch which you have checked out A B C D E feature 1 F bugfix 15 HEAD origin/master
Clone Remote RepositoryGit is a distributed versioning system git clone <remote-repo> 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
23.
Clone Remote RepositoryRemote tracking branches, full names: remotes/origin/master remotes/origin/feature-1 A B C master D E F HEAD origin/feature-1 origin/master Local clone
24.
Remote Tracking BranchesJust like any other branch, but read-only possible: git checkout origin/feature1 However, HEAD gets detached! A B C master D E F HEAD origin/feature-1 origin/master
25.
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 HEAD origin/feature-1 origin/master Local clone G origin/feature-1 fetch
26.
Fetch Always safeto do Updates only remote tracking branches Does never change local branches
Merge git mergefeature-1 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
29.
Merge Easy Case- Fast Forward git merge feature-1 no new commit, just move the pointer A B E HEAD feature-1 A B E HEAD feature-1 1.0 1.0 merge feature-1
30.
Git Concepts –Cherry Pick git cherry-pick F applies changes introduced by F, means delta-2 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
31.
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
Push git pushorigin HEAD:master From local to remote repository 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
34.
Push Which commitsget pushed? ALL commits from the local branch not available in the remote branch A B origin/master C Local repo feature-1 HEAD D A B C master D Remote “origin” repo push
35.
Push Remote branchhas changed 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” repo push
36.
Git Concepts -Push Possibility One 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
37.
Push Possibility Twofetch, rebase, push A B origin/master Local repo feature-1 HEAD D C ’ A B D master Remote “origin” repo C ’ push
38.
Push Which graphdo you like more ? A B D master Remote “origin” repo C E A B D master C ’ Remote “origin” repo
Push Push toGerrit is the same like push to Git with one Gerrit speciality: refs/for in the target branch name Compare: Push to Git: git push origin HEAD:master Push to Gerrit: git push origin HEAD: refs/for /master
41.
Push It seemslike every push to Gerrit goes to the same branch refs/for/master However, Gerrit tricks your git client: it creates a new branch for the commit(s) you push and creates a new open Gerrit change containing the pushed commit
42.
Push git pushorigin 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 } …
43.
Push What iffeature branch has 2 commits ? Remember Git semantics for Push? 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 HEAD D 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
44.
Changes Change consistsof Change ID (important!) metadata (owner, project, etc..) one or more patch-sets comments votes Patch Set represents a Git Commit
45.
New Change vsNew 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
46.
New Change vsNew 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 we need to also move a number of other related class, which we aren't quite ready to do. Change-Id: I1bd54ea0500337799a8e792874c272eb14d555f7 Signed-off-by: Shawn O. Pearce <[email protected]>
47.
Push New PatchsetNo dependencies between Patchsets can ’t push a successor commit as the next patchset commit D can ’t be Patch Set 2 of change 1234 A B origin/master C Local repo feature-1 HEAD D Change 1234, Patch Set 1
48.
Push New PatchsetIf you pushed C and need to replace it by a new commit as a new patchset use git commit –amend 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 HEAD D Change 1234, Patch Set 1
49.
Push New PatchSet A Common Mistake author of the Patch Set 1 is not available and somebody else needs to continue and provide Patch Set 2 use git pull to get the Patch Set 1 into a local branch Fix issues in commit Push (including the same Change-Id) Gerrit rejects!
50.
Push New PatchsetA Common Mistake git pull origin refs/changes/66/366/1 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 HEAD master
51.
Push New PatchSet The right way: fetch (don ’t pull) create a new branch based on the fetched patchset 1 fix the issue commit –amend push
52.
Push New PatchsetThe right way: commit D is not successor of C 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
53.
Review and VoteShow in Gerrit Web UI Voting the lowest mark means Veto Highest marks in all voting categories needed for change to be merged
54.
Fetch Open ChangeLocally 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 show in Web UI
55.
Best Practices Createlocal branch for each feature or bugfix you work on branch name tells you what your intention was less likely you will mix two features in the same branch you can have many feature branches at a time and switch between them
56.
Best Practices Pushfinished features only who wants to review non finished feature ? who wants non-finished features in history ? Push complete feature as one commit even if you created many commits squash them into one before push otherwise you create one change in Gerrit per each commit ! use multiple changes if feature can be split into smaller logical units and use last change to switch on the new feature
57.
Best Practices Writegood commit message First line is summary Empty line between paragraphs Explain WHY you did the change not WHAT you did (this is visible from the commit) Prefer many small changes to one big still each small change must be logically complete