git与svn

来源:互联网 发布:吸入麻醉药的mac 编辑:程序博客网 时间:2024/06/05 23:49

1     Git简介

1.1   Git发展史

同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。到 2005 年的时候,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统订了若干目标:

• 速度

• 简单的设计

• 对非线性开发模式的强力支持(允许上千个并行开发的分支)

• 完全分布式

• 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

因此,git诞生了。

1.2   其他版本控制工具

CVS

1、最早的开源、免费的集中式版本控制工具

2、自身设计有问题,会造成提交文件不完整,版本库莫名其妙损坏的情况

SVN

修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制工具

ClearCase

1、收费的集中式版本控制工具,安装比Windows还大,运行比蜗牛还慢

2、能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗或者人傻钱多

VSS

微软的集中式版本控制工具,集成在Visual Studio中

2     Git与SVN区别

2.1   使用上

l  检出代码:svn:checkout  git:clone

l  更新代码:svn:update    git:pull

l  提交代码:svn:commit    git:push

2.2   本质上

2.2.1 SVN代码提交


Svn属于集中式版本管理控制系统,存在一个中央版本库,系统中保存了所有文件的修订版本,而协同工作人员通过连接svn服务器,提取出最新的文件,获取提交更新。

所有的客户端将自己的代码上传到中央服务器,中央服务器的版本库会保存上传的各个版本的代码,并进行统一管理。这里注意,客户端本身是不存在版本库的,所以,如果中央服务器离线或宕机,则集中式版本控制则无法使用

集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。

SVN是一个增量式的版本控制,它不会将各个版本的副本都完整的保存下来,而只会记录下版本之间的差异,然后按照顺序更新或者恢复特定版本的数据。这使得服务端的存储量会非常低。

 

综上,SVN的特点:

1、存在服务器单点故障;

2、Check out代码,会将不同版本差异的代码最后综合到一起(V1+V2+V3+…Vn),该过程需要SVN需要计算,因此会增加服务器资源消耗(牺牲CPU开销,节省存储空间);

3、如果不是在局域网内,协同开发时需要联网;

4、SVN记录修改变化

 

2.2.2 Git代码提交


Git记录整体变化:Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接

这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。

 

操作本地执行Git:不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

 

数据完整性:在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。Git 使用SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及a-f)组成,看起来就像是:24b9da6552252987aa493b52f8696cd6d3b00373Git的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

 

综上,git特点:

1、分布式版本控制(共享、本地版本库);

2、不存在单点故障(本地版本库);

3、效率高(无需计算);

4、浪费磁盘空间(无所谓);

5、记录整体变化

 

3     Git工作原理

3.1   相关术语

l  工作区(Working Directory):仓库文件夹里除.git目录以外的内容

l  版本库(Repository):.git目录,用于存储记录版本信息

l  暂存区(stage):.git/index

l  分支(master):git自动创建第一个分支

l  HEAD指针:用于指向当前分支

3.2   Git执行流程


 

4     Window下git安装

4.1   略

参考安装文档。

4.2   简单命令

1、查看版本:git version

2、帮助文档:git help(列出所有命令的作用)

3、具体指令详细说明:git help xxx

5     Git模拟单人开发

步骤:

1、 在本地任意盘符的任意目录下创建一个文件夹:例如:tangseng

2、 将该文件夹作为git的本地仓库:进入该目录执行git init命令(在该目录下会产生一个.git的隐藏目录)

3、 创建一个文件:touch test.java

4、 查看该文件的状态:git statustest.java(如果不写文件名称则查看当前目录下所有的文件状态---终端显示的文件为红色:暂存态文件)

5、 将该文件添加到暂存区:git addtest.java(如果有多个文件我们可以直接通过git add .---将当前目录下所有的文件添加;我们可再次查看文件的状态,这时该文件变绿,表示已添加到暂存区.git/index)

6、 将该文件添加到本地仓库:git commit(提交失败,必须要添加注释信息:git commit -m “注释信息”.git/objects)

7、 查看操作该文件的日志:git logtest.java(不写文件名称则代表查看所有文件的操作日志)

8、 如果删除了该test.java文件,可通过该命令获取:git checkout -f HEAD

 

6     Git账号以及邮箱配置

