到目前为止,我们已经学习了如何添加文件至版本库、如何回退及如何查看各阶段的内容,这些操作都是对本地仓库操作的,Git作为分布式控制系统,如何完成与其他成员间的协作呢。本篇将会介绍远程版本库想着的操作。
操作远程版本库,首先需要搭建一个远程服务器的版本库,这里,我们先使用github网站作为我们的远程服务器。GitHub是一个面向开源及私有软件项目的托管平台,我们只需要注册一个账号,即可免费创建远程Git仓库。当然,也可以使用国内的Git项目托管平台-码云。
Tips:在GitHub或码云上托管的代码是公共的,大家都是可以访问的(码云的私有库功能有5个成员的上限限制),如果不想被所有人访问,私有自己的代码,可以使用他们的收费功能,或者自己搭建一个GitLab服务器。
本地仓库与远程仓库的传输有两种方式,一种是ssh,一种是https,若选择ssh传输,需要先设置ssh key,若选择https传输,在传输时需要输入用户名和密码。
一、设置SSH key
1、创建SSH key
在用户主目录下,看看有没有.ssh目录(.ssh目录是隐藏目录,linux环境使用命令 cd ~/.ssh 即可打开),如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2、在GitHub上设置ssh key
登录GitHub,依次点开:"Settings" -> "SSH and GPG keys" -> "New SSH key",
Title任意填写,在Key文本框里粘贴id_rsa.pub文件的内容,最后点击"Add SSH key",即可看到已经添加的Key。
二、关联远程仓库
使用远程仓库时有两种情况:一种是将本地的项目做最开始的项目推送到远程供大家在此基础上开发;另一种是从远程仓库上拉取代码到本地,进行开发。下面将分别介绍。
1、推送本地版本库
首先在远程服务器上创建项目,登录GitHub后,点击页面中间的“Start a project”按钮, 然后在“Repository name”下面填上项目名称:gitdemo,最后点击最下方的"Create repository"按钮,创建项目。
当项目创建完成后,会有提示,可以创建一个新项目推送到远程仓库,或将已经存在的项目推送到远程仓库。
这里我们使用之前已经创建好的项目,推送到远程仓库。将下面命令中的地址替换为你自己的GitHub项目地址
$ git remote add origin https://github.com/****/gitdemo.git
$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 535 bytes | 535.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/****/gitdemo.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
第一条命令,是将本地创建与远程服务器上创建的项目进行关联。添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。
第二条命令,是将本地仓库的所有版本推送到远程仓库中。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,刷新GitHub页面,发现远程库的内容与本地一模一样。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
2、克隆远程版本库
如果已经有了远程仓库,我们只需要将远程仓库克隆到本地,即可操作远程库。
首先,登录GitHub,创建一个新仓库,名字叫gitproject。勾选“Initialize this repository with a README”选择框,这样GitHub会自动为我们创建一个README.md文件。
项目创建成功后,点击“Clone or download”按钮,复制项目地址。
在本地选择合适的项目工作空间,使用git clone命令克隆项目
$ git clone https://github.com/dudan57/gitproject.git
Cloning into 'gitproject'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
三、拉取、推送代码
不同于SVN基于文件推送、拉取,Git在默认情况下是基于版本推送、拉取的,也就是说Git只能推送、或拉取整个版本(只拉取版本中的部分文件在Git1.7.0版本后也可以实现,需要做特殊设置,由于实际使用中完全可以不用这个功能,这里不作讨论,感兴趣的朋友可以自行百度)。
例如,仓库中有A, B, C三个文件,现在有人改动了这三个文件并提交到远程库了,可不可以我只拉取A文件,而不拉取B, C两个文件呢,默认情况下Git是做不到的,但SVN可以轻松做到。
拉取Git代码时,如果发生了冲突,Git会将远程仓库的代码与本地仓库的代码都列出来,标识冲突,让用户自已去选择保留哪部分。
如果在拉取代码前,本地的某个文件已提交至本地版本库,但与远程版本库有冲突,同时这个文件又做了改动但没再次提交到本地版本库(通过git status命令可以发现该文件是红色或绿色显示),将造成该文件在远程仓库、本地版本库、工作空间都不一样并有冲突,如果这时候去拉取远程仓库的代码,Git将不知道如何比较,此时拉取代码也会报错,拉不下来远程库。因此在拉取或推送代码时,要确保本地需要推送的代码改动都已提交至本地版本库,可以通过git status命令查看,如果没有红色(有改动待添加至暂存区的文件)或绿色文件(已添加至暂存区待提交至本地版本库的文件),就可以使用git pull命令拉取代码了,在每次使用git push命令推送代码前,先用git pull命令拉取代码。
小结
1、本地仓库关联远程仓库
$ git remote add origin <远程仓库地址>
2、克隆远程仓库
$ git clone <远程仓库地址>
3、拉取代码
$ git pull origin master
4、推送代码
$ git push origin master