记录更改:git add与git commit的区别和用法
通过之前的文章,我们学习了从安装Git到创建GitHub仓库,再到使用`git clone`将他人的仓库复制到自己电脑的全过程。现在,您已经站在了使用Git和GitHub进行开发的起跑线上。
本次,我们将聚焦于开发工作中最为常用的、用于记录更改的两个重要命令:`git add`和`git commit`。很多人容易认为“这两个不都是保存更改的命令吗?”,但实际上它们扮演着完全不同的角色。理解这两者之间的区别,是熟练使用Git的非常重要的一环。让我们来彻底掌握它吧!
Git的基本概念:再探三个“区域”
为了理解`git add`和`git commit`的区别,我们首先需要回顾一下Git基本工作流程中的“三个区域”这一概念。这个概念能够清晰地界定这两个命令的职责。
- 工作目录 (Working Directory): 您实际编辑文件的电脑文件夹。
- 暂存区 (Staging Area): 一个像“等候室”一样的地方,用于临时存放您希望提交(记录)的更改。
- 本地仓库 (Local Repository): 将暂存区中的更改作为正式历史(提交)进行记录和保管的地方。
如果用“购物”来比喻这个流程,可能会更容易理解:
- 在商店里逛,挑选商品(修改文件)(在工作目录中操作)。
- 把想买的商品放入购物车(使用
git add添加到暂存区)。 - 去收银台,为购物车里所有商品付款,确认购买(使用
git commit记录到本地仓库)。
ol>
- `index.html`: 添加一个`
`标签,或做其他任何修改。
- `style.css`: 添加`body`的样式,或做其他任何修改。
由此可见,`git add`是“放入购物车”的选择操作,而`git commit`是“确认购买”的记录操作,它们的角色完全不同。
`git add`的作用: “选择”要提交的更改
`git add`命令的主要作用是,从工作目录的诸多更改中,只挑选出希望包含在下一次提交中的内容,并将其发送到暂存区。为什么需要这额外的一步呢?
这是为了以有意义的单位来保留更改历史。举个例子,假设您同时进行了“修复页眉的一个拼写错误”和“实现新的页脚功能”这两项不同的工作。如果将这两项更改合并到一次提交中,将来回顾历史时,您可能会困惑“这次提交到底做了什么?”
这时`git add`就派上用场了。您可以先只`add`修复了拼写错误的那个文件并提交,之后再`add`所有与页脚功能相关的文件并作为另一次提交来记录。这样一来,您的更改历史就会非常清晰和整洁。因此,`git add`是提高提交质量的重要一步。
`git commit`的作用:“记录”更改
`git commit`命令的作用是,将暂存区中的所有更改,作为一个“存档点”永久保存在本地仓库中。这是Git版本控制的核心操作。
提交时,必须附带一条“提交信息 (commit message)”。这是一条简短的说明,用于描述该存档点“做了什么更改”。编写好的提交信息对于未来自己和其他团队成员理解历史记录至关重要。
git commit -m "修复了页眉的导航链接"
执行此命令的瞬间,暂存区的内容便被拍摄成一个快照,并与一个唯一的ID一同记录在仓库中。一旦提交,这段历史就不会消失,除非您刻意去操作它。
实践!add和commit的具体用法
那么,让我们使用`my-first-repo`文件夹,通过实际的文件操作来确认`git add`和`git commit`的行为吧。
准备:同时修改两个文件
首先,请编辑并保存`index.html`和`style.css`这两个文件。
在这种状态下执行`git status`,会报告有两个文件被修改了。
git status
情况一:只提交一个文件
设想一个场景:“我只想先提交HTML的更改”。这时,可以用`git add`只指定您想提交的文件。
git add index.html
此时查看`git status`,您会发现只有`index.html`被暂存了,而`style.css`仍然留在工作目录中。
[图片:git status的执行结果,其中index.html显示为绿色,style.css显示为红色]
在这种状态下执行提交。
git commit -m "更新HTML结构"
这样,就只记录了`index.html`的更改。再次执行`git status`,您会发现只剩下`style.css`的更改还未处理。
情况二:一次性提交所有更改
接下来,让我们把剩余的`style.css`的更改和新添加的`script.js`文件的更改一次性全部提交。首先,创建新文件。
echo "console.log('Hello, Git!');" > script.js
然后,使用`git add .`将当前目录下的所有更改(`style.css`的修改和`script.js`的新增)一次性添加到暂存区。
git add .
最后,将这些更改统一提交。
git commit -m "调整CSS样式并添加JS文件"
至此,所有更改都已记录,工作目录也恢复了干净的状态。执行`git status`应该会显示“nothing to commit, working tree clean”。