- Use cases
- Enable squash for a merge request
- Commit metadata for squashed commits
- Squash and fast-forward merge
- Squash commits options
- Moved from GitLab Premium to GitLab Free in 11.0.
With squash and merge you can combine all your merge request’s commits into one and retain a clean history.
Squashing lets you tidy up the commit history of a branch when accepting a merge request. It applies all of the changes in the merge request as a single commit, and then merges that commit using the merge method set for the project.
In other words, squashing a merge request turns a long list of commits:
Into a single commit on merge:
The squashed commit’s default commit message is taken from the merge request title.
It can be customized before merging a merge request.
Squashing also works with the fast-forward merge strategy, see squashing and fast-forward merge for more details.
When working on a feature branch, you sometimes want to commit your current progress, but don’t really care about the commit messages. Those ‘work in progress commits’ don’t necessarily contain important information and as such you’d rather not include them in your target branch.
With squash and merge, when the merge request is ready to be merged, all you have to do is enable squashing before you press merge to join the commits in the merge request into a single commit.
This way, the history of your base branch remains clean with meaningful commit messages and:
- It’s simpler to revert if necessary.
- The merged branch retains the full commit history.
Anyone who can create or edit a merge request can choose for it to be squashed on the merge request form. Users can select or clear the checkbox when they create the merge request:
After the merge request is submitted, Squash and Merge can still be enabled or disabled by editing the merge request description:
- Scroll to the top of the merge request page and click Edit.
- Scroll down to the end of the merge request form and select the checkbox Squash commits when merge request is accepted.
This setting can then be overridden at the time of accepting the merge request. At the end of the merge request widget, next to the Merge button, the Squash commits checkbox can be either selected or unselected:
Note that Squash and Merge might not be available depending on the project’s configuration for Squash Commit Options.
The squashed commit has the following metadata:
- Message: the message of the squash commit, or a customized message.
- Author: the author of the merge request.
- Committer: the user who initiated the squash.
When a project has the fast-forward merge setting enabled, the merge request must be able to be fast-forwarded without squashing in order to squash it. This is because squashing is only available when accepting a merge request, so a merge request may need to be rebased before squashing, even though squashing can itself be considered equivalent to rebasing.
With Squash Commits Options you can configure the behavior of Squash and Merge for your project. To set it up, navigate to your project’s Settings > General and expand Merge requests. You can choose from these options, which affect existing and new merge requests submitted to your project:
- Do not allow: users cannot use Squash and Merge to squash all the commits immediately before merging. The checkbox to enable or disable it is unchecked and hidden from the users.
- Allow: users can enable Squash and Merge on a merge request basis. The checkbox is unchecked (disabled) by default, but and the user is allowed to enable it.
- Encourage: users can enable Squash and Merge on a merge request basis. The checkbox is checked (enabled) by default to encourage its use, but the user is allowed to disable it.
- Require: Squash and Merge is enabled for all merge requests, so it is always performed. The checkbox to enable or disable it is checked and hidden from the users.
The Squash and Merge checkbox is displayed when you create a merge request and when you edit the description of an existing one, except when Squash Commit Options is set to Do not allow or Require.