利用Git和github进行协作开发
为了满足项目组各成员远程协作开发项目以及代码管理的需求,本文介绍了通过github建立远程仓库、Git进行代码版本控制的collaborator协作开发模式。
关于Git合作流程的collaborator模式和contributor模式的介绍,可以参考这篇博文。
一、在github上建立远程仓库
-
由leader在自己的github账号上新建一个仓库作为项目的远程仓库
填好仓库名、描述、是否公开等,然后点击创建仓库。
由于我勾选了默认添加一个README文件,因此仓库创建好后直接有个README文件。
-
添加组员为Collaborators
leader在仓库的settings的Collaborators一栏中添加项目的协作开发成员。
在弹出的输入框中输入协作者的github用户名、邮箱等来邀请他们加入项目开发。
然后协作者的邮箱会收到邀请协作的邮件,点击accept即可加入。
-
这样其他协作者就拥有几乎同样于仓库创建者即leader的权利,可以直接对项目进行“写”。
对于信任度较高或者重要性不强的合作小型开发项目,采用此种方式即可。
二、创建本地仓库
-
在本地新建一个文件夹作为本地仓库,如test_repo
-
进入该文件夹,右键选择“Git Bash Here”打开git终端
-
在终端输入
git init指令将本地文件夹变成本地仓库git init该文件下会出现一个隐藏文件夹
.git(git的控制文件,不要删除) -
leader可以通过
git clone指令从github远程仓库克隆项目代码。如下图,复制仓库的地址。在git终端执行
git clone 仓库地址 -
进入clone下来的文件夹,发现当前本地分支为
main -
执行
git checkout -b dev指令在main分支下新建dev本地分支并跳转到dev分支下git checkout -b 分支名注意:
-
如果只是在本地仓库创建本地分支而不跳转则执行:
git branch 分支名 -
若要跳转到某分支,则执行:
git checkout 分支名 -
查看本地分支,执行:
git branch星号(*)表示当前所在分支。
-
查看全部分支(包括远程分支和本地分支),执行:
git branch -a
关于项目开发中分支的常用命名及作用可以看这篇博文
-
-
在本地
dev分支下创建一个文本文件a.txt -
执行
git add *指令添加当前目录(包括子目录)下的所有文件改动到暂存区git add * -
执行
git commit -m "提交信息"指令提交暂存区到本地仓库中。git commit -m "提交信息"提交信息建议每次提交时按照统一的规范填写,能够描述此次提交的作用。
-
此时如果直接执行
git push将本地仓库推送到远程仓库是会报错的:这是因为上面只是在本地创建了一个
dev分支,远程仓库可能并没有dev分支或者有但是没有与本地仓库的dev分支相关联。在clone的过程中,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,本地的
main分支自动连接到远程的origin/main分支。但其他没有对应关系的分支就需要手动设置了。-
若远程仓库没有
dev分支,则执行:git push -u origin dev或
git push --set-upstream origin dev-
该指令先把本地的当前分支推送到远程仓库origin的
dev分支(远程没有就自动创建dev分支),然后把本地的当前分支关联到远程仓库origin的dev分支。(在推送的同时,设置upstream。) -
实际上
git push -u就是git push --set-upstream的缩写版本。 -
origin,就是远程仓库的别名,github把远程仓库的名称默认称为origin。
-
upstream 是指本地分支与远程仓库中的分支之间的流通道,建立流通道就是建立本地分支与远程分支的关联。建立之后,后续就可以直接使用
git push指令把本地分支的commit推到远程分支中。 -
在设置了本地分支的upstream后,之后在该分支pull或push就可以直接执行
git pull或git push而不需要指定远程分支。
此时到github中就可以看到远程仓库里也出现了
dev分支,且该分支里有了我们刚刚push上去的a.txt文件。 -
-
若远程仓库和本地仓库均有
dev分支,只是没有关联起来,则可以只执行:git branch -u origin/dev或
git branch --set-upstream-to=origin/dev当然,这种情况也可以使用
git push -u origin dev。
-
-
其他协作者可以根据自己负责的功能模块,以
dev分支为基线,创建对应的feature/xxx分支来作为自己这一功能模块的分支。比如负责用户信息模块的成员可以在dev分支下创建feature/user分支,然后在此分支编码并上传。注意:创建新分支前记得先
pull最新的代码,然后再创建分支。 -
若完成某一功能模块的编写,需要合并分支,则用到
git merge指令-
切换到你要合并到的目标分支,比如想将本地的
feature/user分支合并到dev分支,则先切换到dev分支:git checkout dev -
然后执行pull最新的代码:
git pull -
合并分支:
git merge feature/user
注意:如果合并出现了代码冲突(两个分支对于同一个文件的同一个部分是不同的),需要人工手动处理完冲突后再合并。
关于Git合并分支的原理可以看这篇博文。
-
-
最后leader逐步将各个功能模块的分支merge到
dev分支,然后将dev分支merge到main分支。-
dev分支上的代码达到上线的标准后,要合并到main分支:git checkout dev git pull git checkout main git merge dev git push -u origin main -
若
main分支代码改动了,需要更新到dev分支上的代码:git checkout main git pull git checkout dev git merge main git push -u origin dev
-
三、其他常用的git操作
-
删除分支
-
删除本地分支
当一个分支被推送并合并到远程分支后,执行指令:
git branch -d 分支名注意:
- 当你还在该分支上时,git不允许删除该分支,必须先切换到其他分支。
- 如果一个分支还没有被推送或者合并,那么可以使用
-D强制删除它。
-
删除远程分支
执行指令:
git push origin --delete 远程分支名或
git push origin :远程分支名
-
-
查看本地分支的upstream信息
git branch -vv后面那个蓝色的是该本地分支关联到的远程分支。
-
不切换分支直接设置其他分支的upstream
git branch -u origin/test test或在push时直接设置:
git push -u origin test:test比如上面在本地
dev分支直接设置test分支的upstream。 -
取消upstream
-
取消当前分支的upstream
git branch --unset-upstream -
取消其他分支的upstream
git branch --unset-upstream 分支名
-
-
查看工作区当前状态,显示有变更的文件
git status -
从远程获取代码库,但不进行合并操作
git fetchgit pull相当于git fetch+git merge -
比较文件的不同,即暂存区和工作区的差异
git diff -
查看远程仓库信息
git remote -v -
将远程仓库与本地仓库关联起来
git remote add origin 远程仓库的url
四、注意事项
-
多人在同一代码仓库开发时,会经常遇到代码冲突的问题,操作时需要注意如下事项:
- 新建分支之前,一定要先
pull最新的代码,然后再创建分支 commit之前,要先将代码add到暂存区,以免代码没有被提交commit之后,要先pull一下当前分支的最新代码(如果多个人公用一个分支开发)- 如果要将当前分支合并到分支B,先要切到分支B,
pull最新的代码再合并 - 合并分支如果有冲突,必须先在本地解决完冲突,再
add和commit代码 - 最后再进行
push
总之,不管是提交代码还是合并代码,
push之前,都要先pull一下,确保当前分支是最新的代码。否则可能出现陈旧代码被push上去覆盖了远程仓库的较新的代码。前期不确定的话,记得及时备份自己负责模块的代码。 - 新建分支之前,一定要先
-
某次修改后push的流程严格遵守:
git add->git commit->git pull->git push若pull下来有冲突则先协商解决完冲突再重复上述流程直至没有冲突成功push。
关于工作区、暂存区、本地仓库、远程仓库的含义和区别,可以看这篇博文。
-
GitHub仓库页面可以直接手动添加远程分支。
-
尽量保证相关联的远程分支与本地分支命名相同,比较方便。
-
commit时养成写规范的提交信息的习惯。