关于git的二三事


Git解惑

  • 0 前言
  • 1 准备条件
  • 2 git必须要有远程仓库吗?
  • 3 ssh生成秘钥对时的邮箱
  • 4 本地仓库名和远程仓库名是否必须相同
  • 5 如何让别人参加入你的项目开发

0 前言

git是常用的分布式版本控制工具。之前也简单使用过git,但是对于git的很多方面存在一些疑惑。这个周末,抽空通过实验解决了这些疑惑。在此进行记录。

1 准备条件

首先需要安装git,去Git官网下载windows版本的安装包,按照默认的配置进行安装即可。安装的具体过程就不做介绍了。
关于git的使用,廖雪峰的官网网站介绍的浅显易懂,可操作性非常强。跟着操作一两遍,收获一定非常大。传送门廖雪峰Git教程

2 git必须要有远程仓库吗?

git是分布式的版本控制工具,远程仓库不是必须的。如果只是在本地为自己的项目提供版本控制,只需要在本地管理就行了。本地使用git是为了,为自己的项目提供版本回溯的功能,也就是可以有后悔药可以吃。当对项目的修改后悔或者出现问题时,可以吃一粒后悔药。这样可以防止被那些,要求你改了n版,最后还要第一版的客户整死。
github关联远程仓库主要是为了防止丢失或者协同开发。如我们可以把自己的项目托管到github或者gitee平台,这样就算哪天我们的电脑磁盘坏掉,数据消失了。我们换一块新硬盘,可以从代码托管平台把代码克隆下来继续工作。原来的工作并不会丢失。另外,如果你的项目需要多人协作的话,别人不能直接访问你个人电脑上的仓库,就算通过某种方式可以做到,这样也不安全。将代码放到,托管平台,大家把代码与托管平台进行同步,方便又安全。其实如果不使用,现成的托管平台,我们也可以自己搭建git服务器,来进行版本控制。

3 ssh生成秘钥对时的邮箱

当我们把代码放到代码托管平台时,为了通讯过程中的安全。需要使用ssh生成一个秘钥对,包含私钥和公钥,并且把公钥配置到远程托管平台。ssh秘钥对如何增强通讯过程中的安全性,请参考SSH,SSH-Key及其在Git中的使用。
生成密钥对的命令为:

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh-keygen
# 常用的选项
-b:指定密钥长度;
-C:添加注释;用于为指定注释,可以是任何内容,通常使用自己的邮件名作为注释。
-f:指定用来保存密钥的文件名;
-t:指定要创建的密钥类型(加密方式)。

-e:读取openssh的私钥或者公钥文件;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;

在git-bash中执行即可。
一般我们可以使用如下命令,既可在~/.ssh 目录下生成两个秘钥文件,后缀为.pub的为公钥。

1
ssh-keygen -t rsa -C "[email protected]"

这里需要说明的一个疑惑就是,这个-C 采参数所指定的内容其实为注释,仅仅为提示信息,可能会显示在提交记录中。 在有的博客中看到,这个邮箱必须和远程托管平台(github或gitee)注册时的一样,这是不对的。经过实验,我发现,无论是github还是gitee并没有这个要求,不一样并不影响你将代码托管到远程平台。其实这个生成秘钥的过程其实和远程托管平台没啥关系。 这里也会验证你填写的是否为合法的邮箱。不过建议填写一个合法的邮箱,这样当你提交的代码有问题的时候,别人可以发邮件联系你。当然,如果你的目的就是让别人联系不上你,那可以随意填写。
需要注意的是,ssh生成的秘钥和计算机是绑定的,如果你换了计算机,使用新的计算机远程托管平台进行通信的话,需要重新生成key并配置。 暂时我还没有研究,重装了操作系统,而没有更换计算机是够需要重新配置key。如果你没有更换计算机,而想更换key,也可以重新生成。

4 本地仓库名和远程仓库名是否必须相同

