1.1 概述
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器仓库“克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
当然国内也有git服务器:码云
公司内部往往会搭建自己的git服务器,可能选型为: gitlab
2. 设置SSH-Key
git本地库和 github 或 码云 之间传输,建议设置SSH key,避免在传输中反复输入密码
执行:
ssh-keygen -t rsa -C "邮箱地址"
然后一直回车即可 -C后"可以随意写一个,作为key的title而 已,无关紧要"最后:在
C:\Users\主机名\.ssh
目录下生产秘钥文件,
id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。登录GitHub,在账户设置中,选择 “SSH Keys” ,在Title中随便填写一个,在Key中填写
id_rsa.pub
文件中的所有内容即可。
这样和git服务器通信时(clone,push,pull)git无夫妻就可以识别出你的身份。识别出你是谁;你是否有权限访问某个远程库;你是否可以上传你的代码。
3. 关联远程库
将本地git库和远程github库建立关联。可以方便本地库和远程库的
push
和pull
# 添加远程库 远程库别名 库地址
git remote add origin git@github.com:zanghongjiu99/repo.git # 注意:origin是默认会有的别名
git remote add test git@github.com:zanghongjiu99/repo2.git # 还可以设置自己的别名
git remote -v # 查看关联的所有远程库
git remote show origin # 关联远程库后,本地分支和远程分支的对应关系
git remote remove origin # 删除关联
git remote rename origin origin2 # 重命名
4. Push
将本地master分支的内容上传到关联的远程库中,push结束后在github中可见
如果在你push之前有人向库中添加新的内容,则需要先pull再push否则会push失败
# 本地的master分支上传到与之有跟踪关系的远程分支中,(克隆时就会建立跟踪关系),如果远程分支不存在,则会建立远程分支
git push origin master
# 本地存在分支dev,上传到远程库origin的分支dev,如果没有dev,将建立远程分支dev
git push origin dev:dev
# 本地库dev:远程库dev 本地库dev2:远程库dev2
git push origin dev:dev dev2:dev2
# push动作,其一需要你有权限push,其二需要在你pull之后没人push过。(乐观锁机制)
5. Pull
等价于
git ffrth+git merge
拉取远程的新内容,并合并到当前分支
# 语法格式:git pull <远程主机名> <远程分支名>:<本地分支名>
# 完整写法
git pull origin master:master
# 省略本地分支名 = master:当前分支(缺省)
git pull origin master
# 省略本地分支名 = dev:当前分支
git pull origin dev
# 拉取远端origin的所有分支中的改变,并将属于当前分支的改变自动merge
git pull origin
6. Clone
下载远程库中的内容,注意clone操作会自动搭建关联,即上述的
3.关联远程
# 任意新建一个目录,并执行:
git clone git@github.com:zanghongjiu99/repo.git #ssh 地址,将远程库clone到本地,已设置key,不用口令
git clone https://github.com/zanghongjiu99/zhj_repo.git #https地址,需要输入github口令
细节:clone 只在初次从git服务器下载项目时执行一次,后续在需要同步应该执行
pull 或 fetch
当你执行git clone
命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
7. 协同工作流程
· 项目管理员(项目经理)
1> 由管理员负责创建一个远程库,初始的库中什么也没有,成为裸库,如5.2中所述。库的名称建议和项目同名
2> 管理员会在idea中创建一个空项目,其中包含
.gitignore文件
。 并在项目根目录下git init
. 建立本地库。并建立dev分支
。
3> 管理员将本地库同步到远程库:
git push 远程库地址 master:master dev:dev
4> 将其他开发人员拉入远程库的
开发成员列表中
,是的其他开发人员可以访问该远程库。
5> master分支设置为
protected分支
,只有管理员有权限将代码合并到其中。dev分支设置为常规分支
所有开发人员 都可以其中合并代码
-
开发人员
1> 初始化:在cmd或idea中
clone
远程库,获得项目。执行git clone 远程库地址
即可。会建立本地库2> 获得项目时,本地库中只显示master分支,需要执行:
git checkout dev
即可获得dev分支。3> 后续的开发中,都要在dev分支上进行。开发完一个功能并测试通过后就可以
git add ..
并git commit ..
提交到本地的dev分支中,然后git push 远程库地址 dev
同步到远程dev分支中。 是否需要在本地master中合并下?4> 注意如果在
git push
远程库时,有人比你早一步git push
,git服务器将拒绝你的git push
.(乐观锁原理) 不过很简单,你需要git pull 远程库 dev
,然后再git push
即可。后续的开发,会接到一个个的功能任务,往复操作 3> 和 4> 而已。
-
效果
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,
master
分支应该是非常稳定的, 也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再有管理员把dev
分支合并到master
上,在master
分支发布1.0版本;你和你的小伙伴们每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。所以,团队合作的分支看起来就像这样: