2019-10-12 21:52:04 +05:30
---
2020-10-24 23:57:45 +05:30
stage: Create
group: Source Code
2022-11-25 23:54:43 +05:30
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments"
2019-10-12 21:52:04 +05:30
---
2021-03-11 19:13:27 +05:30
# Branches **(FREE)**
2017-09-10 17:25:29 +05:30
2023-05-27 22:25:52 +05:30
Branches are versions of a project's working tree. When you create a new
[project ](../../index.md ), GitLab creates a [default branch ](default.md ) (which
cannot be deleted) for your repository. Default branch settings can be configured
at the project, subgroup, group, or instance level.
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
As your project grows, your team [creates ](../web_editor.md#create-a-branch ) more
branches, preferably by following [branch naming patterns ](#prefix-branch-names-with-issue-numbers ).
Each branch represents a set of changes, which allows development work to be done
in parallel. Development work in one branch does not affect another branch.
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
Branches are the foundation of development in a project:
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
1. To get started, create a branch and add commits to it.
1. When the work is ready for review, create a [merge request ](../../merge_requests/index.md ) to propose
merging the changes in your branch. To streamline this process, you should follow
[branch naming patterns ](#prefix-branch-names-with-issue-numbers ).
1. Preview changes in a branch with a [review app ](../../../../ci/review_apps/index.md ).
1. After the contents of your branch are merged, [delete the merged branch ](#delete-merged-branches ).
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
## Manage and protect branches
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
GitLab provides you multiple methods to protect individual branches. These methods
ensure your branches receive oversight and quality checks from their creation to their deletion:
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
- The [default branch ](default.md ) in your project receives extra protection.
- Configure [protected branches ](../../protected_branches.md#protected-branches )
to restrict who can commit to a branch, merge other branches into it, or merge
the branch itself into another branch.
- Configure [approval rules ](../../merge_requests/approvals/rules.md ) to set review
requirements, including [security-related approvals ](../../merge_requests/approvals/rules.md#security-approvals ), before a branch can merge.
- Integrate with third-party [status checks ](../../merge_requests/status_checks.md )
to ensure your branch contents meet your standards of quality.
2018-03-17 18:26:18 +05:30
2023-05-27 22:25:52 +05:30
You can manage your branches:
2018-03-17 18:26:18 +05:30
2023-05-27 22:25:52 +05:30
- With the GitLab user interface.
- With the [command line ](../../../../gitlab-basics/start-using-git.md#create-a-branch ).
- With the [Branches API ](../../../../api/branches.md ).
2018-03-17 18:26:18 +05:30
2023-05-27 22:25:52 +05:30
### View all branches
2022-11-25 23:54:43 +05:30
2023-05-27 22:25:52 +05:30
To view and manage your branches in the GitLab user interface:
2017-09-10 17:25:29 +05:30
2023-05-27 22:25:52 +05:30
1. On the top bar, select **Main menu > Projects** and find your project.
1. On the left sidebar, select **Repository > Branches** .
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
On this page, you can:
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
- See all branches, active branches, or stale branches.
- Create new branches.
- [Compare branches ](#compare-branches ).
- Delete merged branches.
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
### View branches with configured protections
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88279) in GitLab 15.1 with a flag named `branch_rules`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/363170) in GitLab 15.10.
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag ](../../../feature_flags.md ) named `branch_rules` .
On GitLab.com, this feature is available.
2021-04-17 20:07:23 +05:30
2023-05-27 22:25:52 +05:30
Branches in your repository can be [protected ](../../protected_branches.md ) in multiple ways. You can:
2018-12-13 13:39:08 +05:30
2023-05-27 22:25:52 +05:30
- Limit who can push to the branch.
- Limit who can merge the branch.
- Require approval of all changes.
- Require external tests to pass.
2018-12-13 13:39:08 +05:30
2023-05-27 22:25:52 +05:30
The **Branch rules overview** page shows all branches with any configured protections,
and their protection methods:
2018-12-13 13:39:08 +05:30
2023-05-27 22:25:52 +05:30
![Example of a branch with configured protections ](img/view_branch_protections_v15_10.png )
2018-12-13 13:39:08 +05:30
2023-05-27 22:25:52 +05:30
Prerequisites:
2018-12-13 13:39:08 +05:30
2023-05-27 22:25:52 +05:30
- You must have at least the Developer role in the project.
2023-03-04 22:38:38 +05:30
2023-05-27 22:25:52 +05:30
To view the **Branch rules overview** list:
2019-10-12 21:52:04 +05:30
2023-05-27 22:25:52 +05:30
1. On the top bar, select **Main menu > Projects** and find your project.
1. On the left sidebar, select **Settings > Repository** .
1. Expand **Branch Rules** to view all branches with protections.
- To add protections to a new branch:
1. Select **Add branch rule** .
1. Select **Create protected branch** .
- To view more information about protections on an existing branch:
1. Identify the branch you want more information about.
1. Select **Details** to see information about its:
- [Branch protections ](../../protected_branches.md ).
- [Approval rules ](../../merge_requests/approvals/rules.md ).
- [Status checks ](../../merge_requests/status_checks.md ).
## Prefix branch names with issue numbers
To streamline the creation of merge requests, start your branch name with an
issue number. GitLab uses the issue number to import data into the merge request:
- The issue is marked as related. The issue and merge request display links to each other.
- If your project is configured with a
[default closing pattern ](../../issues/managing_issues.md#default-closing-pattern ),
merging the merge request [also closes ](../../issues/managing_issues.md#closing-issues-automatically )
the related issue.
- The issue milestone and labels are copied to the merge request.
2021-06-08 01:23:25 +05:30
2023-05-27 22:25:52 +05:30
## Compare branches
2021-06-08 01:23:25 +05:30
2023-05-27 22:25:52 +05:30
> - Repository filter search box [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52967) in GitLab 13.10.
> - Revision swapping [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60491) in GitLab 13.12.
2021-06-08 01:23:25 +05:30
2023-05-27 22:25:52 +05:30
To compare branches in a repository:
2021-06-08 01:23:25 +05:30
2023-05-27 22:25:52 +05:30
1. On the top bar, select **Main menu > Projects** and find your project.
1. On the left sidebar, select **Repository > Compare revisions** .
1. Select the **Source** branch to search for your desired branch. Exact matches are
shown first. You can refine your search with operators:
- `^` matches the beginning of the branch name: `^feat` matches `feat/user-authentication` .
- `$` matches the end of the branch name: `widget$` matches `feat/search-box-widget` .
- `*` matches using a wildcard: `branch*cache*` matches `fix/branch-search-cache-expiration` .
- You can combine operators: `^chore/*migration$` matches `chore/user-data-migration` .
1. Select the **Target** repository and branch. Exact matches are shown first.
1. Select **Compare** to show the list of commits, and changed files. To reverse
the **Source** and **Target** , select **Swap revisions** .
2021-06-08 01:23:25 +05:30
2023-05-27 22:25:52 +05:30
## Delete merged branches
2023-03-17 16:20:25 +05:30
2023-05-27 22:25:52 +05:30
![Delete merged branches ](img/delete_merged_branches.png )
2023-03-17 16:20:25 +05:30
2023-05-27 22:25:52 +05:30
This feature allows merged branches to be deleted in bulk. Only branches that
have been merged into the project's default branch and
[are not protected ](../../protected_branches.md ) are deleted as part of
this operation.
2023-03-17 16:20:25 +05:30
2023-05-27 22:25:52 +05:30
It's particularly useful to clean up old branches that were not deleted
automatically when a merge request was merged.
2023-03-17 16:20:25 +05:30
2023-05-27 22:25:52 +05:30
## Related topics
2023-03-17 16:20:25 +05:30
2023-05-27 22:25:52 +05:30
- [Protected branches ](../../protected_branches.md ) user documentation.
- [Branches API ](../../../../api/branches.md ), for information on operating on repository branches using the GitLab API.
- [Protected Branches API ](../../../../api/protected_branches.md ).
- [Getting started with Git ](../../../../topics/git/index.md ) and GitLab.
2023-03-17 16:20:25 +05:30
2023-03-04 22:38:38 +05:30
## Troubleshooting
2023-04-23 21:23:45 +05:30
### Multiple branches containing the same commit
At a deeper technical level, Git branches aren't separate entities, but labels
attached to a set of commit SHAs. When GitLab determines whether or not a branch has been
merged, it checks the target branch for the existence of those commit SHAs.
This behavior can cause unexpected results when two merge requests contain the same
commits. In this example, branches `B` and `C` both start from the same commit (`3`)
on branch `A` :
```mermaid
gitGraph
commit id:"a"
branch "branch A"
commit id:"b"
commit id:"c" type: HIGHLIGHT
branch "branch B"
commit id:"d"
checkout "branch A"
branch "branch C"
commit id:"e"
checkout main
merge "branch B" id:"merges commits b, c, d"
```
If you merge branch `B` , branch `A` also appears as merged (without any action from you)
because all commits from branch `A` now appear in the target branch `main` . Branch `C`
remains unmerged, because commit `5` wasn't part of branch `A` or `B` .
Merge request `A` remains merged, even if you attempt to push new commits
to its branch. If any changes in merge request `A` remain unmerged (because they
weren't part of merge request `A` ), open a new merge request for them.
2023-03-04 22:38:38 +05:30
### Error: ambiguous `HEAD` branch exists
In versions of Git earlier than 2.16.0, you could create a branch named `HEAD` .
This branch named `HEAD` collides with the internal reference (also named `HEAD` )
Git uses to describe the active (checked out) branch. This naming collision can
prevent you from updating the default branch of your repository:
```plaintext
Error: Could not set the default branch. Do you have a branch named 'HEAD' in your repository?
```
To fix this problem:
2019-10-12 21:52:04 +05:30
2023-03-04 22:38:38 +05:30
1. On the top bar, select **Main menu > Projects** and find your project.
1. On the left sidebar, select **Repository > Branches** .
1. Search for a branch named `HEAD` .
1. Make sure the branch has no uncommitted changes.
1. Select **Delete branch** , then **Yes, delete branch** .
2019-10-12 21:52:04 +05:30
2023-03-04 22:38:38 +05:30
Git versions [2.16.0 and later ](https://github.com/git/git/commit/a625b092cc59940521789fe8a3ff69c8d6b14eb2 ),
prevent you from creating a branch with this name.