Git使用

Git笔记

​ 学习Git代码管理库过程中难免会遇到很多不知道的东西,不要怕,遇到一个学一个,积少成多,就能全明白啦。

​ 首先简单介绍一下Github,这个东东可以认为是远端库(就是远端的仓库,离得很远很远的独立的内容管理空间)。下面知识拓展一下,这个网站端的远端库是由外国人发明的,所以全是英文,当然了国内也有远端库叫GitEE不过嘛,我用的不多。但是操作都是大同小异的。

SSHkey介绍

1. 概述

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。SSH使用频率最高的场合是类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持,Windows 10 1803版本已提供OpenSSH工具。

​ 在设计上,SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rlogin、rsh、rexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。

​ 不过,SSH也被指出有被嗅探甚至解密的漏洞。早在2011年,中国的互联网审查机构已经有能力针对SSH连线的刺探及干扰。而后爱德华·斯诺登泄露的文件也指出,美国国家安全局有时能够把SSH协议传输的信息解密出来,从而读出SSH会话的传输内容。2017年7月6日,非营利组织维基解密确认美国*情报局已经开发出能够在Windows或Linux操作系统中窃取SSH会话的工具。

2. 秘钥管理

​ 在Linux系统中,已许可登录的公钥通常保存在用户 /home 目录的 ~/.ssh/authorized_keys 文件中,该文件只由SSH使用。当远程机器持有公钥,而本地持有对应私钥时,登录过程不再需要手动输入密码。另外为了额外的安全性,私钥本身也能用密码保护。

​ 私钥会保存在固定位置,也可以通过命令行参数指定(例如ssh命令的“-i”选项)。ssh-keygen是生成密钥的工具之一。SSH也支持基于密码的身份验证,此时密钥是自动生成的。若客户端和服务端从未进行过身份验证,SSH未记录服务器端所使用的密钥,那么攻击者可以模仿服务器端请求并获取密码,即中间人攻击。但是密码认证可以禁用,而且SSH客户端在发现新密钥或未知服务器时会向用户发出警告。

3. 应用

​ SSH的经典用途是登录到远程电脑中执行命令。除此之外,SSH也支持隧道协议、端口映射和X11连接。借助SFTP或SCP协议,SSH还可以传输文件[2]。

​ SSH使用客户端-服务器模型,标准端口为22[11]。服务器端需要开启SSH守护进程以便接受远端的连接,而用户需要使用SSH客户端与其创建连接。

​ 大多数现代操作系统(包括macOS、大部分Linux、OpenBSD、FreeBSD、Solaris等系统)都提供了SSH,包括Windows系统也提供SSH程序(在Windows 10 1809版本之后)。在软件层次,许多关于SSH的专有软件、免费软件和开源软件被研发出来,如:

  • 文件管理软件(同步、复制、删除等)。如:PuTTY和Windows下的WinSCP、类Unix系统下的Konqueror等。
  • SSH客户端。

4. 秘钥生成

​ 首先需要运行指令,这个指令一般在Git_Bash黑窗口中运行,记住,是在安装好的的Git_Bash中运行。

​ 有两种方式:

  1. ssh-keygen直接生成,不加参数,然后一路回车。

Git使用

第一个回车处其实是为了让你输入创建的公钥和私钥的路径,这里我们默认的路径为user/.ssh/~,我们不做更改。

第二个回车处是要设置密码(这里不设置密码)

第三个回车处是要确认密码的(由于上一个回车处没有设置密码,所以这里也直接回车,要是你设置了密码,那么就输入密码,在回车)。

建议路径使用默认配置,密码不设置。这样每次git push等操作都不需要输入密码,比较方便。

  1. ssh-keygen -t rsa -C "你的邮箱"ssh-keygen -t rsa -b 4096 -C "你的邮箱"

先来解释参数:

-t是type的缩写即我们所说的加密类型。

这里的加密类型有两种,一个是RSA另一个是DSA

RSARSA加密算法是一种非对称加密算法,是由三个麻省理工的牛人弄出来的,RSA是他们三个人姓的开头首字母组合。(默认情况下就是生成这种秘钥,就是直接用ssh-keygen然后一路回车)。
DSA:是SchnorrElGamal签名算法的变种。

所以现在知道rsa是啥了吧,就是选择的加密方式啊。

-C表示提供一个注释,用于识别这个密钥。 可以省略。

引号里的内容为注释的内容,所以"双引号里面不一定得填邮箱,可以输入任何内容。

-bb是bit的缩写,-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。4096指的是RSA密钥长度为4096位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。

掌握了上面内容,你大概就知道了什么是秘钥和如何生成秘钥了吧。

5. 作用

sshsecure shell(一种安全的网络协议),git使用这种协议进行远程加密登录。
ssh登录安全性由非对称加密保证,产生密钥时,一次产生两个密钥,一个公钥,一个私钥,在git中一般分别命名为id_rsa.pub, id_rsa

​ 这里我解释一下上面生成的两个秘钥id_rsa.pub, id_rsa,第一个id_rsa.pub我们喜欢叫它公钥,相对的第二个id_rsa则叫私钥,相信你应该明白为啥怎么叫吧,.pub公开的的单词缩写。

