Tutorial from cs61B

1. 理解Git的不同视角

文件状态图

从状态视角理解git: 一个文件有4种状态, 状态转换如图所示

从存储视角理解git:

  • 工作区:电脑里能看到的目录
  • 暂存区(stage/index):一般存放在.git目录下的index文件中,保存所有staged files.
  • 版本库:.git目录就是版本库, 包含了git系统的所有信息, 当然也包含暂存区. 比较重要的信息包括每个版本的目录树(可以理解为工作区的一个版本)

首先理解清楚版本的概念:

图中的一个结点就是一个版本的目录树, HEAD是一个游标,指向一个版本(与版本库交互是通过HEAD指针). 不同分支如上图所示, 不过是版本链的分支.

object是实质存储文件内容的地方, 暂存区、版本等只是存储object中某位置的索引. 但为了直观理解, 我们不妨简单理解文件就存储在暂存区、版本中

接下来从存储视角理解几个git指令的作用:

初始时暂存区与工作区一致.

  • git add <file>:将工作区的file更新至暂存区

  • git commit:将暂存区的所有文件形成一个新的版本, 加入版本链并使当前分支的HEAD指向该版本

  • git reset:将HEAD指向的版本更新到暂存区,工作区不受影响。若添加--hard选项则同时更新工作区

  • git rm <file>:将暂存区和工作区的file删除. 如果加上--cached选项则只删除暂存区

  • git checkout <HEAD>: 用HEAD指向的版本替代工作区和暂存区(此时原来工作区中未add的改动和暂存区中未commit的改动).

    • git checkout -- <file>:用暂存区中的file替代工作区
    • git checkout -b|-B <new_branch>:创建一个新分支(新分支的HEAD指向原来分支HEAD指向的版本, 即上图的交点处)并切换过去(-B使得不存在就新建一个, 已存在就覆盖)
    • git checkout [--detach] <commit>:先把head指向commit, 然后按上述checkout HEAD进行更新. (HEAD之后的版本将被丢弃)

最新文章

  1. requirejs使用
  2. 对ASP.NET Cookie的一些新的认识
  3. 常用的MyEclipse快捷键
  4. ClusterWare 服务介绍
  5. iOS 错误及解决汇总
  6. jquery判断对象是否显示或隐藏
  7. lesson - 7 课程笔记 vim
  8. Python模拟登录成功与失败处理方式(不涉及前端)
  9. “百度杯”CTF比赛 九月场_Code(PhpStorm)
  10. 【WebGIS系列】Typescript+WebGL+Webpack开发环境搭建
  11. hbuilder IOS APP 打包与发布
  12. nginx系列5:nginx的请求处理流程
  13. JavaScript 特效之四大家族(offset/scroll/client/event)
  14. HQL实用技术
  15. 27.用webpack自搭react和vue框架
  16. Gradle 的下载安装配置以及创建第一个Gradle 项目
  17. 新版POI如何获取日期类型的cell的值
  18. 源码 time sleep
  19. SceneKit下关于修改SCNNode 的Shader展示自定义图形
  20. MongoDB Replica Set搭建集群

热门文章

  1. vue常用组件
  2. SpringBoot集成druid数据库连接池的简单使用
  3. lua语言:string
  4. iOS 启动画面 App图标尺寸 项目上架必须Icon设置
  5. 让我一时不知所措 Linux 常用命令 爱情三部曲 下部
  6. VUE项目部署到线上生产环境,Loading chunk xxx failed
  7. 模型融合——stacking原理与实现
  8. GitHub page创建
  9. C语言中各种输入函数之间的区别
  10. 微服务从代码到k8s部署应有尽有系列(二、网关)