通过前边的内容,我们已经学会了git的基本操作。但我们的所有使用都是在计算机本地发生的,换言之现在的git还是个单机版游戏,只能自己和自己玩。很显然它不能满足现在的开发需求。对于现实开发来说往往都是需要多人协作的,这就要求git仓库不能仅仅在某个人的计算机上存在,而是需要一个公共的git仓库,这个仓库,每个参与开发的人都可以访问,所有的代码最终都要提交到该位置,如此一来便能实现真正的协同开发。
为了拥有一个公共的git仓库,可以选择在服务器中部署一个git服务,所有代码通过git服务存储到服务器之中,所有的开发人员直接访问即可。但搭建服务器部署git服务并不是我们所关注的内容,所以在这里不在赘述。
除了自己部署git服务以外,在互联网中也有很多的服务供应商,它们直接将服务器对外开放,使得我们可以在自主创建并使用git远程仓库。这些供应商中最著名的要数GitHub了,GitHub是世界上最知名也是最大的代码托管平台,如果要使用代码托管,GitHub是我们的首选。但是它也又一个不小的缺点,GitHub的服务器部署在国外,由于众所周知的原因访问速度不是十分稳定。所以今天我们不会使用它来学习远程git仓库的操作。除了国外供应商,在国内也有很多的代码托管平台,比如https://gitee.com/其实大部分的代码托管网站操作方式都是类似的,所以无论是gitee还是github学会一个另外的自然而然的也就同时学会了。
现在你需要访问gitee的官网,并且注册一个gitee的账号,然后跟着我一步一步的向下进行操作。
一、创建远程仓库
登陆gitee后,访问https://gitee.com/projects/new,创建新的仓库。首先需要设置一个仓库的名字,名字这种东西根据个人喜好设置即可。
设置名字后,注意下方会出现一个仓库地址。这个地址就是你的远程仓库的地址,以后访问远程仓库就需要通过该地址进行访问。地址主要是由你的用户名和仓库名来决定的,比如我的是这样的 https://gitee.com/ymhold/demo01。
然后是仓库介绍,随便写吧。介绍下边有一个私有和公开的选项,顾名思义私有仓库不是所有人可见的,你可以设置它的访问权限。公共仓库是所有人可见的你只能控制推送代码的权限,却不能控制查看的权限。
如果你的代码是自己的项目代码不希望被人看到或是公司内部的代码,当然要使用私有选项,选择公开会导致你的代码被所有人看到。私有仓库代码最多只能被5个人访问,并且仓库的大小也是有所限制的的,要允许更多的用户,更多的空间你需要开个会员!现在来看我只是创建一个小demo,不需要私有,所以直接公开即可。
下边的语言根据实际需要选择,这里我选择JavaScript。第二个选项用来选择.gitignore的模板,避免我们自己手动创建。模板可以根据你的开发语言或开发环境(工具)选择,这里我选择JetBrains,因为我以后可能会使用WebStorm来对代码进行开发。最后一个是开源协议,选择Apache2.0。其实这三个选什么,目前来讲并不重要,甚至可以不选。正常使用时根据实际情况选择即可。下边的三个下拉框都不需要勾选,分支模型设置为单分支即可。这些东西创建仓库后都是可以修改的。
最后选择创建,即可完成仓库的创建。
二、克隆远程仓库
仓库创建完毕,由于刚才我的选择不创建README,所以现在仓库中只有两个文件.gitignore和LICENSE。现在的仓库存在于gitee的远程服务器上,要使用远程仓库先要将远程仓库拉取到本地,或者也可以说克隆到本地。上文我们提到过每个仓库都一个远程地址,还记得吗?忘了也没有关系,在仓库里又一个克隆按钮,点击即可直接复制地址,复制https标签下的地址即可。
复制地址后,进入到你希望存储代码的路径,比如我就进入到桌面的code文件夹,然后执行git clone https://gitee.com/ymhold/demo01.git
(你执行时可以使用你自己的地址)git就会自动从远程服务器中拉取代码。
下载完成后,在code当中会增加一个demo01目录,这就是我们刚刚从远程仓库中拉取的代码。进入git目录即可对代码进行管理。
三、推送代码
现在代码已经被克隆到了本地,接下来我们可以随意的在本地对代码进行管理。注意本地库和远程库之间是相互独立的,你在本地库上进行修改不会实时的同步到远程库。所以接下来我们尝试着向仓库中添加一些内容,并提交给git保存。
现在我创建一个a.txt,然后提交到git保存。
此时在本地库中虽然已经有了a.txt,但是远程的git仓库中,并不会存在该文件,你可以试着查看一下。原因已经说明了,本地库和远程库是独立的。要想本地库的内容被同步到远程库中,必须调用git push
来将本地库的内容推送到远程仓库中。
推送代码是需要验证权限的,公开仓库虽然可以任意访问但并不是所有的用户都可以推送代码(推送权限可以在仓库中设置)。所以推送时需要你输入有权限用户的用户名和密码,输入密码时并不会显示输入的内容,感觉上好像没输入上,没关系直接输入即可。
推送成功后再来查看gitee的仓库,你会发现刚刚我们创建的a.txt已经被推送到了远程仓库中。
怎么样?是不是简单到不行了,相对于本地仓库的操作,远程仓库只是多了拉取(pull)和推送(push)其他操作大体上都是类似的。
还要强调一点,推送代码是需要检查权限的,所以每次输入都需要验证用户名和密码,如果你觉得每次输入用户名密码有点烦人,可以调用命令来记录访问权限避免每次提交都输入!git config --global credential.helper wincred
如果想取消权限的保存可以调用:git credential-manager uninstall
四、一些问题
远程库的出现方便了代码的管理,使得多人可以同时维护一个项目。但与此同时也带来了一些新的问题。最常见的问题还是代码冲突的问题。如果有两个程序员同时修改了一个代码,那么推送时到底要以哪个为准呢?
为了演示这个问题,接下来我在从服务器上克隆一个代码放在test目录中。
接下来在test中对a.txt进行修改并推送到远程仓库。
接下来回到code目录,现在远程仓库中的代码是最新版本,a.txt已经被修改。而code目录中a.txt还是旧版本的代码。现在我们在code中修改a.txt,然后提交但是暂时先不推送。
接下来调用push来向远程仓库推送代码。
为什么会出现这种情况,简单来讲远程服务器中的代码版本和我们本地的代码版本不同。就好像说服务器上的代码版本是2.0而我们本地代码是1.0。这次推送希望把服务器上的代码升级为2.0但是远程服务器早就已经是2.0了所以推送失败。
这个问题解决起来也并不困难,就是我们要确保推送时的代码和服务器代码处在同一个版本,这样就可以正常进行推送了。所以我们需要先执行git pull
来将服务器上最新的代码拉取下来。
由于服务器中的a.txt和本地a.txt同时被修改,于是发生了冲突,同样git没有办法自动解决冲突,所以这里我们需要手动来处理冲突然后提交。
解决冲突的思路是一样的,把代码修改为你希望的样子即可,但是在多人开发的时候一定要注意不要随意的修改删除别人的代码。
修改后调用add和commit来解决冲突。
冲突解决了,代码版本也同步了,直接调用push推送代码即可!
看似有些复杂,但实际只需记住一个原则,推送代码前先拉取一下,确保代码版本同步后在推送!push前先pull一下子!