ssh方式单独使用非对称的秘钥进行认证和加密传输,和账号密码分离开来,不需要账号也可以访问repo
git基于多种传输协议,其中最常用的就是httpsssh。都是为了数据传输安全,那么设置ssh密钥的目的是为了节省输入用户名密码的过程,同时保证传输安全。并不是必须设置的,只不过在你每次上传数据的时候,都要输入一遍用户名和密码而已。

远端与本地配置

1. 配置过程

  1. 在本地Git Bash中设置每次提交版本的用户名及邮箱
git config --global user.name "你的用户名" # 这里的用户名和邮箱不一定必须和github账户一样,这个设置的目的是,当你提交版本后,会有记录,表示是谁提交的。
git config --global user.email "你的邮箱"

如果去掉 --global 参数只对当前仓库有效。

创建完提交的用户名和邮箱后,你可以用命令查看

git config --global --list

Git使用

  1. 生成秘钥(上面提到了很多种生成方式,我们用最简单的一种,哈哈哈)

​ 当你再次生成的时候你会发现出现了Overwrite (y/n)?不要担心,这是问你是否覆盖之前创建的秘钥,输入y然后一路回车就好。默认情况下,生成的秘钥是在这个路径下 /C盘/你的用户名/.ssh/..

  1. 配置github

​ 点击用户头像,找到Settings,并点击,在左侧选项中找到含有SSH的哪一项并点击,你就会看到SSH keys这一项,并点击 New SSH key 表示新建秘钥。出现的第一个Title是为了告诉用户,这个秘钥是啥的秘钥,就是属于哪个主机的,不同主机连接github肯定有不同的秘钥啊。第二个框中Key则是输入公钥了,找到生成的公钥id_rsa.pub用记事本打开,并将内容复制粘贴到Key中。点击Add SSH Key按钮添加。最后会弹出让你输入账户密码的界面,输入密码就好啦。

完成了上面的内容,下面讲解Git的一些基础操作。


2. Git基操

官网教程:https://git-scm.com/book/zh/v2/Git-基础-获取-Git-仓库

​ 下面我简单介绍一下Git的一些基本操作和基本概念,跟上节奏。首先,本地仓库的数据会存在三个区:工作区、暂存区、版本库。加上远端仓库就是四个区了。这里先暂时不管远端仓库,就只对本地仓库进行介绍。

Git使用

1. 创建Git本地仓库

​ 创建仓库有两种方式,一种是自己命令行手动创建、还有一种就是将例如github或者gitee上的仓库下载下来使用。这两种方式都需要学会。因为无论是你创建项目要用到版本管理,还是想要下载别人的项目进行大胆创新,都是避不开的。

  1. 克隆一个

​ 我们先介绍克隆的方式,这也是最简单的一种方式,创建一个版本管理库。

​ 首先,我们需要运行一下命令。

git clone [url](链接) <directory>(路径,不写默认当前路径)
# git clone https://github.com/2821150049/Grocer.git

这个时候,你就可以在自己的当前目录下看到一个从github上克隆下来的Grocer文件夹啦。这也就是整个Git项目的工程文件。点开文件夹,你会看到一个.git文件夹,其中有关于当前仓库的git的所有配置。及项目相关的所有代码及说明文档。

  1. 手动创建

运行一下命令:

mkdir text01 # 创建一个文件夹
cd text01 # 跳转到你想管理的仓库下
git init # 初始化本地仓库,按回车之后,会生成一个.git文件夹,用来管理你的仓库
# 出现这句话 Initialized empty Git repository in F:/xxx/test01/.git/ ,那么你的本地仓库就已经创建成功。这个时候你的本地仓库除了.git之外是啥东西也没有的。我们可以添加一个.md文档进去,用于填写一些基本信息。

2. 提交本地修改指令

​ 首先,我们在上一步,不是创建了一个文件吗,这个文件是还没有加入到版本库的,我们需要进行下面的操作,才能将常见的xxx.md文档提交到版本库中,由版本库进行管理。

  1. status:查看仓库当前的状态,显示有变更的文件。
指令 功能
git status 查看在你上次提交之后是否有对文件进行再次修改
git status -s 获得简短的输出结果
$ git status -s
?? README.md
# 前面会有??两个参数,我们成为两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。新添加的未跟踪文件前面有??标记。新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。
  1. add:这个指令就是将工作区的文件或者是文件夹提交到暂存区保存。
指令 功能
git add <file> .. 添加一个或多个文件到暂存区
git add [dir] 添加指定目录到暂存区,包括子目录
git add . 添加当前目录下的所有文件到暂存区
$ git add .
# 啥也没出现表示添加成功,有可能因为编码问题,会显示警告,可以不用管
$ git status -s
M  README.md
# 正常添加到了暂存区
  1. diff:比较文件的不同,并显示出来修改的地方。
