本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
- 参考安装Git 详细安装教程
- 参考视频B站 Git最新教程通俗易懂,这个有点长,感觉讲的精华不多
- 参考视频『Git』知道这些就够了_哔哩哔哩_bilibili,这个精华多,推荐看这个
- 参考视频7小时学会Git 基础全套完整教程(从入门到精通)_哔哩哔哩_bilibili,这个虽然长,但是他偏实践,对小白友好,特别有意思
- 附一个Git动画学习网站
- Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
讲讲小张的感受:我没有接触过Git,所以看了很多视频,对于入门使用确实只要知道git clone,git add,git commit,git push,git merge ,确实也就足够了。但是我很好奇背后的原理,为什么要用git add到暂存区而不是直接git commit?很多指令之间为什么要按一定的顺序执行?所以这个系列我以初学的时候,小白的角度从安装到工作原理(有的是我自己的见解,如果感觉不对,欢迎指正),再到实际应用!另外,推荐看一遍第三个参考视频,然后看一下第四个参考视频,对工作原理的讲解和实际应用确实不错!
一、Git基本理论(核心)
1.1工作区
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory) 就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
- Workspace: 工作区,就是你平时存放项目代码的地方
- Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息(.git 隐藏文件)
- Repository: 仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
暂存区、仓库区不需要管理,通过命令操作即可
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:
- Directory: 使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间
- WorkSpace: 需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间
- .git: 存放Git管理信息的目录,初始化仓库的时候自动创建
- Index/Stage: 暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区
- Local Repo: 本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)
- Stash: 隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态
Q:为什么中间多一个暂存区而不是直接提交到本地仓库?
A:使用git时候大多时候是
git add .一次性添加所有文件,我们习惯性新做一个功能就提交一次。但是如果做了许多个功能,我们就可以分别添加暂存区,分开提交。这样可以保证提交历史的清晰。否则,想要回滚历史的时候,根本分不清每个版本包含了哪些功能,修复了哪些bug。而暂存区的作用就是为了,可以选择提交,比如你在开发B功能的时候,发现A功能还存在Bug,这时候就需要先修复A中的Bug,然后先提交修复的A中的Bug,然后再提交B功能开发的文件。这样就可以提高提交版本历史记录的清晰,方便回滚。而提交是原子性操作,文件的选择就交于暂存区去做,每一次提交都是一个完整的功能开发,保证commit的干净,降低commit的粒度
1.2工作流程
1.2.1git的工作流程:
1、在工作目录中添加、修改文件;(eg:新建 小张.java)
2、将需要进行版本管理的文件放入暂存区域;(git add 小张.java提交JAVA程序或者git add .提交文件目录下所有程序)
3、将暂存区域的文件提交到本地仓库。(git commit暂存区文件提交到git仓库)
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
graph LR;
新建小张.java-->|git add 小张.java|暂存区;
暂存区-->|git commit|本地仓库;
本地仓库-->|git push|远程;
下一期介绍如何创建本地仓库