Question: commit 就 commit呗,为什么 commit 之前必须要 add 一下呢?
Answer:git commit 执行时,会提交暂存区的内容。git add 命令会将我们看到的修改添加到暂存区中,这就是为什么 git commit 之前要先执行 git add 的原因。
Other questions:add 将修改放入暂存区,那么 add 之前数据存放在哪里?commit 又将存储区的数据提交到什么地方了呢?以及为什么要这么分为几个存储部分?等看完这篇文章,希望你这些问题,都能找到答案。
Git 可以大概分为三个区
Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。
- 工作区(Working Directory)
是我们直接编辑的地方,例如 IDE打开的项目,记事本打开的文本等,肉眼可见,直接操作。 - 暂存区(Stage 或 Index)
数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流。 - 版本库(commit History)
存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程仓库了。
下面是,当开发者通过 git 修改数据时,各区之间的数据传递流程示意图。
对比三个区之间的数据差别
命令 | 作用 |
---|---|
git diff | 工作区 vs 暂存区 |
git diff head | 工作区 vs 版本库 |
git diff --cached | 暂存区 vs 版本库 |
Stage 赋予 Git 更多灵活性
不知道stage时,经常会遇到束手无策的场景。知道后,你一定会十分感动,十分膜拜 Git 的开发者- Linus Torvalds ,stage 就是这么的精彩。以场景,只要理解 stage, 用好相应命令,都能轻易解决:
- 修改了4个文件,在不放弃任何修改的情况下,其中一个文件不想提交,如何操作?(没add : git add 已经add: git reset --soft )
- 修改到一半的文件,突然间不需要或者放弃修改了,怎么恢复未修改前文件? (git checkout)
- 代码写一半,被打断去做其他功能开发,未完成代码保存?(git stash)
- 代码写一半,发现忘记切换分支了?(git stash & git checkout)
- 代码需要回滚了?(git reset)
- 等等
上面提到的 checkout & stash & reset 等命令,通过不同的参数搭配使用,可以在工作区,暂存区和版本库之间,轻松进行数据的来回切换。
结尾
暂存区是介于工作区和版本库之间的一个中间存储状态,很多命令都会涉及暂存区的状态,因此理解暂存区的存在是至关重要的。
网友评论