Push Options (FREE)

GitLab supports using client-side Git push options to perform various actions at the same time as pushing changes. Additionally, Push Rules offer server-side control and enforcement options.

Currently, there are push options available for:

NOTE: Git push options are only available with Git 2.10 or newer.

For Git versions 2.10 to 2.17 use --push-option:

git push --push-option=<push_option>

For version 2.18 and later, you can use the above format, or the shorter -o:

git push -o <push_option>

Push options for GitLab CI/CD

You can use push options to skip a CI/CD pipeline, or pass CI/CD variables.

Push option Description Introduced in version
ci.skip Do not create a CI pipeline for the latest push. Only skips branch pipelines and not merge request pipelines. 11.7
ci.variable="<name>=<value>" Provide CI/CD variables to be used in a CI pipeline, if one is created due to the push. 12.6

An example of using ci.skip:

git push -o ci.skip

An example of passing some CI/CD variables for a pipeline:

git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"

Push options for merge requests

You can use Git push options to perform certain actions for merge requests at the same time as pushing changes:

Push option Description Introduced in version
merge_request.create Create a new merge request for the pushed branch. 11.10
merge_request.target=<branch_name> Set the target of the merge request to a particular branch or upstream project, such as: git push -o merge_request.target=project_path/branch 11.10
merge_request.merge_when_pipeline_succeeds Set the merge request to merge when its pipeline succeeds. 11.10
merge_request.remove_source_branch Set the merge request to remove the source branch when it's merged. 12.2
merge_request.title="<title>" Set the title of the merge request. Ex: git push -o merge_request.title="The title I want". 12.2
merge_request.description="<description>" Set the description of the merge request. Ex: git push -o merge_request.description="The description I want". 12.2
merge_request.milestone="<milestone>" Set the milestone of the merge request. Ex: git push -o merge_request.milestone="3.0". 14.1
merge_request.label="<label>" Add labels to the merge request. If the label does not exist, it is created. For example, for two labels: git push -o merge_request.label="label1" -o merge_request.label="label2". 12.3
merge_request.unlabel="<label>" Remove labels from the merge request. For example, for two labels: git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2". 12.3
merge_request.assign="<user>" Assign users to the merge request. Accepts username or user ID. For example, for two users: git push -o merge_request.assign="user1" -o merge_request.assign="user2". 13.10
merge_request.unassign="<user>" Remove assigned users from the merge request. Accepts username or user ID.For example, for two users: git push -o merge_request.unassign="user1" -o merge_request.unassign="user2". 13.10

If you use a push option that requires text with spaces in it, you need to enclose it in quotes ("). You can omit the quotes if there are no spaces. Some examples:

git push -o merge_request.label="Label with spaces"
git push -o merge_request.label=Label-with-no-spaces

You can combine push options to accomplish multiple tasks at once, by using multiple -o (or --push-option) flags. For example, if you want to create a new merge request, and target a branch named my-target-branch:

git push -o merge_request.create -o merge_request.target=my-target-branch

Additionally if you want the merge request to merge as soon as the pipeline succeeds you can do:

git push -o merge_request.create -o merge_request.target=my-target-branch -o merge_request.merge_when_pipeline_succeeds

Useful Git aliases

As shown above, Git push options can cause Git commands to grow very long. If you use the same push options frequently, it's useful to create Git aliases. Git aliases are command line shortcuts for Git which can significantly simplify the use of long Git commands.

Merge when pipeline succeeds alias

To set up a Git alias for the merge when pipeline succeeds Git push option:

git config --global alias.mwps "push -o merge_request.create -o merge_request.target=master -o merge_request.merge_when_pipeline_succeeds"

Then to quickly push a local branch that targets the default branch and merges when the pipeline succeeds:

git mwps origin <local-branch-name>

Troubleshooting

Push options for merge request assignment ignored

When you push a branch to GitLab, you can use push options to assign to (merge_request.assign="<USERNAME>") or unassign from (merge_request.unassign="<USERNAME>") a user. If GitLab creates the merge request successfully, but fails to assign or unassign the merge request correctly, you can use the user ID instead. For more information, read the issue Push option merge_request.(un)assign seems to be ignored.