上篇文章重点介绍了分支的操作,包括创建分支、合并分支和冲突的解决。这样,关于本地库的基本操作就讲解完了,本篇文章将对本地库与远程库之间的交互作一个讲解。
创建GitHub账号
对于远程代码托管中心,我们有两个选择:码云和GitHub,这里我以GitHub为例进行讲解。
大家先注册一下GitHub的账号,官网地址:https://github.com/ 具体注册步骤就不介绍了,非常简单。
如何创建远程库
注册完成后我们登录自己的账号,进入主页:
这是我的主页,下面介绍如何在GitHub中创建远程库。
你可以点击左边的绿色按钮新建仓库,也可以先点击右上角的加号,然后点击New Repository新建仓库。
然后跳转到该界面:
仓库名必须填写,仓库描述可填可不填,这里勾选公共仓库,因为GitHub中的私有仓库是收费的,然后初始化README文件我们也不选,直接点击绿色按钮完成创建。
这样仓库就建好了,里面没有任何东西。
如何将本地库推送到远程库
创建好远程库后,我们重新创建一个本地库来进行测试(仓库名为TestGitHub):
本地仓库名不用非得和远程仓库名一致,但为了区分,通常都设置为同一个名字。
这样本地库和远程库都创建好了,接下来如何将本地库推送到远程库呢?我们需要获取远程库的地址,复制如下内容:
这就是远程库的地址,通过该地址我们就能够将本地库推送上去。
在TestGitHub文件夹内启动Git终端,先初始化仓库,然后提交一下内容:
这里有一个地方前面忘了说了,顺便提一提,当工作区的文件特别多的时候,采用git add [文件名]的方式显然太麻烦了,这时候我们可以使用指令git add .
来将当前目录下的所有文件添加到暂存区,注意add
和.
之间有一个空格。
提交完成后,我们就能通过远程库地址将本地库推送上去了,执行指令:
代码语言:javascript复制git push https://github.com/blizzawang/TestGitHub.git master
push表示推送,push后面跟上远程库的地址,地址后面写上需要推送到的分支,因为是新创建的本地库,只有master分支,为了与本地库对应,在远程库也创建master分支。
执行指令后,会弹出该页面让你输入用户名和密码,正确输入点击Login即可。
这样就表示推送成功了,我们回到GitHub页面,刷新一下网址:
当提交操作特别频繁的时候,经常粘贴远程库地址显然又费力又容易出错,为此,Git提供了一个方式,可以给远程库地址起一个别名。
我们可以先使用该指令查看一下目前是否有设置别名:
代码语言:javascript复制git remote -v
发现终端是没有任何反应的,下面执行该指令对远程库地址起一个别名:
代码语言:javascript复制git remote add origin https://github.com/blizzawang/TestGitHub.git
add后面跟上别名,一般起的别名即为:origin。
别名后面跟上远程库地址,再次查看是否设置了别名:
这次就有了,我们可以通过别名来推送本地库了,指令如下:
代码语言:javascript复制git push origin master
这里的origin就代表了一长串的远程库地址。
如何将远程库克隆到本地
学会了如何键本地库推送到远程库,我们还需要掌握如何将远程库克隆下来,重新创建一个文件夹,作为另外一个工作区(名字为TestGitHub_2):
此时我们在该文件夹下启动Git终端,然后执行指令:
代码语言:javascript复制git clone https://github.com/blizzawang/TestGitHub.git
clone后面跟上需要克隆的远程库地址。
如果不知道远程库地址,可以在这里找到:
执行结果:
这样克隆就完成了,我们查看一下TestGitHub_2文件夹:
整个项目就下来了,同时该项目还携带了.git目录,就无需我们自己去初始化仓库。
克隆项目到本地有三个效果:
1.完整地把远程库下载到本地2.创建origin远程库地址别名3.初始化本地库
克隆完成后,我在克隆下来的项目中新建一个test111.txt文件模拟开发过程:
接下来我们提交一下该操作:
提交完成后,我们尝试着将该本地库推送到远程库,执行指令:
代码语言:javascript复制git push origin master
此时又会弹出登录界面让我们输入用户名和密码,这里我再输入另外一个账户模拟另外一个开发者的身份:
按照之前的想法,这个开发者还没有加入到项目团队中,是不能直接进行推送的,看执行结果:
邀请其它开发者加入项目团队
要想让其它开发者能够将本地库推送到远程库,我们得让该开发者进入项目团队,来到GitHub网页:
点击仓库中的Settings进入设置页面:
先点击左边的Manage access,然后点击下方的绿色按钮,此时弹出一个搜索框:
在搜索框内输入另外一个账户的用户名,下面就显示出了该用户,然后点击该用户:
接着点击加入项目。
还没完,在底下点击如下按钮:
就复制到了邀请链接,此时把邀请链接发送给你准备邀请的人,让对方访问该链接就可以了,这里我是自己演示,所以我切换成了另一个GitHub账户然后访问该链接:
点击接受即可。现在我们以另一个开发者的身份重新推送一下本地库:
推送成功,刷新GitHub页面:
新操作也进来了。
会发现,第二次推送的时候系统并没有要求我们去输入用户名和密码,其实是系统自动帮你记录了:
如果想切换账户,把原来的凭据删除,下次推送就又会让你输入用户名和密码了。
如何拉取远程库
我们暂且将最开始推送远程库的开发人员称为程序员A,另一位开发人员称为程序员B。
那么现在的情况是,程序员B克隆了程序员A的远程库到本地,并在本地进行了修改,然后推送到了远程库。
此时程序员A若想得到程序员B修改的代码,就需要从远程库进行拉取代码。
首先我们需要回到程序员A的工作区,即:TestGitHub文件夹。在该文件夹下启动Git终端,执行指令:
代码语言:javascript复制git fetch origin master
执行结果:
该指令会将指定地址的远程库下载到本地,但是这个时候工作区的文件内容是没有改变的,可以查看工作区:
它将下载的内容放到了一个名为origin/master
的分支上,你可以切换到该分支看看是否和远程库一致,这里我就不演示了。
所以我们还需要一个合并的操作,执行指令:
代码语言:javascript复制git merge origin/master
查看工作区:
拉取成功。
Git还为此提供了一个更加方便的拉取方式,指令为:
代码语言:javascript复制git pull origin master
执行该条指令相当于先执行了fetch,然后执行merge,两者合并为一次操作。
解决合并冲突
在讲解本地库的分支操作时,我们便介绍了该如何去解决合并所产生的冲突,这里的协同开发同样可能会产生一系列的冲突问题,解决方法是类似的。
举个例子,程序A对项目中的test.txt文件进行了修改:
修改完成后,我们把本次操作提交一下:
提交完成后,把本地库推送到远程,执行指令:
代码语言:javascript复制git push origin master
此时查看远程库:
推送是成功的。
然后程序员B也对test.txt文件进行了修改:
同样将操作提交一下:
我们再让程序员B进行推送:
代码语言:javascript复制git push origin master
此时终端就报错了:
这是因为你所推送的内容和远程库中的内容起了冲突,因为你准备修改的地方已经有内容了,是程序员A修改的,这时候你需要将远程库先拉取下来,执行指令:
代码语言:javascript复制git pull origin master
看到红色框线标注的内容,是不是感觉似曾相识呢?没错,现在我们又处于合并中的状态了,打开程序员B的工作区:
解决冲突也很简单,把不需要的内容都删除就行了,这里我们就把程序员A和程序员B所做的修改都保留下来:
接下来的操作就一样了,将文件添加到暂存区:
代码语言:javascript复制git add test.txt
然后提交:
代码语言:javascript复制git commit -m "解决程序员B因推送产生的冲突"
这里还是注意千万别加文件名。
提交完成后,就可以推送到远程库了:
代码语言:javascript复制git push origin master
跨团队协作开发
刚才介绍了如何进行团队协作开发,当你将某位开发人员邀请到你的项目团队中,该开发人员就可以对远程库进行拉取和推送的操作了。
但是这仅限于团队内部人员,什么意思呢?你的项目肯定是交由公司内部的人或者你信任的人来一起开发。比如你目前正在开发公司项目中的某个模块,途中遇到了一些技术上的问题,你找人帮忙,可他不是你们公司的,你当然不能把他邀请到你的项目团队里了,这就涉及到一个跨团队协作开发的问题,该如何解决呢?
这个在前面也说过了,我记得好像是专栏的第一篇文章, 当时说的是,团队外部人员可以将项目fork到自己的远程库,然后克隆到本地进行开发,完成后通过pull request发起请求,待项目负责人员审核后就可以进行合并了。
下面具体演示一下:目前程序员A和程序员B在同时开发一个项目,此时程序员B遇到了一些问题需要程序员C帮忙,程序员C就需要去访问项目地址:
看到项目后,我们点击右上角的Fork,点了之后就会在程序员C的GitHub中复制一份远程库:
这样程序员C就可以开始正常开发了,新建一个文件夹(名为:TestGitHub_3),然后在该文件夹下启动Git终端,并将远程库克隆下来,执行指令:
代码语言:javascript复制git clone https://github.com/IronSpiderMan/TestGitHub.git
注意这里的地址是程序员C的远程库地址。
克隆下来以后,我们在程序员C的工作区创建一个pay.txt文件:
然后提交该操作:
提交完成后推送到远程库,执行指令:
代码语言:javascript复制git push origin master
此时刷新程序员C的远程库:
推送就完成了。
接下来程序员C就需要发起一个pull request请求,点击下图中红色框线标注部分:
你可以点击上面的Pull Requests,也可以点击下面的New pull requets来直接发起请求:
此时会显示你所做的修改,新添加了一个pay.txt文件,然后点击绿色按钮Create pull request:
输入一下这次请求的标题和内容,完成后点击右下角的绿色按钮:
到这里,程序员C的任务就完成了,接下来就要让程序员A去审核程序员C发起的请求:
可以看到程序员A的远程库中有一个Pull requests,我们点击进入:
这里就可以看到程序员C发起的请求,点击进去查看:
可以看到,这里是可以让两个开发者进行对话的,你可以询问他一些代码细节上的问题,对方收到消息后也可以回复你。点击提交:
再来到程序员C的GitHub:
你就收到了程序员A发送来的消息,此时你就可以继续回复他。
Files changed可以查看程序员C具体改动了哪些文件,都确认无误后,点击下面的绿色按钮开始合并:
然后输入本次合并的注释信息:
点击绿色按钮确认合并,合并就完成了。
此时程序员A的远程库中就有了程序员C的代码,程序员A又可以对远程库进行拉取,本地开发,然后推送等操作。