Help us learn about your current experience with the documentation. Take the survey.

暂存、提交和推送更改

当您修改仓库中的文件时,Git 会将更改与最新签出的分支版本进行跟踪。您可以使用 Git 命令来审查和提交更改到分支,并将您的工作推送到 GitLab。

添加并提交本地更改

当您准备将更改写入分支时,可以提交它们。提交包含一个记录更改信息的注释,通常会成为分支的新头部。

Git 不会自动包含您移动、更改或删除的任何文件到提交中。这可以防止您意外包含更改或文件,例如临时目录。要将更改包含在提交中,请使用 git add 暂存它们。

要暂存和提交您的更改:

  1. 从您的仓库中,对于每个要添加的文件或目录,运行 git add <文件名或路径>

    要暂存当前工作目录中的所有文件,请运行 git add .

  2. 确认文件已添加到暂存区:

    git status

    文件会以绿色显示。

  3. 要提交暂存的文件:

    git commit -m "<描述更改的注释>"

更改已提交到分支。

编写良好的提交消息

Chris Beams 在 如何编写 Git 提交消息 中发布的指南 可以帮助您编写良好的提交消息:

  • 提交主题和正文必须用空行分隔。
  • 提交主题必须以大写字母开头。
  • 提交主题不能超过 72 个字符。
  • 提交主题不能以句号结尾。
  • 提交正文每行不能超过 72 个字符。
  • 提交主题或正文不能包含 emoji。
  • 在至少 3 个文件中更改 30 行或更多的提交 应在提交正文中描述这些更改。
  • 使用完整的问题、里程碑和合并请求 URL,而不是简短引用, 因为它们在 GitLab 外部显示为纯文本。
  • 合并请求不应包含超过 10 条提交消息。
  • 提交主题应至少包含 3 个单词。

提交所有更改

您可以使用一个命令暂存所有更改并提交它们:

git commit -a -m "<描述更改的注释>"

请小心,确保您的提交不包含您不想记录到远程仓库的文件。作为规则,在提交更改之前,请始终检查本地仓库的状态。

将更改发送到 GitLab

要将所有本地更改推送到远程仓库:

git push <远程仓库名> <分支名>

例如,要将您的本地提交推送到 origin 远程的 main 分支:

git push origin main

有时 Git 不允许您推送到仓库。相反,您必须 强制更新

推送选项

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

当您将更改推送到分支时,可以使用客户端的 Git 推送选项。 在 Git 2.10 及更高版本中,使用 Git 推送选项来:

在 Git 2.18 及更高版本中,您可以使用长格式 (--push-option) 或更短的 -o

git push -o <推送选项>

在 Git 2.10 到 2.17 中,您必须使用长格式:

git push --push-option=<推送选项>

有关服务器端控制和最佳实践执行,请参阅 推送规则服务器钩子

GitLab CI/CD 的推送选项

您可以使用推送选项来跳过 CI/CD 管道,或传递 CI/CD 变量。

推送选项不适用于合并请求管道。更多信息,请参阅 问题 373212

推送选项 描述 示例
ci.input=<name>=<value> 创建具有指定输入的管道。 例如:git push -o ci.input='stage=test' -o ci.input='security_scan=false'。字符串数组示例:ci.input='["string", "double", "quotes"]'
ci.skip 不为最新的推送创建 CI/CD 管道。仅跳过分支管道,不跳过 合并请求管道。这不跳过 CI/CD 集成的管道,例如 Jenkins。 git push -o ci.skip
ci.variable="<name>=<value>" 如果由于推送创建了 CI/CD 管道,则向其提供 CI/CD 变量。变量仅传递给分支管道,不传递给 合并请求管道 git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"

集成的推送选项

您可以使用推送选项来跳过集成 CI/CD 管道。

推送选项 描述 示例
integrations.skip_ci 跳过 CI/CD 集成的推送事件,例如 Atlassian Bamboo、Buildkite、Drone、Jenkins 和 JetBrains TeamCity。在 GitLab 16.2 中引入。 git push -o integrations.skip_ci

