【学习总结】Git学习-参考廖雪峰老师教程五-远程仓库
学习总结之Git学习-总
目录:
一、Git简介
二、安装Git
三、创建版本库
四、时光机穿梭
五、远程仓库
六、分支管理
七、标签管理
八、使用GitHub
九、使用码云
十、自定义Git
期末总结
五、远程仓库
添加远程库
从远程库克隆
------------------------------------------
5.0 远程仓库简介
“有了远程仓库,妈妈再也不用担心我的硬盘了。”——Git点读机
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
其实一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉,所以不要在一台电脑上克隆多个仓库。
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。
好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
-----> 所以综上,GitHub相当于这个24小时开机的服务器嘛??
下面添加公钥ssh:
5.0.1 找到公钥
在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对
id_rsa是私钥,不能泄露出去
id_rsa.pub是公钥,可以放心地告诉任何人。
- 查看公钥的其他两种方法<来自菜鸟网站> 查看本机SSH公钥
--->在本机生成.ssh
前...
---->在本机生成.ssh
后...
- 如果没找到,要先生成:
廖老师说用命令ssh-keygen -t rsa -C "youremail@example.com"
然后一路回车,好长,我看用菜鸟网站的短命令也生成了,如下图,应该是一样的吧
- 短命令后续:夭寿在关联本地库到远程库那步,要重新做啦~~<5.1.2>
- 短命令后续又后续:重新按长命令做了,公钥里写了邮箱,还是不行,而且是同样的错误,我????
- 短命令后续再后续:我想我知道了,是因为cat公钥的时候进了公钥的路径下,那个地方肯定没有git库了啊啊啊啊!!!!
所以问题大概在这里,所以也无从知晓短命令到底会不会坏事了,不过总是感觉后面跟着邮箱更踏实。
5.0.2 添加ssh key到GitHub账户
SSH Key:GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
GitHub允许添加多个Key。比如有多台电脑,把每台电脑的ssh key都添加即可。
登陆GitHub:打开“Account settings” ---> “SSH Keys”页面 -----> 点“Add SSH Key” ---> 填任意Title,在Key文本框里粘贴id_rsa.pub的内容 ---> add SHH key
(貌似GitHub改版了,版面布局略有不同)
- 奇了怪了,我在软工课时期添加的笔记本的ssh key怎么没了...蜜汁自动消失???
------------------------------------------
5.1 添加远程库
git remote add origin git@server-name:path/repo-name.git
- 关联一个远程库
git push -u origin master
- 第一次推送master分支的所有内容;
git push origin master
- 此后,每次本地提交后,只要有必要,就可以使用此命令推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
下面demo一下整个过程:
- 现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
5.1.1 在GitHub新建一个仓库
“Create a new repo”按钮 ---> Repository name填入learngit,其他默认 ---> “Create repository”:成功地创建一个新的Git仓库:
- 目前,在GitHub上的这个learngit仓库还是空的,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库
5.1.2 本地库关联到远程库
<在本地的learngit仓库下运行> 命令:git remote add origin git@server-name:path/repo-name.git
(思考一下,现在是从本地运行命令,连接到GitHub,故这里的path是指GitHub里的路径,或者说,网址,如下图)- 这里,不是网址的,http是http,ssh是ssh,两种形式!!
后记:<在本地的learngit仓库下运行>这几个字大概是被我吃了。。。。
廖老师的例子:git remote add origin git@github.com:michaelliao/learngit.git
- 这里要把michaelliao改成自己的名字,说的也是GitHub里的名字。bingo。
-------->啊啊啊啊不行啊!!!???
看到评论区的讨论,是前面设置ssh的时候按菜鸟网站那个简写的出问题了吗???
试试重新设置:
1-完整命令生成.ssh文件(生成的公钥不一样了,这次多了完整命令结尾的邮箱!!)
2-添加ssh公钥到GitHub账号
3-GitHub新建的仓库没有影响,就还这样继续这一步。(这里我好像梦见过,是一年前做这个作业的时候好像就有这种隐隐约约的感觉,在这个地方返工了,还有陌生的vim操作窗。。)
哈?还是不行啊,同样的错误,看来不是这个命令的锅??
-----> Google了以后(还是cn网站搜到的)说需要git init初始化,虽然不明白为啥,因为.git这个库是一直在的,为啥还要再初始化一次?不过试试看行不。
- 哈?幸亏没有再初始化一次,好险好险,直觉有问题,直觉是对的!!
------>我想我知道问题在哪了。。cat公钥的时候进了公钥文件路径下,这里自然不会有.git了! 所以呢。。最终我也不知道短命令到底行不行了。。
- 终于解决了,在这个小小的地方耽搁了这么久,没有消息就是最好的消息,哈哈哈哈
(添加成功后我看了一眼GitHub页面,没啥变化。。)
- 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
5.1.3 本地推送push
通过命令:git push -u origin master
- 把本地库的内容推送到远程,用
git push
命令,实际上是把当前分支master
推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支<关联>起来,在以后的推送或者拉取时就可以简化命令。
- 关于SSH警告,直接贴图了:
从现在起,只要本地作了提交,就可以通过命令:git push origin master
- PS:看了一眼GitHub页面的commit,总感觉这种可视化的东西整成多了,不然太缥缈了。。。看不见又摸不着那种。。
------------------------------------------
5.2 从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
- 现在假设我们从零开发,最好的方式是先创建远程库,然后,从远程库克隆。
下面是一个demo:
5.2.1 在GitHub里准备一个远程库
登陆GitHub ---> 创建一个新的仓库gitskills
---> 勾选Initialize this repository with a README
,这样GitHub会自动创建一个README.md文件
创建完毕后,可以看到README.md文件:
5.2.2 克隆到本地
克隆之前看好路径,因为是版本库,和learngit平级,就放到平级路径就好。(d:\software)
cd & pwd
pwd
- 查看当前所在的路径。当然,在光标上一行会写当前路径。当前路径就是个大坑,时刻注意!!
cd ..
确实是返回上一级,之所以失败是因为cd
和..
中间还有空格
克隆命令:git clone
+ <在GitHub可查到的ssh地址>
5.2.3 ssh 与 https
Git支持多种协议,默认的git://
使用ssh
,但也可以使用https
等其他协议。
通过ssh
支持的原生git协议速度最快。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http
端口的公司内部就无法使用ssh
协议而只能用https。