This document discusses Git tips and best practices, including:
- Git is a distributed version control system designed for speed, integrity and distributed workflows. It stores snapshots of project files rather than file differences.
- Merging incorporates changes from one branch into another but leaves an extra merge commit, while rebasing replays changes to a new base and cleans up history.
- A successful Git branching model uses main branches like master and develop, and supporting branches like features, releases and hotfixes to integrate work.
2. Agenda
● Git common principles and design goals
● Merging vs. Rebasing
● How to rewrite history?
● A successful Git branching model
3. What is Git?
● Git is a distributed revision control and source code
management (SCM) system with an emphasis on
speed, data integrity, and support for distributed, non-
linear workflows.
● Git was initially designed and developed by Linus
Torvalds for Linux kernel development in 2005, and has
since become the most widely adopted version control
system for software development.
4. Git design goals
● Speed
● Simple design
● Strong support for thousands of parallel branches
● Fully distributed
o full local repository
o offline commits
o full size repository
● Able to handle large projects like Linux kernel effectively
● Ensure integrity
5. Git drawbacks
● Big committed files will be in every clone of
repository
● No partial checkout
● No lock
● No support of empty directories
6. Git philosophy
● Commit early, commit often
● One commit represents one idea or one
change
o Make it easy to read patches
o Easy to revert unwanted changes later
● Your working directory, index and local
repository are your scratch pads
9. Snapshots, Not Differences
The major difference between Git and any
other VCS (Subversion and friends included) is
the way Git thinks about its data.
21. Merging vs. Rebasing
git rebase and git merge - both of these
commands are designed to solve the same
problem - integrate changes from one branch
into another branch — they just do it in very
different ways.
22. A forked commit history
To incorporate the new commits into your feature branch,
you have two options: merging or rebasing.
24. Pros
● Simple to use and understand
● Merging is a non-destructive operation
● The existing branches are not changed in any way
Cons
● The feature branch will have an extraneous merge
commit every time you need to incorporate changes
● Visual charts of repository can have non-informative
branch lines
Git merge pros and cons
26. Pros
● Much cleaned project history
● Eliminates the unnecessary merge commits required by git merge
● A perfectly linear project history
Cons
● Re-writing project history can be potentially catastrophic for your
collaboration workflow
● Rebasing loses the context provided by a merge commit - you can’t
see when upstream changes were incorporated into the feature
Git rebase pros and cons
27. Git rebase golden rule
Never use git rebase on public branches. Only rebase
local branches
28. When you rebase pushed branch, you’re
abandoning existing commits and creating
new ones that are similar but different
30. Pros
● Eliminating insignificant commits like this makes
your feature’s history much easier to understand.
This is something that git merge simply cannot do
Interactive rebase pros, no cons :)
36. Git pull --rebase
By default, the git pull command performs a
merge, but you can force it to integrate the
remote branch with a rebase by passing it the --
rebase option.
$ git config branch.autosetuprebase always
38. Git revert
Reverting undoes a commit by creating a new
commit. This is a safe way to undo changes, as
it has no chance of re-writing the commit
history.
43. git checkout
● checking out branches
● checking out commits - makes the entire
working directory match that commit
● checking out files - lets you see an old
version of that particular file, leaving the rest
of your working directory untouched
46. Git cherry-pick
Applies the changes introduced by some
existing commits to specific branch
$ git checkout feature-branch
$ git cherry-pick <commit hash>
47. Stashing
Records the current state of the working
directory and the index, and cleans up the
working directory
$ git stash
51. The main branches
● master
o contains production ready code
● develop
o an integration branch
o contains the latest changes
o used for nightly builds
o getting a production release
when merging with master
53. Feature branches (topic branches)
● May branch off from:
o develop
● May merge back into:
o develop
● Branching name convention:
o anything except master, develop,
release-* or hotfix-*
54. Creating a feature branch
$ git checkout -b myfeature develop
Switched to a new branch “myfeature”
Incorporating a finished feature on develop
$ git checkout develop
Switched to branch 'develop'
$ git merge myfeature
Updating ea1b82a..05e9557 (Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
55. Release branches
● May branch off from:
o develop
● Must merge back into:
o develop and master
● Branch naming convention:
o release-*
● Used for preparation of a new production release
● Allow minor bug-fixes
56. Creating a release branch
$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
57. Finishing a release branch
$ git checkout master
Switched to branch 'master'
$ git merge release-1.2
Merge made by recursive. (Summary of changes)
$ git tag -a 1.2
$ git checkout develop
Switched to branch 'develop'
$ git merge release-1.2
Merge made by recursive. (Summary of changes)
$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).
58. Hotfix branches
● May branch off from:
o master
● Must merge back into:
o develop and master
● Branch naming convention:
o hotfix-*
59. Creating a hotfix branch
$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem 5
files changed, 32 insertions(+), 17 deletions(-)
60. Finishing a hotfix branch
$ git checkout master
Switched to branch 'master'
$ git merge hotfix-1.2.1
Merge made by recursive. (Summary of changes)
$ git tag -a 1.2.1
$ git checkout develop
Switched to branch 'develop'
$ git merge hotfix-1.2.1
Merge made by recursive. (Summary of changes)
$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).
61. Links and Literature
● Pro Git
● A successful Git branching model
● https://www.atlassian.com/git/tutorials/
● https://help.github.com/