Git_GitHub_03_远程库操作


上一篇文章介绍了本地库操作,有了本地库,接下来可以将其推送到远程库中方便多人协作开发。远程库依托于代码托管平台,本文采用的是GitHub。本文主要介绍Git和GitHub远程库交互,模拟团队协作

不要把GitHub想的多么复杂,简单地说,它就是一个代码托管平台,每个人都可以在上面创建自己的账户(相当于文件系统),每个人可以在自己的账户里面创建项目仓库(相当于PC端的本地库),因为有公网IP地址,所以方便多人连接,相当于中心节点。

和本地库操作一样,想要操作远程库,就需要在代码托管中心创建一个远程库。首先需要在本地创建一个本地库,然后在GitHub上创建一个远程库,之后从本地push到远程库。所有人都可以下载远程库的数据,即clone。但是只有团队的人才能提交推送到远程库。

1. 新建本地库

和上一篇文章中的操作一样,初始化,新建文件,提交到本地库。

新建本地库

2. 新建远程库

在GitHub上注册账号并登陆,手动创建一个仓库,并复制其HTTPS地址(在绿色的Code下拉菜单那里,也可选择其他地址方式)。这个地址就是用来本地库和远程库之间进行交互。但是每次如果都引用这个地址的话,有点太冗长,所以可以给地址起一个简短的别名。(如果和其他仓库也有联系,比如前面提到的团队之间的协作,这个时候,也可以起别名,总之就是和远程仓库之间有关联的,就可以进行起别名。一般来说自己的远程仓库起的别名是origin

新建远程库

别名指令如下:

  • git remote -v

    查看当前所有的别名以及对应的远程仓库地址。

  • git remote add 别名 远程仓库地址

    给指定远程仓库起别名。

  • git remote rm 别名

    删除指定的别名。

注意,在给远程仓库地址起名字之后,查看当前的仓库的别名,可以看到,其实一个别名有两条记录,也就是fetch和push。其中fetch是用来取回的,就是从远程仓库取到本地(就是把该仓库都取下来,自动初始化了);而push则是用来从本地库推送到远程仓库的。总之,这个简短的别名既可以用来推送到远程库,也可以下载到本地库。

远程仓库别名

3. 本地库推送到远程库

  • git push 仓库别名/仓库地址 本地库分支

    将指定本地库分支推送到指定的远程库,如果远程库有对应的本地库分支名,则推送到该分支,如果没有,则创建该分支。

如下图所示,有的时候显示GitHub的登录窗口,输入账户和密码即可。(本次是提示从浏览器中授权登录授权,有的时候是命令行形式)。之后本地执行push操作,可以推送成功。

本地库推送到远程库

本地库推送到远程库

本地库推送到远程库

注意,在bash的最后一行,从本地的master分支推送到远程库的master分支。因为本来没有这个分支,所以这是在远程库新建的一个分支。

4. 远程库克隆到本地库

我们在浏览GitHub的时候,看到了感兴趣的项目,这时候可以将远程库克隆到本地,自己进行开发。另外,如果团队新进来一个人,这个时候首先这个人就要将远程库克隆到本地,这样才能进行开发。

  • git clone 远程仓库地址

    将指定的远程仓库克隆到本地当前所在文件夹。(注意,就是把该远程库整体复制下来,并且分支、或者一些配置之类的都复制了;自动创建远程地址别名origin;并且自动初始化了本地库。

远程库克隆到本地库

克隆下来之后,就可以修改了,然后提交到本地库。如果想上传的话,必须是要改团队的人员,这个时候就需要在团队人员在远程库那里邀请你的本地登录时的GitHub账号,然后才能push。这里就不演示了,因为我之前已经自动授权了,所以默认就是我之前团队的GitHub账号,自然就默认push成功了。(凭据管理器中保存了账号和密码,这样就不会每次就手动输入了)。

凭据管理器

5. 拉取操作

上面的操作是克隆,把远程库完整的复制到本地库。那么如果本地库已经有了,只是想将远程库中其他人更新的部分“克隆”到本地该怎么操作呢?答案是拉取

在别人push到远程库之后,其他人就可以拉取操作了。拉取pull操作分为两步,fetch和merge。注意,这里的拉取以及子命令fetch和merge都是读操作,不需要验证身份啥的

抓取下来之后,其实本地文件并没有变,它只是下载到了本地库(就是将其作为一个分支下载到本地),还没有对本地库进行合并。(下载的分支是origin/master,但是查看当前分支,不会显式地显示该分支)。

  • git fetch 远程库 分支

    将指定的远程库的指定分支拉取到本地库。

fetch 操作

此时,切换到下载的分支:origin/master,查看文件,和远程库上的文件一样。

fetch 操作

这时候,就相当于之前说的分支合并了,直接切换到接收合并的分支,然后执行下面的指令。查看文件内容,果然内容合并了。

merge 操作

除了上面的操作,其实还要一种一步到位的操作,就是直接pull。(一般如果修改的内容比较少的话,并且不太可能产生冲突,就可以采用这种方法。否则,采用上面分步的那种方法,先fetch抓取下来,看看具体的内容,然后再手动合并merge

  • git pull 远程仓库 分支

    将指定的远程库的指定分支拉取到本地库,并将其分支合并到当前本地库所在分支。

pull 操作

6. 协同开发时冲突的解决

只要有团队开发,就一定会有冲突发生。比如两个团队成员修改同一个文件的同一个地方(至少有交叉修改的),然后其中一个人A先push的,那么另一个人B再push的时候,就会失败。因为Git那里会记录的,知道B是在原先的版本的基础上进行修改的,但是当前远程库的版本已经更新了,也就是说B不是基于目前最新版本的基础开发提交的,所以就会失败。

总之,如果不是基于远程库的最新版本所做的修改,不能推送,必须先拉取。拉取下来之后,如果进入冲突状态,则按照“分支冲突解决”操作即可。

所以后提交的人B必须先执行pull操作,即把最新的版本拉取下来并合并已修改的地方,如果是有冲突,则手动修改一下。

7. 跨团队协作操作

如果是跨团队的话,因为不是一个团队的,所以即使你clone下来也不能push回远程库,所以需要一种新的方法。可以先fork该远程库到自己的远程库,然后clone到本地库,修改之后,push到自己的远程库,之后再请求该远程库的所有人拉取pull即可。(即pull-request)。比如下面第二行显示了Forked from哪哪哪。

fork

本地库修改之后,提交到远程库。在对应的仓库,创建pull requests,发送(这里不需要指明发送对象,因为从哪里fork的就默认是发送到那里)。等对面接收请求同意即可。(对方也可以给你回话,即二人可以在此进行对话)

pull request

8. 备注

参考 B站《尚硅谷》。


文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录