跳至主要内容

Git Commit 教程:如何跟踪并记录代码更改

掌握 git commit 命令的核心要点,提升您的版本控制技能。学习暂存与提交更改、撰写高效信息,以及使用高级选项的基础知识。
· 15分钟 阅读

使用 AI 探索

Git 已成为管理代码库变更的首选系统。Git 中最关键的命令之一是 git commit,它会在某个时间点捕获您项目历史的一个快照。

高效掌握 git commit 对于维护干净有序的项目历史至关重要。撰写有意义的提交信息并遵循最佳实践,可确保无论您是单兵作战还是在更大的团队中,代码仓库都保持易于管理。

本教程旨在教您如何使用 git commit 命令、编写清晰且信息充分的提交信息,并采用最佳实践以实现成功的版本控制。

我们开始吧!

什么是 Git Commit?

版本控制在 Git 中的一个最基本构件就是 git commit 命令。一次 git commit 会捕获当前已暂存文件的状态,并将其保存到仓库历史中。它会为这些更改创建一个唯一标识符,并记录关键信息元数据,如作者、时间戳和描述性提交信息——这确保了修改可以被跟踪、理解,并在必要时回退。

开发者还可以添加提交信息,用简短的文字描述所做更改,并提供更新背后的上下文与原因。

本质上,提交之所以重要,是因为它们可以让开发者:

  • 跟踪更改: 提交为代码库随时间推移的修改提供了清晰的日志。
  • 协作: 在团队环境中,提交有助于开发者了解做了哪些更改、由谁完成以及原因。
  • 回退到先前状态: 若出现缺陷或问题,提交允许开发者将项目回滚到引入问题前的稳定点。
  • 维护清晰历史: 结构化且频繁、并带有有意义信息的提交,使管理大型项目和排查问题更加容易。

> 如果您刚开始使用 Git 和 GitHub,GitHub Foundations 学习路径提供了精心策划的路线,帮助您掌握版本控制与协作流程的基础要点。

Git Commit 的基本语法

要高效使用 Git,您需要了解提交的基本语法与结构。本节将逐步讲解提交流程的核心组成部分,以确保更改被正确捕获与记录。

基础命令

创建提交的最简单方式是使用以下命令:

git commit -m “Your commit message” 

这里,-m 标志允许您附上一条简短的提交信息来描述更改。在此您可以为日后参考与协作提供上下文,例如:

git commit -m “Fix bug in user authentication” 

该命令会创建提交并将其与所提供的信息关联。

提交期间发生了什么

当您进行一次提交时,底层会发生以下事情:

  1. 暂存更改:在提交之前,您必须使用 git add 命令对更改进行暂存。这会为下次提交准备已修改的文件。您可以暂存单个文件或所有已修改文件。
git add file.txt  #Stages one file
git add .  #Stages all files in the current directory
  1. 执行提交: 一旦更改已暂存,git commit 命令就会对这些暂存文件的当前状态进行快照并存入仓库。请注意,快照对应的是此刻文件的实际状态。
  2. 更新仓库:提交后,Git 会更新项目历史,将该提交与所有先前提交一同保存。每个提交都像一个检查点,必要时可以回退到该点。

如何撰写高效的 Git 提交信息

清晰而有意义的提交信息对维护干净、可理解的项目历史至关重要。一条写得好的提交信息也是一种沟通工具,能帮助开发者与协作者快速把握每次更改的目的与背景。

良好提交信息的重要性

优秀的提交信息如同地图。它们提供每次更改背后的思考,这在后续代码审查或问题排查时极为宝贵。良好的提交信息还能更容易追踪缺陷、理解功能的演进,并在仓库历史中顺畅导航。

提交信息的最佳实践

为确保提交信息发挥作用,请遵循以下最佳实践:

  1. 具备描述性: 提交信息应说明改了什么,以及在相关时说明为何要改。避免诸如 "fix" 或 "update" 之类模糊泛泛的消息。要具体,例如,“修复登录表单校验错误”比简单的“修复缺陷”有用得多。
  2. 使用祈使/现在时: 提交信息通常使用现在时或祈使语气,给人一种“此提交此刻正在做什么”的感觉。例如,用 "Add login validation" 而非 "Added login validation"。
  3. 简洁明了: 简明的信息更易阅读。摘要(提交信息第一行)通常应为 50–72 个字符;若需更多说明,可在后续行给出更长描述。这样可确保信息能在各类 Git 工具与界面中良好展示。
  4. 用项目符号列出细节: 若一次提交涉及多项相关变更,可在扩展描述中用项目符号拆分说明,结构更清晰、便于理解。

> 如果您想超越提交的基础知识,Intermediate Git 课程将带您了解更高级的概念,如 amend、rebase,以及在团队中管理提交历史。

高级 Git Commit 选项

-m 标志是 git commit 命令中常用的选项,日常使用已足够。不过,还有若干高级选项可在管理更改时提供更大的灵活性与效率。本节将一一介绍。

免暂存提交

