Branch Management
The team’s methodology is mostly inspired by git-flow, based on separating work by branch types: feature/bug/chore (user story types) and release type.
Formatting
-
Use
lowercaseandkebab-casefor branch names.feature/list_job_positions Bug/userResetPasswordfeature/list-job-positions bug/user-reset-password -
Use the forward slash
/to separate the branch type from the branch title.feature-list-job-positions bug_user-reset-passwordfeature/list-job-positions bug/user-reset-password
Naming
-
Find a balance between conciseness and descriptiveness for branch titles.
feature/as-a-user-i-can-logout bug/as-an-admin-when-i-select-a-menu-item-i-see-a-highlightfeature/user-logout bug/admin-menu-item-highlightThis helps developers distinguish each branch easily.
-
Prefix the branch title with the backlog item ID when using project management tools such as Shortcut or JIRA.
sc-6862/ui/feature/list-job-positions 939/feature/improve-multiple-dependent-branches-management-guidelinefeature/sc-6862-list-job-positions feature/939-improve-multiple-dependent-branches-management-guidelineThe aforementioned tools require it for their Git integration to function. While other tools, such as Pivotal Tracker, rely on the commit message content to include the backlog item ID. When having both an areas-of-implementation prefix and a backlog item ID prefix in the branch title, the ID prefix must be added before the areas-of-implementation one. Having a standard branch prefix convention will be quite beneficial, especially when DevOps engineers want to set up some triggers for the CI pipeline using the branch title format.
Branch Types
Here is a diagram that represents the standard Gitflow for all branch types, which developers ought to follow:
Default Branches
- A repository must have two default branches:
mainanddevelop:- The
mainbranch is the version in production. - The
developbranch is the version currently in the staging environment.
- The
-
Both branches must be created when setting up a new code repository:
git init git checkout -b main git checkout -b develop -
Committing directly to either the
mainordevelopbranches is prohibited. All code must be committed via pull requests.
Working Branches
-
All feature, bug, and chore branches must be branched from
develop. Unless in specific cases, not branching more than one node away fromdevelopavoids complex conflicts and rebasing, which can take hours or days to solve. -
Once merged, feature, bug, and chore branches must be deleted to keep a sane git tree with only the default and active branches.
Release Branches
Release branches are created to merge code to the main branch. Working branches must not be merged directly into the main branch.
-
Release branches must be checked out from the
developbranch. -
The name for release branches must contain the corresponding semantic version number.
release/1.0 release/v1.0release/1.0.0
Hotfix Branches
Hotfix branches are created to fix bugs in the version currently in the production environment.
-
Hotfix branches must be checked out locally from the
mainbranch (or the current release branch). -
Correctly applying a hotfix requires to:
- Open a first pull request to merge the code from the hotfix branch to the
mainbranch (or the current release branch). - Open a second pull request to merge the code from the hotfix branch to the
developbranch.
- Open a first pull request to merge the code from the hotfix branch to the
Dependency Management
During the development process, when a team of developers works on the same codebase concurrently, it is common to have branches that depend on each other.
There are two common cases:
- The code changes from a developer have been merged into
developafter a working branch was created. - Implementing a feature requires the implementation of another feature that is being developed in a separate branch.
In such cases, the required code changes must be brought to the working branch using the rebase or cherry-pick strategy.
Rebase Strategy
The preferred strategy to bring the code from one branch to another is to use the rebase command. This command allows developers to move the commits from one branch to another. Technically, it rewrites the commit history of the target branch by adding the commits from the source branch before the commits of the target branches.
-
Verify the state of all commits in the source branch before performing any rebase operation to ensure the source branch is functional and buildable. If the source branch is not functional, the rebase operation will result in bringing broken changes to the target branch.
-
Fetch the latest version of the source branch before performing any rebase operation to ensure that the latest code changes are available locally.
# Given local branch is feature/939-improve-multiple-dependent-branches-management-guideline git fetch origin develop:develop git rebase develop -
Prefer to “clean up” the commit history of the current branch before rebasing it. The common method is to squash the commits of the current branch into fewer commits.
git rebase -i HEAD~2 git rebase -i origin/developDuring a rebase, all commits from the source branch are applied individually to each commit of the target branch. If the source branch has ten commits and the target branch has five commits, the rebase will apply the ten commits from the source branch to each of the five commits of the target branch. As a result, many code conflicts might need to be resolved manually. Reducing the number of commits of the current branch will reduce the number of conflicts to resolve, hence resulting in a faster rebase.
Cherry Pick Strategy
cherry-pick is used to select one or several commits from one branch (or multiple branches) and apply them to another branch. It is a useful command when not all the commits from a branch are needed in another branch.
-
Verify the state of the commits in the source branch before performing any cherry-pick operation to ensure the source commits are functional and buildable. If the latter are not functional, the cherry-pick operation will result in bringing broken changes to the target branch.
-
Fetch the latest version of the source branch before performing any cherry-pick operation to ensure that the latest code changes are available locally.
-
Prefer to cherry-pick a single commit at a time.