# Git 提交代码的基本步骤是什么?

8 min read
Table of Contents

Git 提交代码的基本步骤是什么?

Git 提交代码的基本步骤(面试标准答案)

【核心定义】

Git 提交代码的本质是将工作区中已暂存的修改,创建一个永久性的快照(commit),并记录到本地版本库中,形成一条可追溯的历史记录。

【关键要点】

  1. 工作区修改:在本地文件系统中对项目文件进行增、删、改操作。
  2. 暂存修改:使用 git add 命令将工作区的特定修改添加到暂存区(Staging Area),这是一个准备提交的“预检区”。
  3. 提交快照:使用 git commit 命令将暂存区中的所有内容,创建一个带有唯一哈希值、提交者信息、时间戳和提交说明的永久性提交对象,保存到本地仓库。
  4. 推送远程(可选但常见):使用 git push 命令将本地仓库中的新提交同步到远程仓库(如 GitHub, GitLab),实现团队协作与备份。

【深度推导/细节】

核心矛盾:为什么需要“暂存区”(Staging Area)?

这是一个设计精妙之处,解决了以下关键问题:

  • 提交粒度控制:允许开发者从一批修改中,精心挑选出相关的、逻辑完整的部分组成一个提交,而不是一次性提交所有改动。这保证了每个提交的原子性和可读性。
  • 代码审查预演:在 git add 后,可以通过 git diff --staged 精确查看即将提交的内容,进行最后的检查。
  • 中断与恢复:工作区的修改可以分多次、有选择地添加到暂存区,即使中途被打断,也不会丢失已暂存的部分。

详细步骤拆解(逻辑复现):

Step 1: 状态检查

Terminal window
git status
  • 目的:清晰区分“已修改未暂存”(红色)、“已暂存未提交”(绿色)和“未跟踪文件”三种状态。这是所有后续操作的基础。

Step 2: 添加至暂存区

Terminal window
# 添加特定文件
git add <file_name>
# 添加当前目录下所有修改(慎用)
git add .
# 交互式添加(高级用法,精确控制)
git add -p
  • 本质:git add 并非“复制文件”,而是为文件当前内容创建一个 Blob 对象,并更新索引(Index) 指向该Blob。

Step 3: 创建提交

Terminal window
# 标准提交,会打开编辑器填写提交信息
git commit
# 带提交信息的快速提交
git commit -m "feat: 添加用户登录功能"
  • 底层发生什么:
    1. Git 根据索引内容,生成一个树对象(Tree Object),代表项目此刻的目录结构。
    2. 创建一个提交对象(Commit Object),包含:指向该树对象的指针、指向上一个提交(父提交)的指针、作者/提交者信息、时间戳以及提交信息。
    3. 当前分支指针(如 main)向前移动,指向这个新的提交对象。

Step 4: 推送至远程

Terminal window
git push origin <branch_name>
  • 关键:git push 是唯一将本地变更同步到远程仓库的命令。git add 和 git commit 都只在本地生效。

【关联/对比】

  • git commit -a vs 标准的 git add + git commit:
    • git commit -a 会自动将所有已跟踪文件的修改暂存并提交,相当于跳过了显式的 git add 步骤。但它不会添加未跟踪的新文件。在需要精细控制提交内容的场景下,不推荐使用。
  • Git 与 SVN 的提交差异:
    • Git:提交是本地操作,速度快,不依赖网络。提交的是项目的完整快照(虽实际存储为增量差异)。
    • SVN:提交是直接推送到中央服务器,是网络操作,速度受网络影响。提交的是基于上一个版本的差异列表。

『面试官追问』

  1. git add . 和 git add -A 或 git add --all 有什么区别?

    • git add .:添加当前目录及其子目录下的所有新文件和修改,但不会记录已删除的文件。
    • git add -A:添加整个工作区的所有变化,包括新文件、修改和已删除的文件。行为更统一,是更安全的选择。
  2. 提交信息(Commit Message)怎么写比较好?有什么规范?

    • 重要性:提交信息是项目的历史日志,良好的信息能极大提升代码可维护性。
    • 常见规范(如 Angular 规范):
      <type>(<scope>): <subject>
      // 空一行
      <body>
      // 空一行
      <footer>
    • Type(类型):feat(新功能)、fix(修复bug)、docs(文档)、style(代码格式)、refactor(重构)、test(测试)、chore(构建/工具变动)。
    • 核心要求:主题行简明扼要(50字内),使用祈使句(如“Add feature”而非“Added feature”);正文部分说明修改动机和与之前行为的对比。
  3. 如果提交后发现信息写错了,或者漏了文件,怎么修改?

    • 修改上一次提交:
      Terminal window
      # 修改提交信息,不改变文件
      git commit --amend
      # 修改提交信息,并加入新的暂存文件
      git add <missed_file>
      git commit --amend
    • 警告:--amend 会重写提交历史,如果该提交已推送到远程,强制推送(git push -f)可能会给协作者带来麻烦,需谨慎使用。
  4. 工作区、暂存区、版本库之间的关系是什么?

    • 这是Git最核心的概念。可以理解为“三棵树”:
      • 工作区(Working Directory):你直接看到和编辑的文件。
      • 暂存区(Staging Area / Index):一个虚拟的中间区域,临时存放你“准备提交”的修改。
      • 版本库(Repository):存放所有提交历史、分支、标签的最终数据库。
    • 流程:工作区 git add -> 暂存区 git commit -> 版本库。

总结陈述:一个标准的Git提交流程是 修改 -> status查看 -> add暂存 -> commit提交 -> push推送。理解暂存区的设计意图、每一步的底层对象变化(Blob, Tree, Commit),以及如何撰写规范的提交信息,是区分普通使用者和精通者的关键。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

# Git 和 GitHub 有什么区别?

6 min read

Git 是一个分布式版本控制系统,用于在本地管理代码的版本历史;而 GitHub 是一个基于 Git 的在线代码托管平台,提供远程仓库托管、协作工具和社区功能。

Read

Comments