1. Git的好处
(1) 分布式,离线操作;
(2) 每日工作备份(非常安全);
(3) 异地协同办公;
(4) 现场版本控制;
(5) 避免引入辅助目录(比如svn老是有.svn这个隐藏目录);git只在顶层有一个.git;
(6) 可以吃后悔药;
(7) 工作进度随时保存(比如工作正在进行中临时去修改bug);
(8) 快。
2. Git简介
3. Git工作模型
(1) 集中式协同模型(大多数公司在用的模型);
双向箭头代表“可读可写”!
(2) 社交网络式式协同模型(Linux经典开发模型);
(3) GIT基本交互流程图(记住)
这里的Commit是提交到本地,然后再push到中央仓库中,每次中央仓库有更新,那么其他人就可以做pull操作了。
4. Git仓库初始化
5. Git的原理
Git操作步骤:
初始化仓库后的文件下的目录:
Head永远都是指向当前的分支;
如果做Commit操作,都会生成一个Commit对象,这个Commit对象包括Tree对象,Tree对象包括blob对象……并且每次提交都会记下Parent(根据这些关系就可以追溯到这些历史过程了)。
![](http://static.oschina.net/uploads/space/2014/1101/224128_ttm3_1273559.png)
Git操作原理:
每一次提交都是对应一个commit对象,一个commit对象包含一个ID、一个树对象、parent、Author,这样级级关联。
6. TortoiseGit和Git
(1) 先安装Git,其实用这个Git已经可以完成大部分的操作了,缺点是做任何事都要用命令行来操作;
(2) 为了解决在命令行下操作Git不方便的问题,可以安装tortoiseGit,就可以再图形界面来操作Git了。
【注意:】
1) 使用tortoiseGit的Add后,还要在TortoiseGit的Settings中设置用户名和邮箱(向服务器表明身份);
2) Add后就可以Commit了(此时Commit只是添加到本地);
3) push(此时是推送到公共服务器上);
(3) 注意,在使用TortoiseGit建仓库的时候要在目录下建以git为后缀的目录:
要创建一个工作区
对话框中的选框如果不选上的话,是当做一个工作区(在这里clone然后提交代码的)。所以要将这个对话框选上,这样就作为一个空的工作区,让别人来向这个空的工作区提交代码(也就是说,共享仓库必须建立成一个空的仓库)。
上面图中的目录是在下图中指定的(名字不是对应的):
(4) Git中如果user1做push操作出现“冲突”,原因是公共仓库中文件的内容和本地文件内容相同行的内容不一样,此时如果user1做pull操作,那么文件上就会出现“警告(叹号)”提示(此时可以使用“Edit Conflics”来进行文件对比);如果user1只是在文件上添加一些内容,那么做pull操作时就会自动合并内容。
——为避免冲突太多,养成更新代码的习惯(保持本地代码是最新的)。
7. Git和Eclipse整合
MyEclipse安装方法是Help –> Configuration ->SoftWare(视频中在Eclipse中安装,用的也是这个方法,不是通过拷贝插件安装的)。
下载Eclipse的git插件——EGit。下载网址http://download.eclipse.org/egit/updates-1.3/org.eclipse.egit-updatesite-1.3.0.201202151440-r-site.zip(注意我现在官网看到的最新的3.1版本myeclipse10中不能使用),把下载的插件解压出来,删掉XML文件。在MyEclipse的dropins目录下新建一个egit文件夹,然后把刚才解压的features、plugins和另外两个jar包全放进去。重启MyEclipse后,进入window-preferences-team,看到Git选项,就说明安装成功了。
8. CopSSH
9. Git经典协同模型
实际开发中,开发者不是将代码直接提交到中央仓库中的,而是提交到develop分支上去,待到一定的稳定阶段,才将代码发布到Master中央仓库中!
=======开发场景举例:=======
(1) master是主分支,现在从产品的0.1版本开始,新建一个develop分支1,开始进行开发0.2版本
(2) 到了阶段2的时候,原来的0.1版本在给用户使用的过程中发现了一个bug01,这时候就会从0.1版本上新建一个hotfixes(热补丁分支),来对应这个bug01;
(3) bug01解决后,在master主分支上新建一个新版本(打一个Tag)Tag0.2,并将修正后的代码,提交到Tag0.2上;——同时,将修复代码与develop分支上的代码进行(如阶段3处)合并(develop分支上有bug01);
(4) 到了阶段4,1.0版本的功能开发完成,这时候需要将代码发布到ReleaseBranch(发布分支)5上。ReleaseBranch用来对代码进一步做测试,确保代码的安全性。这时候ReleaseBranch继续,如果有bug就在ReleaseBranch上做修复,同时合并到develop上,与此同时1.0版本也是继续在develop分支上继续前进(比如从4阶段开始接着开发2.0版本);
(5) ReleaseBranch的阶段6发现没什么问题了,确实稳定了,这是才将代码合并到master分支上(打一个Tag1.0),同时合并到develop分支上
(6) develop左侧的feature branch(特性分支),用来在develop分支的基础上作特别开发的(比如分支A用来做高标准的安全校验、B用来做高效数据库查询),其中A、B分支可能失败可能成功,失败就丢弃,成功就合并到develop分支上;
10. 使用Git
1.
10.1. 本地模拟Git服务器:
1、 在本地模拟Git服务器:
安装好Git后,在Git同目录下建一个Repository,在Repository下再建一个git文件夹专门用来放git文件(之所以这样做,是可能这个Repository下也可以作为svn的仓库位置);
2、 初始化仓库
视频中右键有打开命令行的快捷键,我的没有,桌面上的bash默认是在C盘下, 可以通过cd ../../../d/ProgramFilesJava_Develop/Repository命令来到git的仓库中(D:\ProgramFiles\……)
使用命令git init --bare shared.git创建一个文件夹名为shared.git的文件夹(必须以.git为结尾),这是一个空仓库,shared.git文件结构:
【说明:】
hooks:钩子程序,用来控制commit、update等操作,可以定制一些操作事件;
info:有些文件或者目录不需要做版本控制,可以再这里做设置(其中的exclude文件);
objects:记录版本控制的信息;
refs:记录头、以及分支文件信息;
config:系统配置,比如记录用户名、邮箱等;
description:
HEAD:记录主分支最新的提交;
——综上所述,代码提交后的所有的信息都在shared.git目录下!
PPT内容:
3、 克隆项目
比如用户1(user1),在自己的目录(/user1)下可以使用命令来将项目文件克隆下来。
此时就会在user1下生成一个目录.git其中也有hooks、info等目录,在.git同级目录下就可以新建文件并且将文件上传了(先add、然后commit,还要设置username和email),如下操作:
4、 add、commit等操作原理
相关概念:工作区、暂存区、版本库
图形表示工作过程:
index文件就是暂存区(.git中没有发现这个文件)index是索引,然后内容(对象 )会存在objects中。
master代表分支、head指向要提交的那个分支。master中的内容也是记录在objects文件中。
10.2. TortoiseGit
上面都是用命令行来操作的,TortoiseGit可以再图形界面来操作。
1、 安装:
将TortoiseGit安装到D:\ProgramFiles\Java_Develop\目录下(和Git同级目录)
安装过程中:
2、
11. 用Git和GitHub
1.1. Eclipse克隆Github中的项目
右键、implort、git:
![](http://static.oschina.net/uploads/space/2014/1101/225430_7Yda_1273559.png)
![](http://static.oschina.net/uploads/space/2014/1101/225446_tFRV_1273559.png)
、12.1. 分享一个项目
项目、右键、Team、share:
到此为止,操作是在项目中创建一个.git文件目录!
项目、右键、Team、Commit:
项目、右键、team、remote、push:
![](http://static.oschina.net/uploads/space/2014/1101/225838_QmSW_1273559.png)
这里一定要点击“Force Update All Specs”!!!!
12. 用GitOS
跟github大致差不多,命令行是通用的。
也要公钥,公钥是通用的。
=========Again=========
版本控制:Reversion Control
1. 版本控制工具都有哪些
(1) CVS:开启版本控制之门;
(2) SVN:集中式版本控制之王;
(3) GIT:分布式版本控制的伟大作品;
2. GIT简介
1.
2.1. 简介:
Git是Linux的第二个伟大作品。
2005年有余BitKeeper软件公司对Linux社区停止了免费使用权,Linus迫不得已自己开发了一个分布式版本控制工具,从而Git诞生了。
目前使用Git作为版本控制的开源软件:
LinuxKernel
Android
jQueyr
RubyOnRails
Debian
Eclipse上使用Git的数量已经超过了SVN。
l Git的最大优点是“分布式”!
传统的SVN必须要链接服务器才能做提交代码等代码管理,比如在公司内部做开发,要连接公司内部的服务器,如果仅仅是内部开发,那么用SVN还是挺合适的。
但是,使用Git就可以在任何地方做代码管理,这就是“分布式”。使用Git时,我们每个开发者都在本地有一个仓库,远程上的服务器的“仓库”和本地的“仓库”是一样的。在没有联网的情况下,我们仍然可以“提交代码”——即提交到本地仓库中,在可以联网的时候,再往服务器上push即可。
从上可以看到,使用Git后我们就可以获取到完整的源代码——所以使用Git适合于开源软件开发,如果软件的安全级别很高,那么就不适合使用Git了。(相比SVN,SVN就可以做权限控制)。
2.2. 使用Git的好处
(1) 分布式;
(2) 每日工作备份;
(3) 异地协同工作;
(4) 现场版本控制:
——比如客户发现了bug,工程师现场解决bug后,为了防止后续版本有此bug,可以从根目录生成代码,然后将当前bug打成补丁,带回公司即可(这里没看懂……)。
(5) 避免引入辅助目录(比如SVN中有很多的.svn目录)
——Git只在顶层目录有.Git目录
(6) 可以做“撤销”操作;(sbash)
(7) 工作进度随时保存:
——可以随时停止当前的工作并保存,然后可以随时从上次保存的进度再随时开始(sbash)。
(8) 速度快(Git比SVN速度快得多)
2.3. Git的工作模型
Git的工作模型有两种:
(1)集中式协同模型(类似SVN);
(2)社交网络式协同模型。
1.
2.3.1. 集中式协同模型:
(SVN就是集中式协同模型)
(双向箭头表示可读可写)
2.3.2. 社交网络式协同模型
从图里可以看到,这里的箭头都是单向的,表示只读,写的话会有限制。
此图也是Linux的经典开发模型,只有核心开发人员才能提交代码,提交到核心仓库。
【注意:】
公司里,为了方便和简洁,一般都使用协同式开发模型,而不需要社交网络式协同模型(需要一级一级的审核)。
2.4. Git的基本交互流程图
【图示说明:】
开发人员使用Git的步骤:
(1) Clone:先从共享库中将代码复制(Clone)到本地;相当于svn的checkout
(2) 本地修改代码后做提交(Commit),这里的提交是提交到本地仓库(push操作是提交到远程服务器上);也就是书说,Git中要是提交代码要经过两步:1)commit提交到本地;2)push提交到服务器。
(3) 提交到本地后,就可以做push操作(将本地代码提交到共享库中)。
(4) 当有人向共享库中push代码,那么其他人就可以使用pull(相当于SVN的update)命令将代码拉到本地。
2.5. 开源项目工作流程图
3. GIT在windows上的安装与使用
(安装步骤参考文档)
1.
2.
3.
3.1. 仓库的初始化(模拟中央仓库)
【步骤:】
(1) 新建一个文件夹,这里命名为Git_Repository;
// --bare 表示空的
git init --bare publickShare.git
创建后文件夹中的目录:
【文件夹解释:】
l hooks:该文件夹包含一些事件函数,如pre-commit.sample(提交前)、post-commit.sample(提交后),我们可以定制一些命令,比如提交后发邮件通知相关人士。
l info:可以设置哪些文件不进行版本控制(要忽略的文件);
l objects:记录提交的信息(比如提交时候的写的mssage)
l refs:记录头和分支,标志你的分支指向哪个提交;
l config:系统配置,比如用户名、密码、邮箱等;
l description:项目的描述信息
l HEAD:指向当前分支的一个提交
3.2. 一些命令
在Git中,check out是切换的意思。
【常用命令】
// --bare 表示空的
git init --bare publickShare.git
// 查看当前目录下文件的状态(比如是否有未提交的)
git status
// add文件(比如要add一个a.jsp的文件)
git add a.jsp
// push 操作:将本地的master推送到远程的UserManage中
// 我们在config文件中可以看到远程服务地址有一个别名:origin
git push /reposistory/UserManage/ master
// 或者:
git push origin master
//git config命令有两个参数
//1、--system:操作/etc/gitconfig文件包含了适用于系统所有用户和所有库的值
git config --system
//2、--global:操作~/.gitconfig文件:具体到用户(这也是缺省值)
git config --gloabal
// 个人信息初始化
git config user.name="user1"
git config user.email="user1@163.com"
4. 客户端TortoiseGit的安装与使用
5. GIT与Eclipse整合
装EGit:略
配置用户:Preference》Git》Configuration》new Entry》通过配置key/Value设置用户名和密码。
从uriclone项目后,在项目上右键》import成在javaEE视图能看到的项目。
在Eclipse中编辑时候:
(1) 一个文件修改后会有一个>符号显示;
(2) Add后会显示灰色星号;
(3) 有的文件提交时有冲突:
1) 先pull显示冲突符号,然后右键MergeTool 》 选择Use Head……那个选项;
2) 然后标示已经解决冲突:右键》Team》Add to Index(加入到缓存区)
【Team下面有两个菜单:】
CompareWith -> Git Index:表示和暂存区中的内容(就是将文件add后)作对比。
-> HeadReversion:表示最新版本
ReplacWith -> 用指定的文件替换当前文件(可用来做恢复操作)。
6. 通过CopSSH搭建GIT服务器
7. GIT经典协同模型/分支分类
(思考:团队如何协作、代码如何管理)
1.
2.
3.
4.
5.
6.
7.
7.1. Git经典协作模型
l 中心仓库:包含master和develop两个分支;
l 分支的分类:
1) 主要分支有:master和develop分支;
2) 支特性分支:特性分支、发布分支、热补丁分支
l 经典协作图:(见上面开始看的)
l 项目已经默认有一个master分支,但是在开发中一般不在master分支上做开发,而是新建一个develop分支,在develop分支上做开发。
l 项目的maser分支,只有有了提交动作后才有master分支
【实例:】(在Eclipse中开发)
发布1.0版本:
现在开发一个项目,我们发布第一个版本,即1.0版本,这时候,我们可以给我们的项目打一个“Tag”——注意,如果一个版本是一个Tag,那么说明这个版本就是一个稳定的成熟的版本,是一个里程碑式的版本。
l 打Tag的方法:项目》右键》Team》Advanced》Tag
开发2.0版本:
(1) 开始开发2.0版本:开发的时候不要直接在mastert分支上做开发,而应该新建一个分支(比如新建一个名为dev的分支),然后在该dev上开发,切换分支:项目》右键》Swritch To 》new branch;
(2) 2.0版本正在开发过程中,突然1.0发现了一个很严重的Bug,需要立即修复。这时候领导找到正在开发2.0版本的员工1负责修复。所以此时,员工1结束当前2.0的开发:将代码做commit操作,对当前2.0开发的内容进行保存;
(3) 然后切换到1.0版本:项目》右键》Team》switch to》选择Tags/1.0版本,然后要基于这个1.0版本新建一个(比如名为v1.0_fixup)新的分支(即热补丁分支,也叫bug分支),在热补丁分支上做开发,然后做checkout,然后就可以在这个分支上修改代码了;
(4) 代码修复后,Add代码》提交代码(提交到本地分支上的),然后做一个1.1的Tag;(最后做push操作<另外一个视频是提交和push一起做的>)
(5) 将修复的bug整合到2.0版本中:将项目切换到dev分支,然后项目》右键》Team》Merge》选择Local/v1.0_fixup(视频中开始选Tags/1.1,有问题,后来就改从Local选了)
8. Android源代码管理方式
9. Git迁移
===教程二===
1. 使用tortoiseGit
【注意:】
同时使用TortoiseGit和TortoiseSVN会有冲突,文件显示的图标会不正常。解决冲突方法是卸载其中一个。
【步骤<基本操作>:】
(1) 首先创建中央仓库:
在某个目录下创建文件夹,作为仓库名:比如publicShareTortoise.git,然后在该文件夹中:右键 》 “Git create Repository Here”
(2) 然后在某个目录下右键使用Clone命令,将项目Clone下来,新建一个文件
新建文件的上面显示的图标会显示一个问号。
(3) 将新建文件先“add”,然后“commit”(这是提交到本地),然后push;
注意:push的时候,在某个文件上右键push是不行的,push必须是对整个项目的push,所以在空白处右键》push;
(4) 修改文件:修改文件后,再提交的时候,就不用Add这个 操作了,因为TortoiseGit的commit已经包含了add命令。
【解决冲突】
(1) 如果有冲突,push的时候,会提示“git did not exit cleanly(exit code 1)”
这时候,就可以做pull操作(这时候会自动合并,有的时候会自动合并,有的时候会提示“合并失败”);
(2) 如果“合并失败”,那么在合并失败的文件上,右键》TortoiseGit》Edit Conflicts
这时候进入文件合并界面:黄色可以忽略,红色必须解决!
(3) 解决冲突后,目录下会出现3个临时文件:冲突前基准文件、远程服务器上的文件、本地文件,右键》TortoiseGit》Resolve Finished,即标记为“已经解决”,此时就可以执行commit操作,同时临时文件自动删除。
【补丁】
(1) 用户1修改了本地文件,然后提交到本地仓库后(不要提交到远程服务器),然后在空白处右键》Create Pach Serialization,就会在当前目录生成一个补丁;
(2) 用户1将生成的补丁用邮件发送给用户2;
(3) 用户2在项目中右键》应用补丁,然后提交,然后再生成补丁发送给主开发者。
(4) 注意:如果用户2在应用补丁的时候,如果冲突、应用补丁失败,不要点击“Abort”关闭那个对话框,然后在冲突的文件上右键》Edit Conflicts