很多情况下,在提交前用 git add 手动暂存文件可能显得多余,尤其是当需要提交所有已修改文件时。为加快流程,Git 提供 -a 标志,它会在一步内暂存所有已跟踪文件并提交。这意味着对已被跟踪文件的任何更改都会包含在提交中,而无需显式运行 git add。

用法如下:

git commit -a -m “Your commit message” 

修订一次提交

难免会出错。有时,您可能需要更改刚刚完成的一次提交。使用 --amend 选项可修改最近一次提交,而不是新建提交。这样您可以更新提交信息,或将其他文件加入同一次提交中。

例如,要修正上一次提交的信息:

git commit --amend -m "Update commit message"

或者,如果您忘了暂存某个文件,先添加文件,再修订提交:

git add missed-file.txt
git commit --amend

这会用更新后的提交替换之前的提交。

请注意,修订应仅针对尚未与他人共享的提交(例如,尚未推送到共享仓库),以避免重写他人可能依赖的历史!

基于特定提交的修复式提交

有时,您需要修正先前某次提交中的问题,同时不引入无关更改。Git 提供 --fixup 选项,帮助创建一个与较早提交特定关联的后续“修复”提交。这在合并前清理提交历史时尤其有用。

例如,为某个特定提交创建修复:

git commit --fixup <commit-hash>

该命令会创建一个新提交,旨在修复指定提交中的问题。

之后在进行交互式变基时,Git 可以自动将这些修复提交与其引用的原始提交压缩合并。

> 若需了解更高级的工作流,如压缩合并提交,您可以查看我们的详细指南:Git Squash Commits 教程。

使用 Git 管理提交

随着项目演进与提交历史增长,提交管理便成为保持仓库有序且可导航的关键。有效的提交管理有助于调试、协作,并维持清晰、易懂的历史。

Git 提供了强大的工具,允许您查看提交历史,并在必要时修改或撤销更改。掌握如何管理这些提交,在解决问题或优化项目历史时能节省大量时间。

查看提交历史

提交管理的关键在于理解项目的历史。git log 命令可以查看详细的提交历史,帮助您了解更改发生的时间、执行人以及附带的信息。

例如,最基本的 git log 命令如下:

git log

它会显示提交哈希、作者、日期及提交信息。

Git 还允许您按需自定义日志输出。例如,您可以限制显示的提交数量:

git log -n 5 # shows the last 5 commits

要查看每个提交中所做的更改,可使用 -p 标志显示每次提交的差异。

效果如下:

git log -p

回滚或撤销提交

有时,您需要回退或撤销更改。撤销提交的一种安全方式是使用 git revert 命令。它会创建一个新提交,以撤销先前提交引入的更改,同时不改变提交历史。

当您已与他人共享提交但仍希望保持历史完整时,这尤其有用。

要回滚某次提交,请使用:

git revert <commit-hash>

该命令会应用指定提交更改的反向操作,在保持透明历史的同时有效撤销它们。

重置提交

在某些情况下,您可能希望将仓库完全重置到先前状态,清除一个或多个提交。git reset 命令可以做到这一点。不过,重置会修改提交历史,因此应谨慎使用,尤其是在更改已推送到共享仓库的情况下。

Git reset 提供三种模式:

  1. 软重置(soft): 将提交指针移回到指定提交,但保留工作区和暂存区中的更改。适用于想要重做一次提交但保留更改的场景。
git reset --soft <commit-hash>
  1. 混合重置(mixed): 将提交指针移回指定提交并保留工作区中的更改,但清空暂存区。这是 Git 的默认重置模式。
git reset --mixed <commit-hash>
  1. 硬重置(hard): 将提交指针移回指定提交,并丢弃工作区与暂存区中的所有更改。本质上把仓库还原到所选提交的状态,删除该提交之后的任何更改。
git reset --hard <commit-hash>

git reset 是一把强大的工具,但务必理解其影响(尤其是在协作环境中)。

Git 提交的最佳实践

高效的版本控制不仅是掌握 Git 命令——还意味着遵循一定的最佳实践,以维护干净、易懂且高效的项目历史。这些做法不仅有助于您管理自身工作,也让协作者更易于参与与评审更改。

频繁提交,但保持小步快跑

一个良好的经验法则是尽早且经常提交,但让每次提交都小而聚焦。这样可确保每个提交代表一个独立且合理的工作单元。

频繁提交有助于将大型更改拆解为可管理的部分,便于审查、测试与追踪项目演进。通过提交更小、彼此隔离的更改,您也能降低引入复杂错误的风险。一旦出现问题,细粒度的提交更易于定位与修复。

仅提交相关更改

每次提交应聚焦于单一任务或问题。将无关更改混在一次提交中,会使审查与理解其意图变得更困难,也会在需要回滚或拣选特定更改时增加复杂度。

例如,若您在开发某个功能时注意到代码其他位置有小缺陷,最好将它们作为两个独立的提交来处理。这样有助于清楚理解做了什么、为什么做——也确保每次提交都具有明确意义且彼此独立。

与他人协作维护提交历史