说明:安装完git有默认的配置信息。例如:在win10该目录下的文件:C:\Users\阮文\.gitconfig

l  配置局部信息(.git/config)

1、git config user.name "Your Name"

2、git config user.email "you@example.com"

l  配置全局信息

1、git config --global user.name "Your Name"

2、git config --global user.email "you@example.com"

7     别名配置

7.1   增强版日志配置

说明:安装完git有默认的配置信息。例如:在win10该目录下的文件:C:\Users\阮文\.gitconfig

l  配置局部信息(.git/config)

1、git config user.name "Your Name"

2、git config user.email "you@example.com"

l  配置全局信息

1、git config --global user.name "Your Name"

2、git config --global user.email "you@example.com"

7.2   其他常见命令别名配置

说明:安装完git有默认的配置信息。例如:在win10该目录下的文件:C:\Users\阮文\.gitconfig

l  配置局部信息(.git/config)

1、git config user.name "Your Name"

2、git config user.email "you@example.com"

l  配置全局信息

1、git config --global user.name "Your Name"

2、git config --global user.email "you@example.com"


8     版本回退与撤销

1、文件执行commit操作:版本回退

l  回退到上一个版本:git reset --hard HEAD^(上一个:^;上两个:^^...)

l  回退到指定版本:git reset --hard 哈希值(前七位)

2、文件未执行commit操作:撤销

l  git reset --hard HEAD:回到当前最高版本

l  git checkout test.java:检出当前分支的最高版本

l  注意,如果修改了文件后,添加到暂存区,只能通过git reset --hard HEAD进行撤销

 

注意:关闭了终端,如何回退到具体的某个版本:通过git reflog:查看历史操作。


9     模拟多人开发

步骤:

一、项目经理:初始化git服务

1、在任意盘符下创建service目录;

2、在service同级目录下创建tangseng、wukong两个目录;

3、初始化git服务器:git init --bare;

 

二、程序员tangseng操作

1、进入tangseng目录下载代码:git clone d:/…/…/service

2、设置忽略文件:(github.com中搜索.gitignore):echo -e "Ctrl+C" > .gitignore(必须与.git在同级目录)

3、将.gitignore文件提交到远程服务器:

l  git add .

l  git commit -m “”

l  git push

4、创建main.java文件,并且提交到远程服务器

l  touch main.java

l  git add .

l  git commit -m “”

l  git push

 

三、新加入程序员wukong操作

1、从远程服务器下载(克隆)代码:git clone url

2、wukong修改文件并且提交到远程服务器:

l  编辑main.java文件

l  git add .

l  git commit -m “”

l  git push

 

四、产生代码解决

1、tangseng更新代码:git pull

2、tangseng修改代码并且提交远程服务器

l  编辑main.java文件

l  git add .

l  git commit -m “”

l  git push

3、wukong修改代码

l  编辑main.java文件

l  git add .

l  git commit -m “”

l  更新代码:git pull

l  产生冲突

 

五、冲突解决

1、wukong编辑冲突文件;

2、然后依次执行add/commit/push操作

3、tangseng获取最新代码

10         git分支管理

10.1git分支与svn分支区别

10.1.1          svn分支

l  truck(主干|主线|主分支):是用来做主方向开发的,新功能的开发应放在主线中。

l  branch(分支):分支开发和主线开发是可以同时进行的,也就是并行开发,分支通常用于修复bug时使用。

l  tag(标记):用于标记某个可用的版本,可以标记已经上线发布的版本,也可以标记正在测试的版本,通常是只读的。


10.1.2          git分支


l  主分支 master

l  开发分支 develop

l  功能分支 feature

l  预发布分支  release

l  bug 分支 fixbug

l  其它分支 other

10.2git分支使用

创建分支并且解决分支合并冲突:

1、创建分支:git branch bugfix

2、切换分支:git checkout bugfix (git checkout -b bugfix:创建分支并且切换)

3、修改bugfix分支下的代码并且提交:

l  编辑文件

l  git add .

l  git commit -m “”

4、修改master分支下的代码并且提交

l  编辑文件

l  git add .

l  git commit -m “”

5、合并分支:git merge bugfix(注意:必须是在master分支下操作)

l  文件出现冲突

l  编辑文件,解决冲突

6、删除分支:git branch -d bugfix

 

原创粉丝点击