指令 功能
git diff <file>/[dir] 显示暂存区和工作区的差异
git diff --cached [file] (--staged [file]) 比对已暂存文件与最后一次提交的文件差异
git diff [first-branch]...[second-branch] 显示两次提交之间的差异
$ git diff
diff --git a/xxhh.txt b/xxhh.txt
index cf0389a..e7078c2 100644
--- a/xxhh.txt
+++ b/xxhh.txt
@@ -1,6 +1,6 @@
 1
 2
-3
+9
 4
 5
 6
\ No newline at end of file

上面是指令其实都要记住,多练习两遍就好。

  1. commit:提交暂存区到版本库。

我们在使用git add将文件写入暂存区之后,需要从暂存区提交到版本库。

指令 功能
git commit -m "备注信息" 提交暂存区到本地仓库
git commit >file< -m "备注信息" 提交暂存区的指定文件到仓库
git commit -am "备注信息" -a参数设置修改文件后不需要执行 git add 命令,直接来提交
git commit --amend 覆盖上一次提交内容

在提交之后,在记录中会显示提交者的用户信息和邮箱,也就是上面配置过程中第一步配置的内容。

$ git commit -m "提交文件"
[master (root-commit) dc38776] 提交文件
 2 files changed, 15 insertions(+)
 create mode 100644 README.md
 create mode 100644 xxhh.txt
  1. log:查看提交历史

这个指令是用来干嘛的呢,当然是查看你的提交信息啦!!!记住是查看提交信息。具体内容看列表。

指令 功能
git log 查看历史提交记录
git log --oneline 使用简介的方式列出提交记录
git log --reverse 逆向列出提交日志
--author="用户名" 指定列出用户提交的日志
  1. reset:命令用于回退版本,可以指定退回某一次提交的版本
指令 功能
git reset (--mixed)(默认) HEAD 用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset --hard HEAD 将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git reset --soft HEAD 参数用于回退到某个版本

3. 提交远端仓库

​ 提交远端仓库的指令其实就只有四个,git push、git pull、git remote、git fetch,之前我们提到过一个 git clone这个不在这里面的,这个指令,是指克隆远端的某一个仓库到本地文件夹下。

  1. pull:从远程获取代码并合并本地的版本
指令 功能
git pull 更新
git pull <远程主机名> <远程分支名>:<本地分支名> 将远程主机的分支拉取过来,与本地的分支合并

注意:要是远程分支和本地分支一致,那么及后面的内容可以删掉。

  1. push:上传远程代码并合并

git push <远程主机名> <本地分支名>:<远程分支名>:将本地的分支版本上传到远程并合并。

  1. fetch、merge:从远程获取代码库

这其实是 git pull的一个分离指令,先用 git fetah >远程主机名< 获取远端仓库数据,在用 git merge >远端主机名</>远程分支名< 合并。

  1. remote:远程仓库操作
指令 功能
git remote -v 查看信息
git remote add [shortname] [url] 添加远程版本库
git remote rm name 删除远程仓库
git remote rename old_name new_name 修改仓库名
$ git remote -v
Grocer  https://github.com/2821150049/Grocer.git (fetch)
Grocer  https://github.com/2821150049/Grocer.git (push)

4. 分支管理

​ 默认情况下会创建master分支,这个分支和别的分支是一样的,不过一般我们都将其认为是主分支,其他分支版本为别的开发版本分支。负责不同的功能及模块,最后合并到主分支上。

  1. branch创建分支
指令 功能
git branch 查看分支
git branch >testname< 创建testname分支
git branch -a 查看所有分支,包含未下载分支
git branch -d >branchnanme< 删除branchname分支
git branch -v 查看每一个分支的最后一次提交
git branch --no-merged 查看未合并分支
$ git branch -a		# 查看所有分支
  ccmaster
* main
  remotes/Grocer/HEAD -> Grocer/main
  remotes/Grocer/main
  1. checkout切换分支
指令 功能
git checkout >branchname< 切换到branchname分支
git checkout -b >branchname< 创建branchname并切换过去
  1. merge 合并分支,合并后的分支会出现好好几种不同的情况。
指令 功能
git merge >needbranch< needbranch分支内容合并到当前分支
1. 第一种合并
$ git checkout master	# 切换到master分支
$ git merge hotfix		# 将hotfix分支和到master
Updating f42c576..3a0874c
Fast-forward		# 这里的合并其实是HEAD指针的一次移动,我们也叫快进。这个时候就会master和hotfix同时指向这个版本,那么需要删除多余的分支hotfix
 index.html | 2 ++
 1 file changed, 2 insertions(+)
 =================================================
2. 第二种合并(产生冲突的合并)
 $ git merge main
Auto-merging 文档/xxx.txt
CONFLICT (content): Merge conflict in 文档/xxx.txt
Automatic merge failed; fix conflicts and then commit the result.
# 这里的冲突时因为,两个不同的分支对同一个文件进行修改产生的,现在需要手动将冲突解决,然后在提交到本地库。当然你也可以不修改直接提交,那么也会显示冲突解决。

添加标签:没怎么用到,官网和菜鸟都有讲解

上一篇:VScode常见问题汇总


下一篇:git学习