Git简易教程笔记(2)

时间:2022-08-31 19:56:27

上一篇博客主要说到了Git本地仓库的使用,本篇博文,将主要说明远程仓库的使用、分支管理以及标签管理。

关联SSH key

大名鼎鼎的GitHub就是免费提供远程仓库托管的网站,有了它,我们可以将本地文件和远程服务器文件进行同步。

要使用GitHub,首先要注册一个自己的账号。然后,远程仓库要和本地仓库通信,一般是要加密的,避免其他用户随意修改,这里的加密方式是SSH,需要我们进行一些设置。

1.创建SSH Key,使用下面的命令:

$ ssh-keygen -t rsa -C "youremail@example.com"

请准确输入自己的邮箱,最好是和注册GitHub的邮箱一样。如果一切顺利的话,可以在主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,需要自己保管,id_rsa.pub是公钥,无需保密。

2.GitHub添加SSH Key

首先使用命令cat .ssh/id_rsa.pub 获取秘钥内容,复制这些字符。

然后登录GitHub,点击头像下的Settings,进入账户设置界面,然后选中SSH and GPG keys这一栏,点击Add SSH Key,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,最后点击add key确认,就可以看到添加的秘钥,如下图所示。

Git简易教程笔记(2)

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你操作的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加GitHub,就可以在每台电脑上往GitHub推送了。

注意,在GitHub上免费托管的Git仓库,任何人都可以看到(但只有你自己才能改)。所以,不要把敏感信息放进去。

如果你不想让别人看到Git库,有两个办法,一个是交钱,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读也不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。

使用远程仓库

就个人而言,比较习惯的GitHub远程仓库使用方式是:

  1. Github网站创建空的远程库,比如叫LearnGit
  2. 克隆到本地,关联文件夹LearnGit(本地库)
  3. 在LearnGit文件夹下对文件进行增删改,提交修改(add和commit操作)
  4. push推送到远程库,进行文件之间的同步

下面就这个使用流程进行简介。

1.创建新的远程仓库

登录GitHub,右上角找到加号,点击New repository,就可以添加新的远程库,如下图所示。

Git简易教程笔记(2)

首先取个好名字,比如LearnGit,然后写一小段简单描述(不写也没关系)。仓库默认是公开(public)的,任何人都可见,如果点了私有(private),请准备好信用卡付款。然后READEME要打勾,绝大部分仓库都是有项目说明的。gitignore列表可以屏蔽掉特定类别的文件,如果有需要可以设置,license对于这种玩具项目是没有必要的。最后点击Create repository创建仓库,效果如下图所示。

Git简易教程笔记(2)

2.克隆项目到本地

这个项目中除了README.md,什么也没有,如果想往里头添加或修改内容,无法在网页上操作,只能将其克隆到本地进行操作(任何人都可以克隆,但是只有自己能上传修改),从下图获取仓库的网址,这里默认是https协议,还可以点击Use SSH切换成SSH协议,SSH协议不需要手动输入账号密码,而且速度快一些,推荐使用

Git简易教程笔记(2)

# 两种协议,均可克隆到本地,推荐使用SSH协议
$ git clone https://github.com/Jmx5200/LearnGit.git # https协议
$ git clone git@github.com:Jmx5200/LearnGit.git # SSH协议,推荐使用

3.修改本地库

克隆项目后,发现/home目录下出现了LearnGit文件夹,该文件夹自动拥有.git隐藏目录,可以使用Git命令进行操作。点开看发现里头只有README.md,我们使用下列命令往里面增加一些东西(当然,直接从别的地方复制过来也是可以的)。

# 创建和修改文件
$ touch a.txt b.txt c.txt
$ echo "this is a">>a.txt
$ echo "this is b">>b.txt
$ echo "this is c">>c.txt
# 提交修改
$ git add .
$ git commit -m "first commit"
[master 76e1e87] first commit
3 files changed, 3 insertions(+)
create mode 100644 a.txt
create mode 100644 b.txt
create mode 100644 c.txt

现在,本地库就有了4个文件,且提交了修改,下面就该同步到远程库了。

4.推送到远程库

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

$ git push -u origin master
对象计数中: 3, 完成.
Delta compression using up to 8 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 345 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Jmx5200/LearnGit.git
76e1e87..387646c master -> master

很快完成了推送,无需密码,然后我们可以发现本地文件夹和远程仓库是一样的了,如下图所示。这里还说一句,如果克隆使用了https协议,每一次推送都会要求输入账号和密码,远不如SSH来得好。之后如果本地的修改想要同步,那么命令可以简化为:git push origin master

