站内链接:

Introduction

版本控制系统(VCS),集中版本控制(CVCS), 分布式的版本控制系统(DVCS)。

Introduction

一个记录一个或者若干个文件的内容变化,以便于将来的查阅、回退、修订等等操作的系统,两句话:

  • 游戏存档
  • 全程监控(你的所有合法操作、非法操作)

版本控制基于如下的需求进行衍生变化:

  • 需求 1: 备份还原, 进行版本回退
  • 需求 2: 协同修改, 以便能更好的进行代码合并
  • 需求 3: 权限控制, 确保代码安全, 对代码进行分级

版本历史:

  • 最古老的版本备份: 复制整个项目并重命名为其他目录, 或者备份时间, 例如数据库备份
  • 本地化版本备份: 利用简单的数据库来记录文件的历次更新差异
  • 集中化版本控制: 单一的集中管理的服务器, 协同开发, 客户端获取最新版本
  • 分布式版本控制: 客户端不仅仅获取文件快照, 而且将代码仓库镜像到本地, 每一次 clone 都是完整备份

版本控制是一种理念, git 和 svn 则是版本控制的工具.

Git Feature

git feature

Subversion and Other:

不同于 git, 此类版本控制以文件变更列表的方式存储信息, 即以增加的形式, 相当于
本地化版本备份的分布式版本, 每一次文件改变, 会在新的版本中记录文件的 diff. 这样,
虽然占用的空间更小, 但是以损害速度为代价, 不同于 GIT 的应用场景.

具体图解: subversion file diff

Git:

git 将数据看做是对小型文件系统的一组快照, 就是最老的版本备份, 一旦文件发生改变, 就会备份一份新的快照, 否则仅仅是将索引指向之前的文件. 以空间换取数据.
其中 git 会在.git 的 object 中定期优化, 保证存储空间, 读取时间的平衡.

具体的图解: git snapshot

PS: 所以不建议备份大数据, 而且经常变动的.

通用工作流程

参考下面和第五节的介绍

工作目录中修改文件(工作区)—-》对修改文件进行快照处理(stage)—-》提交更新到本地仓库中(HEAD)

Workflow

工作流

local: 本地工作目录分为 3 个部分:

1
2
3
工作目录:          持有实际文件,相当于真实的现有磁盘上的文件所在地
暂存区: 缓存区,临时保存你的动作,动作都会关联此区
HEAD: 本地仓库所在地,其中HEAD指向最后一次commit结果, 一个指针

HEAD: 切换分支(更改 HEAD 指针指向): checkout

repository: 命令说明见笔记: 说明.

简单的数据库,包含用来维护和管理项目的修订版本、历史信息。

版本库有两种形式:

  • 本地仓库:每一个开发者自己独有的私人空间,可以在仓库中进行添加、删除、重命名等等操作,它本身就是一个代码库
  • 远程仓库:托管在因特网或者其他网络中的某一个项目的版本库(repsitory),多人协作完成该版本库的更新操作

Command: 具体见笔记说明.

暂缓区(stage/index)

Introduction

GIT 索引是介于工作目录到本地 GIT 目录间的暂存区域,你可以在任何时间修改你的内容,
此时你的所有操作都是在本地缓存中进行的操作,直到 commit 到本地 HEAD 中。

换言之,你在某一个杭州(branch)捡了一毛线,到你将一毛线交给杭州警察叔叔,
杭州警察厅将你的档案记上光荣一笔为止,你所处的时间、地点、动作。更加生动的解释,
这是一个码头,我在码头等我的妹子。

status

看看你自己到底干了多少好事,干了多少坏事.

1
2
3
changes to be committed (staged):提交到stage/index中,未存储到本地GIT目录的状态
untracked:未纳入版本控制的文件(干的好事太多了,都忘了,会吃亏的)
modified:有将工作区的修改提交到本地git仓库(杭州警察厅)

Legend

缓冲区

Branch

Diagram

branch

Classify

功能分类: 长期分支(主分支),特性分支(用于实现某种特殊某地)

位置分类:

  • 远程分支:remote branch,远程仓库中的分支的索引信息,无法在本地移动的本地分支
  • 本地分支:当前本地仓库中拥有的所有分支
  • 跟踪分支:tracking barnch,从远程分支 checkout 出来的本地分支,在管控范围内

tracking

tracking branch 是持续的保持和 remote branch 联系的的本地分支, 又名跟踪分支, 在跟踪分支中输入某些简短的命令, GIT 会自行判断其他参数(默认值).

在 clone 一个仓库时, GIT 会自动创建一个名为 master 的分支来跟踪 origin/master.

另见中的 Upstream 说明.

1
2
3
git push :GIT会自动推断向哪一个server的某一个branch推送数据
git fetch:Git会获取所有的远程索引,仅仅是索引和文件信息,无法启动编辑
git pull:git fetch + merge

tracking: 利用 gitconfig 中的 merge 来指明合并的双方, 即默认值; 利用 gitconfig 中的 fetch 来指定远程分支(origin)的来源, 即默认值;

pull command:

  • git fetch 获取 origin 的所有更新
  • 指定 merge 动作,如果指定 not-for-merge 则不会有下面的 merge 动作
  • 默认分支:当前分支
  • 默认来源:如果有 tracking,则自动读取配置(origin),否则必须指明来源

Tag

轻量级标签和注释标签,后者有更加详细的信息,所有 tag 命令见 git tag -h 的输出.

git/https 方式

Intro

在 github 网站上,对于任何项目,游客身份登录时,一般使用 https 方式获取代码,
本人的项目一般使用 git 方式获取代码,不同的协议有着不同的用途和目的.

https

命令:git clone https://…

说明: 用于授权访问

git

命令: git clone user@git.example.com:/opt/git/my_project.git
说明: 用于无授权访问

submodule