合并请求的推送选项

Git 推送选项可以在推送更改时对合并请求执行操作:

推送选项 描述
merge_request.create 为推送的分支创建新的合并请求。从默认分支推送时,必须使用 merge_request.target 选项指定目标分支才能创建合并请求。
merge_request.target=<branch_name> 将合并请求的目标设置为特定分支,例如:git push -o merge_request.target=branch_name。从默认分支创建合并请求时必需。
merge_request.target_project=<project> 将合并请求的目标设置为特定的上游项目,例如:git push -o merge_request.target_project=path/to/project。在 GitLab 16.6 中引入。
merge_request.merge_when_pipeline_succeeds 在 GitLab 17.11 中 已弃用,推荐使用 auto_merge 选项。
merge_request.auto_merge 将合并请求设置为 自动合并
merge_request.remove_source_branch 设置合并请求在合并时删除源分支。
merge_request.squash 设置合并请求在合并时将所有提交压缩为单个提交。在 GitLab 17.2 中引入。
merge_request.title="<title>" 设置合并请求的标题。例如:git push -o merge_request.title="我想要的标题"
merge_request.description="<description>" 设置合并请求的描述。例如:git push -o merge_request.description="我想要的描述"
merge_request.draft 将合并请求标记为草稿。例如:git push -o merge_request.draft
merge_request.milestone="<milestone>" 设置合并请求的里程碑。例如:git push -o merge_request.milestone="3.0"
merge_request.label="<label>" 为合并请求添加标签。如果标签不存在,则会创建。例如,两个标签:git push -o merge_request.label="label1" -o merge_request.label="label2"
merge_request.unlabel="<label>" 从合并请求中移除标签。例如,两个标签:git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2"
merge_request.assign="<user>" 将用户分配给合并请求。接受用户名或用户 ID。例如,两个用户:git push -o merge_request.assign="user1" -o merge_request.assign="user2"
merge_request.unassign="<user>" 从合并请求中移除已分配的用户。接受用户名或用户 ID。例如,两个用户:git push -o merge_request.unassign="user1" -o merge_request.unassign="user2"

秘密推送保护的推送选项

您可以使用推送选项来跳过 秘密推送保护

推送选项 描述 示例
secret_push_protection.skip_all 不对此推送中的任何提交执行秘密推送保护。 git push -o secret_push_protection.skip_all

GitGuardian 集成的推送选项

您可以使用相同的 秘密推送保护的推送选项 来跳过 GitGuardian 秘密检测。

推送选项 描述 示例
secret_detection.skip_all 在 GitLab 17.2 中已弃用。请改用 secret_push_protection.skip_all git push -o secret_detection.skip_all
secret_push_protection.skip_all 不执行 GitGuardian 秘密检测。 git push -o secret_push_protection.skip_all

推送选项的格式

如果您的推送选项需要包含空格的文本,请用双引号 (") 将文本括起来。如果没有空格,可以省略引号。一些示例:

git push -o merge_request.label="带空格的标签"
git push -o merge_request.label=无空格的标签

要组合推送选项以一次性完成多个任务,请使用多个 -o(或 --push-option)标志。此命令创建一个新的合并请求,目标分支为 (my-target-branch),并设置自动合并:

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

要从默认分支创建一个针对不同分支的新合并请求:

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

为推送创建 Git 别名

将推送选项添加到 Git 命令可能会创建非常长的命令。如果您经常使用相同的推送选项,请为它们创建 Git 别名。Git 别名是较长 Git 命令的命令行快捷方式。

要为 自动合并 Git 推送选项 创建和使用 Git 别名:

  1. 在您的终端窗口中,运行以下命令:

    git config --global alias.mwps "push -o merge_request.create -o merge_request.target=main -o merge_request.auto_merge"
  2. 要使用别名推送一个目标为默认分支 (main) 并自动合并的本地分支,请运行以下命令:

    git mwps origin <本地分支名>

相关主题