# Git 中如何暂存和提交更改?常用命令有哪些?

8 min read
Table of Contents

Git 中如何暂存和提交更改?常用命令有哪些?

Git 暂存与提交更改详解

【核心定义】

Git 暂存是将工作区的修改内容有选择地放入暂存区(Staging Area),而提交则是将暂存区的内容永久保存到本地仓库,形成一个可追溯的版本快照。

【关键要点】

  1. 暂存(Staging):使用 git add 命令将工作区的修改添加到暂存区,这是提交前的必要步骤。
  2. 提交(Committing):使用 git commit 命令将暂存区的内容保存到本地仓库,生成唯一的提交哈希。
  3. 状态查看:git status 显示工作区、暂存区的状态,git diff 查看具体修改内容。
  4. 常用命令组合:git add . + git commit -m "message" 是最基础的提交流程。

【深度推导/细节】

暂存区的设计哲学

暂存区是 Git 区别于其他版本控制系统的核心设计,它实现了精确提交控制:

  • 选择性提交:允许开发者从多个修改中挑选部分内容组成一个逻辑完整的提交。
  • 分阶段处理:将“准备提交”和“最终提交”分离,避免意外提交未完成的代码。
  • 临时存储:暂存区作为工作区和仓库之间的缓冲区,支持多次修改后一次性提交。

提交的原子性与信息规范

  • 原子性提交:每个提交应只完成一个逻辑功能,便于回滚和代码审查。
  • 提交信息规范:
    <type>(<scope>): <subject>
    <body>
    <footer>
    遵循 Conventional Commits 等规范提高可读性。

【关联/对比】

Git 与其他版本控制系统

  • SVN:无暂存区概念,直接提交到中央仓库,缺乏本地灵活性。
  • Mercurial:类似 Git 但命令更简单,暂存概念较弱。

相关命令对比

命令作用范围常用场景
git add <file>单个文件精确控制提交内容
git add .当前目录所有修改快速暂存所有更改
git add -p交互式暂存拆分大修改为多个提交
git commit -m直接提交简单修改
git commit -v详细提交查看差异后提交

【面试官追问】

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

    • git add .:添加当前目录及其子目录的所有修改(不包括删除的文件)
    • git add -A:添加所有修改,包括新增、修改、删除的文件
    • git add -u:只添加已跟踪文件的修改(不包括新增文件)
  2. 如何修改最后一次提交?

    Terminal window
    # 修改提交信息
    git commit --amend -m "新的提交信息"
    # 添加漏掉的文件并修改提交
    git add 漏掉的文件
    git commit --amend --no-edit
  3. 暂存区(Staging Area)在 Git 工作流中的具体作用是什么?

    • 作为工作区和仓库之间的缓冲区
    • 支持部分提交(partial commit)
    • 允许在提交前审查更改
    • 支持交互式暂存(git add -p)
  4. 如何查看暂存区和工作区的差异?

    Terminal window
    # 查看工作区与暂存区的差异
    git diff
    # 查看暂存区与最新提交的差异
    git diff --staged
  5. 什么情况下应该使用 git commit -a?

    • 自动暂存所有已跟踪文件的修改并提交
    • 相当于 git add -u + git commit
    • 注意:不会添加新增的未跟踪文件

【直击痛点】

关键数字与设计考量

  1. 提交哈希长度(40字符):SHA-1算法生成,保证全球唯一性,防止哈希冲突。
  2. 默认编辑器:Git 使用系统默认编辑器(如 Vim、Nano)编写提交信息,可通过 git config 修改。
  3. 提交信息行限制:第一行(主题行)建议不超过50字符,正文每行不超过72字符,便于终端显示。

常见陷阱与解决方案

  • 误提交大文件:使用 .gitignore 提前排除,或使用 git rm --cached 从仓库移除。
  • 提交信息错误:使用 git commit --amend 修改最近一次提交。
  • 漏提交文件:先 git add 漏掉的文件,再 git commit --amend。

【逻辑复现】

完整提交流程示例

Step 1:查看当前状态

Terminal window
git status
# 显示:修改了 file1.txt,新增了 file2.txt

Step 2:选择性暂存

Terminal window
# 只暂存 file1.txt 的修改
git add file1.txt
# 检查暂存区内容
git diff --staged

Step 3:提交暂存内容

Terminal window
git commit -m "修复file1.txt中的bug"

Step 4:处理剩余修改

Terminal window
# 暂存并提交新增文件
git add file2.txt
git commit -m "新增file2.txt功能模块"

交互式暂存流程

Terminal window
git add -p
# 对于每个代码块,选择:
# y - 暂存此块
# n - 不暂存
# s - 拆分更小的块
# e - 手动编辑

【版本差异】

Git 2.x 新增特性

  1. git add -p 增强:更智能的代码块分割算法。
  2. 提交模板:支持 git config commit.template 设置默认模板。
  3. git restore(Git 2.23+):更直观的撤销命令,替代部分 git reset 用法。
  4. git switch/git restore:分离分支切换和文件恢复操作,提高命令语义清晰度。

最佳实践演进

  • 早期:频繁使用 git commit -a 快速提交。
  • 现代:推荐使用 git add -p 进行精细控制,保证提交原子性。
  • 趋势:结合 GUI 工具(如 VS Code GitLens)可视化暂存和提交。

总结:Git 的暂存和提交机制体现了其“分布式”和“灵活控制”的设计哲学。掌握 git add 的各种参数和 git commit 的最佳实践,能够显著提高版本控制的质量和效率。在实际开发中,建议养成频繁提交、原子提交、规范信息的良好习惯。

My avatar

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


More Posts

# HTTP 1.0 和 2.0 有什么区别?

9 min read

HTTP/2.0 是 HTTP/1.0/1.1 协议的二进制、多路复用、头部压缩的重大升级版本,旨在解决 HTTP/1.x 时代因文本协议、队头阻塞和低效头部传输导致的网络性能瓶颈。

Read

Comments