Git简易教程笔记(2)

Git简易教程笔记(2)

5.删除远程仓库

GitHub中的删除功能藏得比较深,在项目页面中有一个Setting选项,进入后下拉到底可以使用Delete this repository删除项目。

分支管理

分支管理是Github中最常用的功能之一,我们使用一个情景解释:假设你手头有一个代码项目叫LearnGit,里头代码是比较完整的。如果你想在此基础上开发一个新功能,直接在原有代码上操作是不科学的,万一开发不顺利,原来好的代码也就没了;手动复制一份后再修改显得比较笨。那么最好的做法就是:创建一个新分支Dev(初始内容一样),两个项目并存,对Dev上的修改不会影响LearnGit的内容,Dev可以任意处理,如果新功能开发成功,那再将两份代码合并成一份,使得LearnGit的内容和Dev一样,然后可以删除Dev分支。

Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成,不论项目有多庞大。

1.创建分支

还就以刚才那个LearnGit为例子,我们创建并切换到新的Dev分支。

$ git checkout -b Dev
切换到一个新分支 'Dev'

这里的-b参数表示创建并切换,等价于下面两条语句:

$ git branch Dev # 创建分支
$ git checkout Dev # 切换到选中分支

使用下面命令查看一下当前有几个分支:

$ git branch 
* Dev # 当前分支会有星号
master

2.修改新分支内容

使用下面命令修改a.txt的内容并提交。

$ echo "new branch is created">>a.txt
$ cat a.txt
this is a
new branch is created
$ git add .
$ git commit -m "dev branch"
[Dev fa362ef] dev branch
1 file changed, 1 insertion(+)

现在,Dev分支的修改完成,我们切换回master分支。

$ git checkout master 
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
$ cat a.txt
this is a

可以看到,刚才对a.txt文件的修改并未影响到master分支,可知这两个分支确实是隔离的。

3.远程分支的推送和删除

刚才操作使得本地库有了新分支,如果想要GitHub远程库也有同样的新分支,可以试着推送一下(先提交修改)

$ git push origin Dev

此时刷新Github网站,就可以发现多了一个Dev分支。如果什么时候不需要这个分支,也可以将其删除,方法是先在本地库把这个分支去掉,然后同步到远程库:

$ git branch -D Dev # 本地库删除分支Dev
$ git push origin :Dev # 注意空格

4.合并分支

如果Dev分支的开发很顺利,我们就可以把Dev分支的工作成果合并到master分支上:

$ git checkout master # 需要切换回master分支进行操作
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
$ git merge Dev
更新 76e1e87..91648a1
Fast-forward
a.txt | 1 +
1 file changed, 1 insertion(+)

此时master分支内容和Dev的一样了,注意到上面的Fast-forward信息,Git告诉我们,这次合并是”快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

合并后,Dev应该就没啥用了,为了简洁,一般会将其删除,参考上面第3步。

标签管理

Git引入了标签管理,作用很简单,可以理解为软件的版本号,本质上是commit id的一个别名(回顾之前博客中的提交号)。如果我们想回溯项目某一节点,使用标签是很方便的。比如著名的Caffe项目,就有若干个标签,对应于该项目若干个历史提交版本(不是全部,作者仅对部分提交打上了标签),如下图所示。

Git简易教程笔记(2)

可以看到,最近的几次标签号是0.9999,0.999,0.99等,分别点进去,提交日期和代码内容相差很大。

1.添加标签

默认标签是打在最新提交的commit上的,简单步骤可以描述为:

  1. 转到一个分支,do something,增删改;
  2. git commit提交修改;
  3. git tag添加标签;
  4. 将本地标签推送到远程。
$ git checkout master
# do something ......
$ git commit -m "commit info"
$ git tag v1.0 -m "release info"

使用git tag 命令可以查看所有标签,在Git中,默认的git push并不会推送标签信息,所以我们只能自己手动同步标签到远程库。

$ git push origin v1.0 #将本地v1.0的tag推送到远端服务器
$ git push origin --tags # 把本地所有未同步标签推送到远程

2.删除标签

首先在本地删除某个标签,命令是很容易的:

$ git tag -d v1.0 # 删除本地的v1.0标签

然后需要远程删除标签,命令要复杂一点:

git push origin :refs/tags/v1.0 # 删除操作实际上就是推送空的源标签refs