文章

Git中的多人协作与贡献

介绍如何在多人协作中对本地仓库与远程仓库进行合理的管理,包括如何使用`fetch`等指令、如何提交与处理PR等

Git中的多人协作与贡献

关于Git的基本操作讲解,参考我对应的博客:Git入门基础知识汇总

一、多人协作

1.1 协作者的添加

  • 在仓库设置内可以通过邮箱添加Collaborators,这会发送邀请邮件给对方,参考该教程

1.2 克隆远程仓库

  • 此命令克隆的是几乎所有数据(包括日志信息,历史记录等)而不是仅仅复制工作所需文件,默认配置下每个文件的每个版本都将被拉取下来
1
git clone repo_url
  • 或者可以通过以下方式仅拉取目标仓库的单独某个分支
1
git clone -b branch_name repo_url
  • 拉取了单独一个分支后,如果项目有其他分支,则我们使用git branch -a时也能看到其它的未被克隆下来的远程分支
1
2
3
4
5
6
$ git branch -a
* branch_name
  remotes/origin/HEAD -> origin/master
  remotes/origin/branch_name
  remotes/origin/master
  remotes/origin/other_remote_branch

1.3 同步远程仓库

1.3.1 为何需要同步

  • 当一个本地仓库与远程仓库origin存在链接且同步时,本地的当前版本被主分支master的指针所指向,远程仓库内同样有一个master指针指向对应版本,该远程仓库的指针对应到本地仓库中就是origin/master指针,当本地与远程同步时,本地的masterorigin/master指向的版本是同一个,如下图所示

同步远程仓库P1.png

  • 若协作者往远程仓库的master分支推送了新版本,或者是我们自己在Github网页端对仓库的该分支做了修改,此时我们本地就和远程仓库产生了差异,我们若想继续提交,则需先进行同步

同步远程仓库P2.png

1.3.2 相同分支的同步(本地无更新)

  • 此时我们使用git fetch指令拉取相应分支的更改到本地,该指令只会将本地的origin/master指针更新到拉取下来的新版本上,此时本地的master指针仍然指向旧版本,故而工作区内容并不会发生改变

同步远程仓库P3.png

  • 若此时我们在master分支上使用git merge origin/master指令,就会将本地的master指针同步到远程分支指针origin/master指向的位置上

同步远程仓库P4.png

  • 上述两步操作可以通过指令git pull origin master一次性完成,同步仓库时我们应当依据场景和需求来选择性地使用fetchpull

1.3.3 合并前进行检测

  • 当使用git fetch origin master拉取更新后,
    • 我们可以使用git log origin/master查看远程分支origin/master的提交历史,来决定是否要与本地分支进行合并
    • 也可以在本地的master上,使用git checkout -b 本地新分支名 origin/master命令基于远程分支创建一个新的本地分支,将该分支作为测试分支用于合并origin/master分支后进行检测,在确认无误后方可将origin/mastermaster进行合并(记得删除测试分支)
  • 上述检测过程确保了本地仓库主分支的安全性,这也是一般不会直接使用二合一的pull的原因

1.3.4 相同分支的同步(本地有更新)

  • 假若远程仓库同分支master上有修改的同时,本地在该分支上也有修改,如下图所示

同步远程仓库P5.png

  • 此时我们进行fetch时,由于存在不同的修改,同步下来的远程分支origin/master与本地分支master就会相互岔开

同步远程仓库P6.png

  • 此时我们在本地的master分支上调用git merge origin/master指令就会将二者进行合并,此时的合并就可能会遇到冲突,遇到时直接进行处理即可方式和处理本地分支冲突一样,合并结果会被存放在一个新的提交内(上述两步骤仍然可以使用git pull一步直接完成)

同步远程仓库P7.png

  • 此时我们发现本地与远程的内容是不一样的,所以我们还需要将本地的内容推送到远程仓库,至此才算完成了同步

同步远程仓库P8.png

1.3.5 追踪分支的建立

  • 通过如下指令可以获取远程的指定分支,并创建与之关联的本地追踪分支(可以不同名,但建议同名,但若不写[local_branch_name],则本地新建的分支默认与远程分支同名),然后便可直接切换到该本地追踪分支进行其它操作
1
2
git fetch origin [remote_branch_name]:[local_branch_name]   
git checkout [local_branch_name]
  • 也可以直接通过如下指令一步到位上面的两条指令
1
git checkout -b dev origin/[remote_branch_name]
  • 我们可以使用如下指令来显示本地分支与远程分支的关联情况
1
git branch -vv

1.3.6 远程新分支的同步

  • 假设远程仓库的修改是新建了一个新分支dev,那么我们就需要在本地使用git fetch将远程仓库的所有分支的最新信息拉取到本地,此时本地就会出现一个origin/dev指针但是却未指向任何提交记录,因为此时本地不存在于其对应的分支
  • 此时我们创建一个与远程新分支对应的一个本地追踪分支即可将origin/dev指向该追踪分支
1
git checkout -b dev origin/dev
  • 如此一来新的分支dev便被同步到了本地仓库中

二、贡献的提交与处理

2.1 提交PR

  • 再Github中,若想为某个仓库做出自己的贡献,则需要先将该仓库Fork到自己的Github中,这样就形成了新的地址,然后克隆自己这个仓库的地址到本地,自己才有权限对其进行修改和推送
  • 修改完之后,便可在Github网页中自己的仓库处点击”Contribute”按钮进行Pull Request的提交

2.2 处理PR

本文由作者按照 CC BY-NC-SA 4.0 进行授权