| 参数 | 说明 |
|---|---|
| --message, -m | 在提交中包含的消息。指定此参数会绕过 Git 通常打开编辑器的行为。 |
| --amend | 指定当前暂存的更改应添加(修改)到之前的提交中。小心,这可能会重写历史! |
| --no-edit | 使用选定的提交消息,而不启动编辑器。例如,git commit --amend --no-edit 会在不更改其提交消息的情况下修改提交。 |
| --all, -a | 提交所有更改,包括尚未暂存的更改。 |
| --date | 手动设置与提交关联的日期。 |
| --only | 仅提交指定的路径。这不会提交你当前已暂存的内容,除非另有说明。 |
| --patch, -p | 使用交互式补丁选择界面选择要提交的更改。 |
| --help | 显示 git commit 的 man 页。 |
| -S[keyid], -S | 签名提交,GPG 签名提交,取消提交的 gpgSign 配置变量。 |
| --gpgsign[=keyid] | 签名提交,GPG 签名提交。 |
| --no-gpg-sign | 取消提交的 gpgSign 配置变量。 |
| -n, --no-verify | 此选项绕过 pre-commit 和 commit-msg 钩子。 |
使用 Git 提交可以提供问责性,通过将更改归因于作者。Git 提供了多种功能,以确保提交的特定性和安全性。本章解释并演示了使用 Git 提交的正确实践和程序。
10.1 暂存并提交更改
基础知识
在对源代码进行更改后,你应该在提交之前使用 Git 暂存这些更改。例如,如果你更改了 README.md 和 program.py:
git add README.md program.py
这告诉 Git 你希望将这些文件添加到下一个提交中。
然后,使用以下命令提交更改:
git commit
请注意,这将打开一个文本编辑器,通常是 vim。如果你不熟悉 vim,你可能需要知道,你可以按 i 进入插入模式,写入提交消息,然后按 Esc 和 :wq 保存并退出。为了避免打开文本编辑器,可以简单地使用 -m 标志包含消息:
git commit -m "Commit message here"
提交消息通常遵循一些特定的格式规则,更多信息请参阅“良好的提交消息”。
快捷方式
如果你在目录中更改了许多文件,而不是列出每一个文件,你可以使用:
git add --all # 等同于 "git add -a"
或者从顶级目录及其子目录中添加所有更改(不包括已删除的文件):
git add .
或者仅添加当前已跟踪的文件(“更新”):
git add -u
如果需要,可以查看暂存的更改:
git status # 显示更改文件列表
git diff --cached # 显示暂存文件中的更改
最后,提交更改:
git commit -m "Commit message here"
或者,如果你只修改了现有文件或删除了文件,而没有创建新文件,可以将 git add 和 git commit 的操作合并为一个命令:
git commit -am "Commit message here"
请注意,这将像 git add --all 一样暂存所有已修改的文件。
敏感数据
你永远不应该提交任何敏感数据,如密码或私钥。如果这种情况发生,并且更改已经推送到中央服务器,应考虑任何敏感数据都已泄露。否则,可以稍后删除此类数据。一个快速且简单的解决方案是使用“BFG Repo-Cleaner”:
https://rtyley.github.io/bfg-repo-cleaner/
命令 bfg --replace-text passwords.txt my-repo.git 会从 passwords.txt 文件中读取密码,并将其替换为 REMOVED。此操作会考虑整个仓库的所有先前提交。
10.2 良好的提交消息
对于正在查看 git log 的人来说,重要的是能够轻松理解每个提交的内容。
良好的提交消息通常包括任务或跟踪器中的编号以及对已完成内容和原因的简洁描述,有时还会描述如何完成。
更好的消息可能如下所示:
TASK-123: Implement login through OAuth
TASK-124: Add auto minification of JS/CSS files
TASK-125: Fix minifier error when name > 200 chars
而以下消息则不太有用:
fix // What has been fixed?
just a bit of a change // What has changed?
TASK-371 // No description at all, reader will need to look at the tracker themselves for an explanation
Implemented IFoo in IBar // Why it was needed?
一种测试提交消息是否正确编写的方法是用消息替换空白处,看看是否通顺:
If I add this commit, I will ___ to my repository.
伟大的 Git 提交消息的七条规则:
- 用空白行将主题行与正文分开。
- 将主题行限制在 50 个字符以内。
- 首字母大写主题行。
- 不要在主题行末尾加句号。
- 在主题行中使用祈使语气。
- 手动将正文的每行限制在 72 个字符以内。
- 使用正文解释“是什么”和“为什么”,而不是“怎么做”。
七条规则来自 Chris Beam 的博客。
10.3 修改提交
如果你的最新提交尚未发布(尚未推送到上游仓库),则可以修改你的提交。
git commit --amend
这将把当前暂存的更改添加到之前的提交中。
注意:这也可以用来编辑错误的提交消息。它将打开默认编辑器(通常是 vim/emacs),允许你更改之前的提交消息。
要直接指定提交消息:
git commit --amend -m "New commit message"
或者,使用之前的提交消息而不更改它:
git commit --amend --no-edit
修改会更新提交日期,但保留作者日期不变。你可以告诉 Git 刷新信息。
git commit --amend --reset-author
你还可以更改提交的作者:
git commit --amend --author "New Author <email@address.com>"
注意:修改最新的提交会完全替换它,之前的提交将从分支的历史中移除。在与公共仓库和其他协作者一起工作时,这一点需要牢记。
这意味着,如果之前的提交已经推送到远程仓库,修改后你需要使用 push --force。
10.4 不打开编辑器直接提交
Git 通常会在你运行 git commit 时打开一个编辑器(如 vim 或 emacs)。使用 -m 选项从命令行指定消息:
git commit -m "Commit message here"
你的提交消息可以跨越多行:
git commit -m "Commit 'subject line' message here
More detailed description follows here (after a blank line)."
或者,你可以传递多个 -m 参数:
git commit -m "Commit summary" -m "More detailed description follows here"
更多信息请参阅“如何编写 Git 提交消息”。Udacity Git 提交消息风格指南。
10.5 直接提交更改
通常,你需要使用 git add 或 git rm 将更改添加到索引中,然后才能提交。使用 -a 或 --all 选项可以自动将每个更改(包括删除)添加到索引中:
git commit -a
如果你还想添加提交消息,可以这样做:
git commit -a -m "your commit message goes here"
此外,你可以将两个标志合并:
git commit -am "your commit message goes here"
你不一定需要一次性提交所有文件。省略 -a 或 --all 标志,直接指定你想要提交的文件:
git commit path/to/a/file -m "your commit message goes here"
对于直接提交多个特定文件,你也可以指定一个或多个文件、目录和模式:
git commit path/to/a/file path/to/a/folder/* path/to/b/file -m "your commit message goes here"
10.6 选择要暂存提交的行
假设你在一个或多个文件中有许多更改,但只想提交每个文件中的一些更改,可以使用以下命令选择所需的更改:
git add -p
或
git add -p [file]
你的每个更改将单独显示,对于每个更改,系统会提示你选择以下选项之一:
- y - 是,添加此块
- n - 否,不添加此块
- d - 不添加此块,也不添加该文件中的任何其他剩余块
- s - 如果可能,将块分割成更小的块
- e - 手动编辑块。这是最强大的选项之一。它将在文本编辑器中打开块,你可以根据需要进行编辑。
这将暂存你选择的文件部分。然后,你可以像这样提交所有暂存的更改:
git commit -m 'Commit Message'
未暂存或提交的更改仍然会出现在你的工作文件中,如果需要,可以稍后提交。或者,如果剩余的更改不需要,可以使用以下命令丢弃它们:
git reset --hard
除了将大更改分解为更小的提交外,这种方法还有助于审查你即将提交的内容。通过逐个确认每个更改,你有机会检查你所写的内容,可以避免不小心暂存不需要的代码,例如 println/日志语句。
10.7 创建空提交
通常,空提交(或与父提交状态相同的提交)是一个错误。
然而,在测试构建钩子、CI 系统和其他触发提交的系统时,能够轻松创建无需编辑/触摸虚拟文件的提交非常方便。
--allow-empty 提交将绕过检查。
git commit -m "This is a blank commit" --allow-empty
10.8 代表他人提交
如果你正在提交某人编写的代码,可以使用 --author 选项给予他们信用:
git commit -m "msg" --author "John Smith <johnsmith@example.com>"
你还可以提供一个模式,Git 将使用该模式搜索之前的作者:
git commit -m "msg" --author "John"
在这种情况下,将使用最近一次作者包含“John”的提交的作者信息。
在 GitHub 上,使用上述任一方式提交的提交将显示一个较大的作者缩略图,提交者的缩略图较小且在前面。
10.9 GPG 签名提交
- 确定你的密钥 ID
gpg --list-secret-keys --keyid-format LONG
你的 ID 是第一个正斜杠后的 16 位字母数字代码。
- 在你的 Git 配置中定义你的密钥 ID
git config --global user.signingkey YOUR-16-DIGIT-KEY-ID
- 从版本 1.7.9 开始,
git commit接受-S选项以将签名附加到你的提交。使用此选项将提示你输入 GPG 密码,并将你的签名添加到提交日志中。
git commit -S -m "Your commit message"
10.10 提交特定文件的更改
你可以提交特定文件的更改,而不使用 git add 暂存它们:
git commit file1.c file2.h
或者,你可以先暂存文件:
git add file1.c file2.h
然后稍后提交它们:
git commit
10.11 在特定日期提交
git commit -m 'Fix UI bug' --date 2026-07-01
--date 参数设置作者日期。此日期将出现在 git log 的标准输出中。
要强制提交日期:
GIT_COMMITTER_DATE=2026-07-01 git commit -m 'Fix UI bug' --date 2026-07-01
--date 参数接受 GNU date 支持的灵活格式,例如:
git commit -m 'Fix UI bug' --date yesterday
git commit -m 'Fix UI bug' --date '3 days ago'
git commit -m 'Fix UI bug' --date '3 hours ago'
如果日期没有指定时间,将使用当前时间,仅覆盖日期。
10.12 修改提交的时间
你可以使用以下命令修改提交的时间:
git commit --amend --date="Thu Jul 28 11:30 2026 +0800"
或者
git commit --amend --date="now"
10.13 修改提交的作者
如果你以错误的作者身份提交,可以更改它,然后修改:
git config user.name "Full Name"
git config user.email "email@example.com"
git commit --amend --reset-author