团队合作时,与协作者就如何处理与呈现提交达成一致至关重要。这包括就提交信息的统一格式达成共识,并确保每个人都遵循最佳实践。可使用 Git 钩子(如 pre-commit 钩子)来强制执行规则,例如提交信息格式或在允许提交前运行测试。

协作还可借助于管理与评审提交的工具,例如代码评审平台,如 GitHub 或 GitLab。清晰、文档完善的提交历史能让团队成员更容易理解更改、讨论改进并高效推动项目进展。

> 想在提交前清理遗留文件?学习如何在这篇移除未跟踪文件的教程中使用 git clean。

排查常见的 Git 提交问题

Git 提交有时会出现错误或挑战,从而拖慢您的工作流。了解如何排查这些常见问题,对于保持顺畅的版本控制并避免后续更大问题至关重要。

提交信息相关错误

常见失误之一是忘记添加提交信息,或不小心使用了模糊或空的消息。清晰且信息充分的提交信息对于跟踪更改并让协作者理解项目历史至关重要。Git 通常会阻止您在没有信息时提交,但仍可能忽视信息本身的质量。

解决方案: 在回车前务必再次检查提交信息。若不小心提交了空白或不清晰的信息,您可以使用 git commit --amend 修改最近一次提交的信息。

提交后发生冲突

当多人参与同一项目时,冲突在所难免。它们常在合并分支或变基时出现。冲突发生在 Git 无法自动解决两个提交之间的差异时,您需要手动选择保留哪些更改。

当两个或更多贡献者修改了同一代码段,或对项目进行了大规模重构时,最容易出现冲突。尽管令人头疼,Git 提供了工具帮助您在不丢失数据的情况下解决冲突。

解决方案: 发生冲突时,Git 会在文件中标记冲突部分,您需要手动编辑文件以反映期望的更改。完成必要修改后,使用 git add 暂存该文件,然后通过提交已解决的更改来完成 merge 或 rebase。Git 的合并冲突编辑器或外部合并工具也能更高效地帮助您解决冲突。

结语

git commit 是 Git 版本控制的基础,它让开发者能够为自己的工作创建快照,从而在时间跨度上进行跟踪、评审和回访。提交是项目历史中的里程碑,能明确说明做了哪些更改、为何必要以及何时实施。

在本教程中,我们介绍了从使用 git add 暂存文件到使用 git commit 完成提交的基本语法与流程。我们讨论了撰写清晰简洁的提交信息的重要性,以及诸如保持描述性、使用现在时和保持简洁等最佳实践。

此外,我们还探讨了高级选项,如免暂存提交与修订提交,为您在管理更改时提供更大灵活性。我们也介绍了如何通过 git log、revert 与 reset 等命令来管理提交。

准备更深入地探索 GitHub 吗?我们的 GitHub 概念课程将带您了解 fork、分支、问题跟踪与协作最佳实践。若您正在为真实工作流或面试做准备,完整 Git 速查表是随手可查的绝佳参考!

FAQs

在 Git 中可以不写提交信息就提交吗?

从技术上讲可以,但不推荐。如果您在不带 -m 标志的情况下运行 git commit,Git 会打开您的默认文本编辑器,以便您交互式输入提交信息。若保存并退出时未写入任何内容,Git 可能会取消提交或根据配置保存为空消息。提交信息对于跟踪更改至关重要——务必包含一条提交信息!

git commit 和 git push 有什么区别?

git commit 会将更改保存到您本地的 Git 仓库,而 git push 会将这些更改发送到远程仓库,如 GitHub 或 GitLab。可以将提交视为本地快照,而推送则是将这些快照分享给他人的方式。

推送之后还能更改一次提交吗?

可以,但有风险。您可以使用 git commit --amend 或 git rebase 等命令修订或改写提交,但更改已推送的提交可能会给协作者带来问题。如果必须在推送后修改提交,您很可能需要使用 git push --force 来重写历史——在共享分支中请谨慎使用。

什么是已签名的 Git 提交?

签名提交使用 GPG(GNU Privacy Guard)或 SSH 来对提交作者的身份进行加密验证。这在开源或企业环境中尤为有用,因为需要验证更改作者的身份。您可以使用以下方式创建签名提交:

git commit -S -m "Your message"

能否在不丢失更改的情况下撤销一次提交?

可以!您可以使用 git reset --soft HEAD~1 撤销最后一次提交并保留已暂存的更改,或使用 git reset --mixed HEAD~1 将更改保留在工作区中。当您意识到提交过早或信息错误时,这很有用。

如何查看某次特定提交中包含了哪些文件?

您可以运行:

git show --name-only <commit-hash>

这将显示提交信息、差异以及该提交中更改的文件列表。

是否可以在项目中强制执行提交信息格式?

可以。您可以使用 Git 钩子(如 commit-msg)来强制执行规则(例如要求填写 JIRA 工单号或遵循特定格式)。在团队环境中,可借助 Husky 与 Commitlint 等工具实现自动化。

Kurtis Pykes

作者

Kurtis Pykes

主题