目前我们已经掌握了Git基础操作,对于文件的增删改,再也不用担心文件的丢失与误删问题了,如果还有不了解的可以看下我上章节的Git基础教程。
对于文件增删改的操作,Git与SVN基本没啥区别,但是GIt究竟强在哪了,这就是我们正要说的Git仓库,这是Git区别于其他版本控制系统的一个必杀技之一:远程仓库。
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早肯定只有一台机器有一个原始版本库,此后,每一台机器可以从原始版本库“克隆”一份到自己的电脑,而且每台机器的版本库其实都是一样的,并没有主次之分。
实际上,可以找一台电脑充当服务器,也就是远程仓库的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一根到自己的电脑上,并且各自吧自己的修改提交推送到服务器远程仓库中,也可以从服务器仓库中拉取别人的提交推送。
其实吧,自己就可以搭建一台Git的服务器,不过现阶段为了学Git自己搭建一个服务器,完全没有必要,庆幸的是这个世界有两个神奇的网站Github和Gitee。
Github
就可以看出这个网站就是提供Git仓库托管服务的,只需要注册一个Github的账号,就可以免费获得Git远程仓库,但是由于Github是国外的服务器,有时候运行起来效率比较慢,因此就有了第二个神奇的网站码云。Gitee
是由开源中国基于Gitlab所开发的,专门为开发者提供的稳定、高效安全的云端软件开发协作平台,无论是个人、团队、伙食企业,都能使用码云实现代码托管、项目管理、协作开发等操作。Gitee
,并不是说Github
差,在代码托管这方面可以说Github是永远的神,么的说,目前谁也打不破,但是我们为了学习使用Git代码托管服务,使用国内的代码托管服务器码云效率相对较高点,两者功能都很强,对于初学者来说,码云功能更为全面些,适合初学者。Gitee
,可以参考Gitee官方帮助文档。由于你的本地Git仓库和Gitee仓库之间的传输是通过SSH加密的,所以,需要一点设置:
打开Git Bash
本地可视化界面窗口:
输入命令cd ~/.ssh
$ cd ~/.ssh #查看是否存在SSH密钥(keys)
如果有,先别慌,咱还是先看没有的情况,没有咱就自己创建一个公钥(前提要联网):
ssh-keygen -t rsa -C "[email protected]" #此命令就是用来创建公钥的
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于啥军事机密目的,所以也无需设置密码,接着一路回车:
可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对
,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
可以使用命令直接打开秘钥文件:
$ cat /C:/Users/admin/.ssh/id_rsa.pub
为什么要使用SSH Key
呢?因为无论是Github
还是Gitee
,需要识别出每次推送提交的人员确定是你提交的或者确定是你团队开发小组人员提交的,而不是别人冒充的,如果没有公钥,南无任何人只要知道了你的仓库地址都可以向你的仓库推送提交,也可以随意修改了,这是非常可怕的。
而Gitee支持HTTPS协议,所以只要Gitee知道你本地的公钥和远程仓库中的公钥是一直的,就可以确定你可以向远程仓库提交推送。
当然Gitee允许你添加多个公钥Key,假定你有若干台电脑,你一会在公司提交推送,一会儿在家提交推送,只要每台电脑的公钥Key都添加到Gitee远程仓库中,就可以在每台电脑上往远程仓库推送了。
最后友情提示,无论是在Github还是Gitee上免费托管仓库,任何人只要知道你的仓库地址都可以直接看到(但是只有你自己可以修改),所以不要把一些敏感信息存进去。
如果你不想让鄙人看到你的Git远程仓库,有两个办法:
目前,我们在Gitee上的新创建的这个learngit
仓库还是空的,仓库初始页还告诉我们,可以从这个仓库克隆出新的仓库到本地,也可以将自己本地的仓库与本地关联,然后把本地仓库的内容推送到Gitee
上的远程Git仓库。
我们根据上述的Git入门教程的指令,在本地的的learngit
仓库中运行以下命令:
#这些指令是在本地创建learngit仓库,并做初始化,新建readme.txt文件,提交到本地Git版本库中
$ mkdir learngit
$ cd learngit
$ git init
$ touch readme.txt
$ git add readme.txt
$ git commit -m "first commit"
因为我本地已经创建过learngit仓库了,也新建了readme.txt文件,并添加到了本地Git版本库中,所以我们直接进行下一步,使用命令git remote add origin "远程仓库的地址"
,这个远程仓库地址就是我们上述刚建好远程仓库时的HTTPS协议的链接地址,连接远程Git仓库:
//此行代码的作用就是连接远程的learngit仓库
$ git remote add origin https://gitee.com/itwbs/learngit.git
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库,所以还是尽量不要改这个了。
然后我们就直接将本地的内容推送到远程的learngit仓库中,使用命令git push -u origin master
:
#将本地learngit仓库的所有内容,推送到远程的learngit仓库中
$ git push -u origin master
因为是第一次连接远程仓库并推送,所以当你推送回车后,会弹出一个提示框,要求你填写用户名和密码,也就是你Gitee码云账号的用户名和密码:
然后你会看到推送进度和远程连接等一系列信息,如下:
$ git push -u origin master #执行推送
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 12 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.25 KiB | 71.00 KiB/s, done.
Total 15 (delta 2), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/itwbs/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
由于推送前远程的learngit仓库是空的,我们第一次推送master
主分支时,加上了-u
参数,Git不但会把我们本地的master
主分支推送到远程新的master
主分支中,还会把本地的master
分支和远程的master
分支联系起来了,在以后的推送push
或拉取pull
时就可以简化命令了。
此时已经将本地learngit仓库的内容推送到了远程的learngit仓库了,使用git push
命令,实际上就是将本地当前的master
主分支推送到了远程,并与远程的master
主分支合并了。
此时我们再次查看远程的learngit仓库,就在初始界面,直接刷新,看内容:
你就说强悍不!!!
此时你本地的learngit仓库和远程的learngit仓库时一模一样的,当你本地无论是对文件做了修改,还是新添加了文件,只要做了git commit -m ""
提交到本地仓库了,你想远程仓库也有新修改或新添加的内容,就可以直接使用如下命令推送到远程仓库中:
$ git push origin master #直接推送到远程仓库,并合并远程的master
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm
命令。使用前,建议先用git remote -v
查看远程库信息:
$ git remote -v #查看远程库信息
origin https://gitee.com/itwbs/learngit.git (fetch)
origin https://gitee.com/itwbs/learngit.git (push)
然后,可以根据名字删除,比如要删除origin
:
$ git remote rm origin #删除远程的origin
说明下,上述的删除
操作,只是解除了本地与远程的绑定关联关系,并不是物理上的删除远程库,远程库本身并不会做任何改变。
要想真正删除远程库,需要登录Gitee,在后台页面找到远程库,才能真正删除。
首先我们先在远程learngit仓库修改test.txt文件,随便添加点内容,如下:
然后查看本地的test.txt文件,确保是空的:
$ cat test.txt #查看确实是空的
也可以记事本打开查看:
此时我们可以从远程kearngit仓库直接拉取最新内容合并到本地learngit仓库中,然后test.txt内容就可以远程的一样了,此时我们有两种拉取的方法,分别如下:
git fetch
相当于是从远程获取最新版本到远程的master
主分支中,然后将远程的master
注分支带着最新版的内容拉取到本地仓库,但是不会自动合并本地仓库内,也就是需要自己再次合并:
$ git fetch origin master #从远程仓库下载所有最新版本的内容
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 286 bytes | 16.00 KiB/s, done.
From https://gitee.com/itwbs/learngit
* branch master -> FETCH_HEAD
1d07bf6..cd180c8 master -> origin/master
然后通过命令查看,下载的最新版的内容与本地仓库的内容有哪些区别:
$ git log -p master..origin/master #查看日志对比内容
commit cd180c8e4f040b4c440d6c1b4145ca3e4aa54959 (origin/master)
Author: itwbs <1845192312@qq.com>
Date: Sat Aug 14 10:58:45 2021 +0000
update test.txt.
diff --git a/test.txt b/test.txt
index e69de29..591a311 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+This is a test.txt.
\ No newline at end of file
很明显可以看出,对test.txt文件做了更新,且也显示出,更新了什么内容。
然后确保信息没有什么问题了,通过指令合并到本地仓库中:
$ git merge origin/master #将远程的master
Updating 1d07bf6..cd180c8
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
再次查看test.txt
文件的内容,咦,它有了,真有了,呆发不:
$ cat test.txt #查看内容
This is a test.txt.
**git pull
指令相当于是git fetch
和git merge
两者的结合体,可以从远程仓库拉取最新版本的内容,并直接合并本地的master
主分支的内容,如下: **
首选我们可以在远程再次修改test.txt文件的内容,如下:
此时我们在本地执行命令git pull
:
$ git pull [origin master] #后面的[ ]可选,是为了指定拉取远程仓库库中的哪个分支,默认是master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 300 bytes | 5.00 KiB/s, done.
From https://gitee.com/itwbs/learngit
cd180c8..b1fe536 master -> origin/master
Updating cd180c8..b1fe536
Fast-forward
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
再次查看test.txt文件内容,可以发现直接更新了,它又有了:
$ cat test.txt
This is a test.txt.
Second update test.txt. #新添加的一行内容
两者拉取内容对比:
git fetch(推荐使用 ) |
git pull | |
---|---|---|
执行过程 | 显示git fetch下载最新版本内容到本地,然后手动git merge合并本地的master主分支 | 相当于git fetch与git merge结合体,直接合并到本地master主分支 |
安全性 | 安全性较高,在合并前可以先查看详情信息,作对比后再合并 | 直接合并,简单粗暴,容易操作错误 |
分布式版本控制系统最大的好处之一就是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,当有网的时候再把本地版本库git push
推送到远程就完成了同步;而SVN在没有联网的时候是所有人都不可以工作的!!!
既然是克隆,我们就可以把我们本地的learngit仓库给删除了,不要有任何顾虑,大胆的删:
在Git Bash中目录切换到gitspace下,执行命令git clone "要克隆的远程仓库地址"
$ git clone https://gitee.com/itwbs/learngit.git #克隆远程仓库
Cloning into 'learngit'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 21 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (21/21), 1.78 KiB | 27.00 KiB/s, done.
再次查看本地gitspace工作目录:
又有了,还一模一样,你说悍不悍!!!
小结:
HTTPS
和SSH
,默认的是支持SSH协议,HTTPS与SSH相比,SSH效率较高点,HTTPS
除了速度慢点外,还有个麻烦的事,就是每次推送的时候都需要输入口令,但是HTTPS
当然也有优点了,那就是通用性强,基本所有公司都开放的有http端口。一起学编程,让生活更随和!如果你觉得是个同道中人,欢迎关注博主公众号:【随和的皮蛋桑】。专注于Java基础、进阶、面试以及计算机基础知识分享。偶尔认知思考、日常水文。