Git 多人协作操作方法
一、开始之前,我们先介绍几个名词:
1. 源仓库:
在项目的开始,项目的发起者构建起一个项目的最原始的仓库,我们把它称为origin
。origin
就是这个项目的源仓库了.
源仓库有两个作用:
- 汇总参与该项目的各个开发者的代码
- 存放趋于稳定和可发布的代码
源仓库应该是受保护的,开发者不应该直接对其进行开发工作。只有项目管理者(通常是项目发起人)能对其进行较高权限的操作。
2. 开发者仓库:
上面说过,任何开发者都不会对源仓库进行直接的操作,源仓库建立以后,每个开发者需要做的事情就是fork一份源仓库,作为自己日常开发的仓库。
每个开发者所fork
的仓库是完全独立的,互不干扰,甚至与源仓库都无关。开发者在开发者仓库进行开发,提交到自己的仓库中,这样就可以轻易地实现团队成员之间的并行开发工作。而开发工作完成以后,开发者可以向源仓库发送 pull request
,请求管理员把自己的代码合并到源仓库中,这样就实现了分布式开发工作,和最后的集中式的管理。
二、GitHub 多人协作开发
有三种方式:
- 合作者方式
- Fork & Pull request方式
- 组织
下面我们详细介绍这几种方式:
以下演示中,源仓库地址为:
源仓库有两个分支,一个master分支,一个dev分支。源仓库项目中只有一个 `1.txt 文件,文件中写入了一个数字1
开发者仓库为( fork 自上面的源仓库 ) :
1. 合作者方式
(一)clone远程 源仓库:
在clone之前,项目管理者需要将开发者添加为协作者。(教程中已添加)
Settings —> Collaborators —> add collaborator—>邮件通知—> 确定
终端进入你的电脑存放代码的目录,使用一下命令将源仓库中的代码clone下来:
$ git clone https://github.com/CoolCodeTribe/git-collaboration.git
当你从远程源仓库克隆时,实际上Git自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
,我们敲下命令看看:
$ cd git-collaboration/
$ git remote
origin
或者,用git remote -v
显示更详细的信息:
$ git remote -v
origin https://github.com/CoolCodeTribe/git-collaboration.git (fetch)
origin https://github.com/CoolCodeTribe/git-collaboration.git (push)
(二)在项目文件下开发并推送分支
前面讲了,Git自动把本地的master
分支和远程的master
分支对应起来了。
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
现在,我们在根目录下新建一个 2.txt
文件,然后执行下面的命令:
$ git add 2.txt
$ git commit -m "add 2.txt"
$ git push origin master
我们会看到源仓库中已经做了修改:
当然,我们也可以像上面这样,直接在本地的master 分支上做开发然后推送分支,我们也可以推送其它分支。
(三)推送其它分支
创建并切换到dev分支
$ git checkout -b dev
这时候我们使用git branch
命令查看下:
$ git branch
* dev
master
然后我们进行开发,在项目根目录文件夹下新建 3.txt
文件。
$ git add 3.txt
$ git commit -m "add 3.txt"
$ git push origin dev
我们看下源仓库:
这时候,因为我们并没有把dev分支和master分支合并,我们只提交了dev分支。所以,源仓库并没有直接被修改,但是多了一个分支(如上图红色区域)。
我们怎么查看并合并开发者推送的这个dev分支呢?我们点击一下上图红色区域的 2 branches
, 会看到:
我们看到了两个分支,点击 New pull request
:
点击 Create pull request
:
点击 Merge pull request
, 确定合并,然后我们在看看仓库代码,提交的dev分支上的 3.txt
已经合并到源仓库了:
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master
分支是主分支,因此要时刻与远程同步;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
(四)在本地创建和远程分支对应的分支并关联(可省略,视情况而定)
如果我们的源仓库有多个分支(其实上面已经多了一个dev分支了),当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master
分支,看不到dev分支。我们验证一下:
$ git branch
* master
只出现一个分支。现在,你的小伙伴要在dev
分支上开发,就必须创建远程origin
的dev
分支到本地,我们可以用下面这个命令创建本地dev
分支:
$ git checkout -b dev origin/dev
现在,他就可以在dev
上继续修改。然后,时不时地把dev
分支push
到远程:
$ git commit -m "your commit info"
$ git push origin dev
(五)解决冲突
现在我们可能会面临另外一个问题:
如果你新增了 3.txt
文件,你的小伙伴在你之前也新增了3.txt
, 并推送到master上了, 这样在合并的时候就会有冲突,该怎么办呢?
我们是这样做的:
- 执行
git pull
命令,把最新的提交从master分支上抓下来 - 手动解决冲突
- 解决后,提交,再push
(六)小结
因此,多人协作的工作模式通常是这样:
- 首先,拉取源仓库的代码到本地
- 在本地开发
- 可以试图用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功! - 如果
git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
我们总结下使用的命令:
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
2. Fork & Pull request 方式
这种方式的流程是这样的:
- 有一个主repo
- 每个人有一个私有的repo
- 每个人从主repo中fork一份代码到自己的私有repo中
- 拉取私有repo中的代码到本地,所有的修改都在私有repo中进行
- 发送pull request给主repo
- 主repo的所有者对提交上来的代码review后进行合并
我们具体看看这种方式如何进行(和合作者方式的操作步骤无任何关联):
主repo为:
(一)fork 主repo代码到个人私有repo中
教程中,我使用了另一个用户 IDeepspace
( 个人私有repo ) fork 了用户 CoolCodeTribe
用户(主repo)的代码。
(二)拉取私有repo中的代码到本地
$ git clone https://github.com/CoolCodeTribe/git-collaboration.git
(三)修改代码,并提交
我们在项目根目录下面新建 2.txt
文件,然后执行:
$ git add 2.txt
$ git commit -m "add 2.txt"
$ git push -u origin master
我们打开个人私有的repo, 会看到提交的更新:
每次的提交,并不会影响到主repo , 只在个人私有的repo中进行。
(四)发送pull request给主repo
点击上图中的 pull request
:
点击Create pull request
确认 Create pull request .
(五)主repo的所有者对提交上来的代码review后进行合并
然后我们可以在主repo中,看到有一条新的 Pull requests
合并——确认合并,这样我们就可以在主repo中看到新的更新了:
(六)保持私有repo与主repo同步
现在主repo的代码只最新的了,我们也要让自己的私有repo和主repo同步。怎么做呢?( 教程中只有一个私有repo提交,所以和repo是同步的,多个则不是同步的 )
- 进入你的GitHub发起Pull request
- 选择compare across forks
- 反向操作。base fork改为自己的,head fork改为原作者的
- 点击 create pull request
- 添加comment
点击create pull request
点击Merge pull request
确定
3.组织
组织的所有者可以针对不同的代码仓库建立不同访问权限的团队。
Accounts Settings => Organizations =>Create new Organizations 新建一个组织, 然后添加项目成员,根据提示设置完毕即可。
新建一个Repository 新建完毕后 进入Repository的Settings =>Collaborators 在Teams下面点击刚创建的组织 比如developer-51/owners
里面就可以添加或者remove组织成员