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
指针,当本地与远程同步时,本地的master
与origin/master
指向的版本是同一个,如下图所示
- 若协作者往远程仓库的
master
分支推送了新版本,或者是我们自己在Github网页端对仓库的该分支做了修改,此时我们本地就和远程仓库产生了差异,我们若想继续提交,则需先进行同步
1.3.2 相同分支的同步(本地无更新)
- 此时我们使用
git fetch
指令拉取相应分支的更改到本地,该指令只会将本地的origin/master
指针更新到拉取下来的新版本上,此时本地的master
指针仍然指向旧版本,故而工作区内容并不会发生改变
- 若此时我们在
master
分支上使用git merge origin/master
指令,就会将本地的master
指针同步到远程分支指针origin/master
指向的位置上
- 上述两步操作可以通过指令
git pull origin master
一次性完成,同步仓库时我们应当依据场景和需求来选择性地使用fetch
或pull
1.3.3 合并前进行检测
- 当使用
git fetch origin master
拉取更新后,- 我们可以使用
git log origin/master
查看远程分支origin/master
的提交历史,来决定是否要与本地分支进行合并 - 也可以在本地的
master
上,使用git checkout -b 本地新分支名 origin/master
命令基于远程分支创建一个新的本地分支,将该分支作为测试分支用于合并origin/master
分支后进行检测,在确认无误后方可将origin/master
与master
进行合并(记得删除测试分支)
- 我们可以使用
- 上述检测过程确保了本地仓库主分支的安全性,这也是一般不会直接使用二合一的
pull
的原因
1.3.4 相同分支的同步(本地有更新)
- 假若远程仓库同分支
master
上有修改的同时,本地在该分支上也有修改,如下图所示
- 此时我们进行
fetch
时,由于存在不同的修改,同步下来的远程分支origin/master
与本地分支master
就会相互岔开
- 此时我们在本地的
master
分支上调用git merge origin/master
指令就会将二者进行合并,此时的合并就可能会遇到冲突,遇到时直接进行处理即可方式和处理本地分支冲突一样,合并结果会被存放在一个新的提交内(上述两步骤仍然可以使用git pull
一步直接完成)
- 此时我们发现本地与远程的内容是不一样的,所以我们还需要将本地的内容推送到远程仓库,至此才算完成了同步
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
- 参考该教程中对PR处理的图解
本文由作者按照 CC BY-NC-SA 4.0 进行授权