版本控制
版本控制(Revision control):是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
1、本地版本控制系统
如:RCS
采用某种简单的数据库来记录文件的历次更新差异。
2、集中化的版本控制系统 CVCS
如:CVS、Subversion 以及 Perforce
通过一个单一的集中管理的服务器保存所有文件的修订版本,协同工作的人们都通过客户端连到这台服务器,checkout取出最新的文件或者commit提交更新。每个客户端本地只是保存一个版本的快照。
3、分布式版本控制系统 DVCS
如:Git、Mercurial、Bazaar 以及 Darcs
对于分布式版本控制系统,每个客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录。我们每一次的克隆操作,实际上都是一次对代码仓库的完整备份。当任何一处 ==协同工作用的服务器== 发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
分布式版本控制系统代码的提交与更新首先会通过本地代码仓库,本地代码仓库再提交到共享版本库(服务器);而集中化的版本控制系统是直接交给服务器来进行管理。
git可以指定和若干不同的远端代码仓库进行交互,即在同一个项目中,分别和不同工作小组的人相互协作。这在集中式系统中是无法实现的。
Git的基本知识
Git的工作原理
版本控制系统的原理,主要表现在对信息的存储和认知方式上。
基于差异(delta-based) 的版本控制
对于集中化的版本控制系统,它们以文件变更列表的方式存储信息,将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异。基于差异比较进行存储。
如下图,每个版本存储的是每个文件与初始版本的差异:
直接记录快照,而非差异比较
对于git,它是把数据看作是对小型文件系统的一系列快照。Git 对待数据更像是一个 快照流。
每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
如下图,分别为 File(A\B\C) 创建了一系列快照(A1\B\C1)。从 Version2 到 Version3,FileA在Version2中被修改,Version2中存储FileA文件的快照A1,Version3中FileA未被修改,Version3中存储了A1快照的索引。
Git的特点
每个客户端都有代码仓库的完整镜像
因为 Git 在本地磁盘上有完整的代码仓库,所以 Git 中的绝大多数操作都只需要访问本地文件和资源,不会有网络延时开销。用户可以在没有网络的情况下,几乎可以进行任何操作(包括 log,history,commit,diff 等等),直到有网络连接时再上传。Git强大的分支功能
可以指定和若干不同的远端代码仓库进行交互,即在同一个项目中,分别和不同工作小组的人相互协作。这在集中式系统中是无法实现的。Git 保证完整性
Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。Git 一般只添加数据
你执行的 Git 操作,几乎只往 Git 数据库中 添加 数据。 你很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容。但是一旦你提交快照到 Git 中, 就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
git 工作流程
Git的三个工作区域
工作区(Working Directory)
工作区是对项目的某个版本独立提取Checkout出来的内容。 这些从 Git 仓库的压缩数据库中提取Checkout出来的文件,放在磁盘上供你使用或修改。它对应的是你电脑上本地仓库文件夹(不包括.git目录),你将在里面完成文件的创建、编辑、删除、整理的所有工作。暂存区(Staging Area)
暂存区,也称为索引,是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。Git仓库Respository(.git Directory)
Git仓库,是 Git 用来保存项目的元数据和对象数据库的地方。它对应的是你电脑上本地仓库文件夹中的.git目录。
Git的基本工作流程
- 用户在工作区中修改文件
- 暂存文件,
git add <file>...
把变更过的文件添加到暂存区 - 提交更新,
git commit
找到暂存区的文件生成快照,将快照永久性存储到 Git 目录。
Git中文件的三种状态
已修改(modified)
表示在工作区中修改了文件,之后未做任何git命令操作,此时文件还没保存到数据库中。已暂存(staged)
对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。已提交(committed)
表示数据已经安全地保存在本地数据库中。
工作区中文件的状态
1、未跟踪(Untracked files)
既不存在于上次快照的记录中,也没有被放入暂存区。可以通过 git add
命令来跟踪一个新的文件。
2、已跟踪
指文件已被纳入版本控制,在上一次快照中有它们的记录。已跟踪的文件就是 Git 已经知道的文件。
Git操作中常用术语
1、工作树/区(Working)
工作区中包含了仓库的工作文件。您可以修改的内容和提交更改作为新的提交到仓库。
2、签出(Checkout)
从仓库中将文件的最新修订版本复制到工作空间
3、签入(Checkin)
将新版本复制回仓库
4、提交(commit)
把暂缓区的所有内容提交到当前分支(HEAD指针指向的分支)
5、分支(Branch)
从主线上分离开的副本,默认分支叫 master
6、合并(Merge)
将某分支上的更改联接到此主干或同为主干的另一个分支
7、冲突(Conflict)
多人对同一个文件的工作副本进行更改,并将这些更改提交到仓库
8、头(HEAD)
头是一个指针,指向当前所在的本地分支,默认指向master分支,可以通过HEAD指针来回切换分支
9、标记/标签(Tags)
Git 可以给仓库历史中的某一个提交打上标签,以示重要。比如:使用打标签来标记发布结点( v1.0 、 v2.0 等等)
10、修订(Revision)
表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。
11、锁(Lock)
获得修改文件的专有权限
Git基本配置
git config工具
git config工具是Git自带的工具,用来帮助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:
/etc/gitconfig 文件: 通过
git config --system ...
对该文件进行读写,包含电脑系统上每一个用户及他们仓库的通用配置。~/.gitconfig 或 ~/.config/git/config 文件:通过
git config --global ...
对该文件进行读写,该文件对当前系统用户所有 的仓库生效。本地某个仓库的.git目录中的config文件:cd到某个Respository,通过
git config --local ...
对该文件进行读写,该文件针对该Respository生效,也是该仓库默认使用的。
git仓库会从上面 3 -> 2 -> 1 就近使用git的配置变量。可以通过以下命令查看所有的配置以及它们所在的文件:
1 | git config --list --show-origin |
例如对本地仓库的基本配置:
1 | 配置用户信息,每一个 Git 提交都会使用这些信息 |
配置忽略文件
可以通过配置忽略文件把某些文件不纳入到版本控制中,比如数据库文件,临时文件,设计文件等。
忽略文件为 .gitignore
,存放在本地仓库文件夹(主目录)下,与 .git目录
同级目录下。
可以根据自己的需要去github上下载 https://github.com/github/gitignore
git命令获取帮助
以下我查看 git commit
命令帮助手册为例,通过以下几个命令方式查看,实际操作中任意选一个即可:
1 | 查看全面参考手册 |
学习博客
Pro Git book:git 官网文献资料
git-tips:11.9k,Git的奇技淫巧
一文讲透 Git 底层数据结构和原理:阿里技术公号
CyC2018/Notes
git flow 使用
Git原理简介和常用命令
意林的小站
Sourcetree Git 版本控制详解