首先给出答案,git并不要求本地仓库名和远程仓库名相同。在本地,我们可以认为,仓库名就是.git问文件所在的目录名。 在这里我创建了一个仓库名为dandan
在这里插入图片描述
为了将代码托管到远程的托管平台,首先在远程托管平台创建一个仓库(我愿意称之为项目),这里我选了github和gitee两个平台进行试验,结果是一样的,这里仅仅以gitee平台为例进行说明。gitee创建的仓库名为learngit_dandan。
在这里插入图片描述
接下来将本地仓库和远程仓库关联起来。注意,在与远程托管平台通信之前请先生成ssh key,并把公钥配置到远程托管平台。否则会失败。
然后使用如下命令将本地的仓库与远程的仓库关联:

1
git remote add origin [email protected]:michaelliao/learngit.git

这里的origin为本地客户端认为的远程仓库的名字。 注意我的说法是本地认为的。在多人协作的时候,每个人都有自己的git本地客户端和本地仓库,每个人都可以给同一个远程仓库在本地指定不同的名字。如,我在一台电脑上,把远程仓库learngit_danan的指定为gitee,在另一台虚拟上,把远程仓库learngit_danan的指定为myorigin,这完全可以,没有任何问题。
在这里插入图片描述
只不过,origin是git客户端默认的远程仓库的名字,如果我们在关联时将远程仓库的名字指定为origin,在push的时候可以不指定远程仓库的名字,默认push到origin关联的远程仓库。如果修改了名字,在push的时候必须写上指定的远程仓库的名字。 根据提示信息可以发现,也可以修改git push默认push的远程仓库名。
在这里插入图片描述

5 如何让别人参加入你的项目开发

我们自己远程仓库进行通信,需要将ssh key配置到自己的账户下既可以了。但是如果让别人参加进自己的项目开发,需要把别人的ssh key配置到自己的账户下吗?
如果是自己搭建了简单的git服务器,进行代码管理的话,可以收集所有用户的ssh key,这样提供key的用户,都可以与这台远程服务器进行通信。
但是在gitee托管平台并不需要这么做。gitee托管平台中,你只需要管理项目,向别人发送邀请链接,别人同意后就可以让别人加入到你的项目开发。别人同意后会在,他的gitee账户下也会显示这个项目,并且和你账户下的项目保持同步,但是这个项目并不属于他。
他可以使用如下命令,将要参与开发的项目克隆到他的电脑。前提是他在自己的账户下配置了自己的ssh key。

1
git clone [email protected]:null_152_7023/learngit_dandan.git

默认克隆下来的名字和远程仓库名(项目名)相同为learngit_dandan。
也可以在克隆的时候更改。

1
git clone [email protected]:null_152_7023/learngit_dandan.git dandan

这样就将本地仓库名更改为dandan。这个时候本地的dandan仓库就和远程的learngit_dandan关联起来了。
需要注意的是,这个时候本地的git客户端,认为远程的仓库名为origin。
在这里插入图片描述
如果需要修改,可以先删除这个关联,然后重新关联,并指定仓库名。
在这里插入图片描述
另外也可以使用 git remote set-url 将更改origin或者其他仓库,关联的远程项目。这个命令可以用于仓库迁移后的关联,或者直接修改关联的项目。
如原来仓库的地址为:[email protected]:null_152_7023/learngit_dandan.git
后来迁移到:https://gitee.com/lavi_liu/learngit_dandan.git

1
git remote set-url origin https://gitee.com/lavi_liu/learngit_dandan.git

注意:这里的本地仓库名,远程托管平台的仓库名,还有这个默认为origin远程仓库名,有点令人蒙圈。在这里我是这么理解的。

  • 本地仓库名:本地.git文件夹,所在目录的名字,dandan
  • 远程仓库名:远程托管平台上的仓库名,learngit_dandan
  • 远程仓库指针:我把origin理解为远程仓库的一个指针,指向摸个远程仓库,并且可以修改其指向。