Git 多人协作操作方法

一、开始之前,我们先介绍几个名词:

1. 源仓库:

在项目的开始,项目的发起者构建起一个项目的最原始的仓库,我们把它称为originorigin 就是这个项目的源仓库了.

源仓库有两个作用:

  • 汇总参与该项目的各个开发者的代码
  • 存放趋于稳定和可发布的代码

源仓库应该是受保护的,开发者不应该直接对其进行开发工作。只有项目管理者(通常是项目发起人)能对其进行较高权限的操作。

2. 开发者仓库:

上面说过,任何开发者都不会对源仓库进行直接的操作,源仓库建立以后,每个开发者需要做的事情就是fork一份源仓库,作为自己日常开发的仓库。

每个开发者所fork的仓库是完全独立的,互不干扰,甚至与源仓库都无关。开发者在开发者仓库进行开发,提交到自己的仓库中,这样就可以轻易地实现团队成员之间的并行开发工作。而开发工作完成以后,开发者可以向源仓库发送 pull request ,请求管理员把自己的代码合并到源仓库中,这样就实现了分布式开发工作,和最后的集中式的管理。

二、GitHub 多人协作开发

有三种方式:

  • 合作者方式
  • Fork & Pull request方式
  • 组织

下面我们详细介绍这几种方式:

以下演示中,源仓库地址为:

https://github.com/CoolCodeTribe/git-collaboration.git

源仓库有两个分支,一个master分支,一个dev分支。源仓库项目中只有一个 `1.txt 文件,文件中写入了一个数字1

开发者仓库为( fork 自上面的源仓库 ) :

https://github.com/IDeepspace/git-collaboration.git

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分支上开发,就必须创建远程origindev分支到本地,我们可以用下面这个命令创建本地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
(六)小结

因此,多人协作的工作模式通常是这样:

  1. 首先,拉取源仓库的代码到本地
  2. 在本地开发
  3. 可以试图用git push origin branch-name推送自己的修改;
  4. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  5. 如果合并有冲突,则解决冲突,并在本地提交;
  6. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
  7. 如果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为:

https://github.com/CoolCodeTribe/git-collaboration.git

(一)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是同步的,多个则不是同步的 )

  1. 进入你的GitHub发起Pull request

  1. 选择compare across forks

  1. 反向操作。base fork改为自己的,head fork改为原作者的
  1. 点击 create pull request

  1. 添加comment

  1. 点击create pull request

  2. 点击Merge pull request

  3. 确定

3.组织

组织的所有者可以针对不同的代码仓库建立不同访问权限的团队。

Accounts Settings => Organizations =>Create new Organizations 新建一个组织, 然后添加项目成员,根据提示设置完毕即可。

新建一个Repository 新建完毕后 进入Repository的Settings =>Collaborators 在Teams下面点击刚创建的组织 比如developer-51/owners

里面就可以添加或者remove组织成员

results matching ""

    No results matching ""