暂存、提交和推送更改
当您修改仓库中的文件时,Git 会将更改与最新签出的分支版本进行跟踪。您可以使用 Git 命令来审查和提交更改到分支,并将您的工作推送到 GitLab。
添加并提交本地更改
当您准备将更改写入分支时,可以提交它们。提交包含一个记录更改信息的注释,通常会成为分支的新头部。
Git 不会自动包含您移动、更改或删除的任何文件到提交中。这可以防止您意外包含更改或文件,例如临时目录。要将更改包含在提交中,请使用 git add 暂存它们。
要暂存和提交您的更改:
-
从您的仓库中,对于每个要添加的文件或目录,运行
git add <文件名或路径>。要暂存当前工作目录中的所有文件,请运行
git add .。 -
确认文件已添加到暂存区:
git status文件会以绿色显示。
-
要提交暂存的文件:
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 别名:
-
在您的终端窗口中,运行以下命令:
git config --global alias.mwps "push -o merge_request.create -o merge_request.target=main -o merge_request.auto_merge" -
要使用别名推送一个目标为默认分支 (
main) 并自动合并的本地分支,请运行以下命令:git mwps origin <本地分支名>