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
中运行。
有两种方式:
-
ssh-keygen
直接生成,不加参数,然后一路回车。
第一个回车处其实是为了让你输入创建的公钥和私钥的路径,这里我们默认的路径为user/.ssh/~
,我们不做更改。
第二个回车处是要设置密码(这里不设置密码)
第三个回车处是要确认密码的(由于上一个回车处没有设置密码,所以这里也直接回车,要是你设置了密码,那么就输入密码,在回车)。
建议路径使用默认配置,密码不设置。这样每次git push
等操作都不需要输入密码,比较方便。
-
ssh-keygen -t rsa -C "你的邮箱"
和ssh-keygen -t rsa -b 4096 -C "你的邮箱"
先来解释参数:
-t
是type的缩写即我们所说的加密类型。
这里的加密类型有两种,一个是RSA
另一个是DSA
。
RSA
:RSA
加密算法是一种非对称加密算法,是由三个麻省理工的牛人弄出来的,RSA
是他们三个人姓的开头首字母组合。(默认情况下就是生成这种秘钥,就是直接用ssh-keygen
然后一路回车)。DSA
:是Schnorr
和ElGamal
签名算法的变种。
所以现在知道rsa
是啥了吧,就是选择的加密方式啊。
-C
表示提供一个注释,用于识别这个密钥。 可以省略。
引号
里的内容为注释的内容,所以"双引号里面不一定得填邮箱,可以输入任何内容。
-b
b是bit的缩写,-b
指定密钥长度。对于RSA
密钥,最小要求768位,默认是2048位。4096指的是RSA
密钥长度为4096位。DSA
密钥必须恰好是1024位(FIPS
186-2 标准的要求)。
掌握了上面内容,你大概就知道了什么是秘钥和如何生成秘钥了吧。
5. 作用
ssh
指secure shell
(一种安全的网络协议),git使用这种协议进行远程加密登录。
ssh
登录安全性由非对称加密保证,产生密钥时,一次产生两个密钥,一个公钥,一个私钥,在git
中一般分别命名为id_rsa.pub
, id_rsa
这里我解释一下上面生成的两个秘钥id_rsa.pub
, id_rsa
,第一个id_rsa.pub
我们喜欢叫它公钥,相对的第二个id_rsa
则叫私钥,相信你应该明白为啥怎么叫吧,.pub
公开的的单词缩写。
ssh
方式单独使用非对称的秘钥进行认证和加密传输,和账号密码分离开来,不需要账号也可以访问repo
。
git
基于多种传输协议,其中最常用的就是https
和ssh
。都是为了数据传输安全,那么设置ssh密钥的目的是为了节省输入用户名密码的过程,同时保证传输安全。并不是必须设置的,只不过在你每次上传数据的时候,都要输入一遍用户名和密码而已。
远端与本地配置
1. 配置过程
- 在本地
Git Bash
中设置每次提交版本的用户名及邮箱
git config --global user.name "你的用户名" # 这里的用户名和邮箱不一定必须和github账户一样,这个设置的目的是,当你提交版本后,会有记录,表示是谁提交的。
git config --global user.email "你的邮箱"
如果去掉 --global
参数只对当前仓库有效。
创建完提交的用户名和邮箱后,你可以用命令查看
git config --global --list
- 生成秘钥(上面提到了很多种生成方式,我们用最简单的一种,哈哈哈)
当你再次生成的时候你会发现出现了Overwrite (y/n)?
不要担心,这是问你是否覆盖之前创建的秘钥,输入y
然后一路回车就好。默认情况下,生成的秘钥是在这个路径下 /C盘/你的用户名/.ssh/..
。
- 配置
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的一些基本操作和基本概念,跟上节奏。首先,本地仓库的数据会存在三个区:工作区、暂存区、版本库
。加上远端仓库就是四个区了。这里先暂时不管远端仓库,就只对本地仓库进行介绍。
1. 创建Git本地仓库
创建仓库有两种方式,一种是自己命令行手动创建、还有一种就是将例如github
或者gitee
上的仓库下载下来使用。这两种方式都需要学会。因为无论是你创建项目要用到版本管理,还是想要下载别人的项目进行大胆创新,都是避不开的。
- 克隆一个
我们先介绍克隆的方式,这也是最简单的一种方式,创建一个版本管理库。
首先,我们需要运行一下命令。
git clone [url](链接) <directory>(路径,不写默认当前路径)
# git clone https://github.com/2821150049/Grocer.git
这个时候,你就可以在自己的当前目录下看到一个从github
上克隆下来的Grocer
文件夹啦。这也就是整个Git
项目的工程文件。点开文件夹,你会看到一个.git
文件夹,其中有关于当前仓库的git
的所有配置。及项目相关的所有代码及说明文档。
- 手动创建
运行一下命令:
mkdir text01 # 创建一个文件夹
cd text01 # 跳转到你想管理的仓库下
git init # 初始化本地仓库,按回车之后,会生成一个.git文件夹,用来管理你的仓库
# 出现这句话 Initialized empty Git repository in F:/xxx/test01/.git/ ,那么你的本地仓库就已经创建成功。这个时候你的本地仓库除了.git之外是啥东西也没有的。我们可以添加一个.md文档进去,用于填写一些基本信息。
2. 提交本地修改指令
首先,我们在上一步,不是创建了一个文件吗,这个文件是还没有加入到版本库的,我们需要进行下面的操作,才能将常见的xxx.md
文档提交到版本库中,由版本库进行管理。
-
status
:查看仓库当前的状态,显示有变更的文件。
指令 | 功能 |
---|---|
git status |
查看在你上次提交之后是否有对文件进行再次修改 |
git status -s |
获得简短的输出结果 |
$ git status -s
?? README.md
# 前面会有??两个参数,我们成为两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。新添加的未跟踪文件前面有??标记。新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。
-
add
:这个指令就是将工作区的文件或者是文件夹提交到暂存区保存。
指令 | 功能 |
---|---|
git add <file> .. |
添加一个或多个文件到暂存区 |
git add [dir] |
添加指定目录到暂存区,包括子目录 |
git add . |
添加当前目录下的所有文件到暂存区 |
$ git add .
# 啥也没出现表示添加成功,有可能因为编码问题,会显示警告,可以不用管
$ git status -s
M README.md
# 正常添加到了暂存区
-
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
上面是指令其实都要记住,多练习两遍就好。
-
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
-
log
:查看提交历史
这个指令是用来干嘛的呢,当然是查看你的提交信息啦!!!记住是查看提交信息。具体内容看列表。
指令 | 功能 |
---|---|
git log |
查看历史提交记录 |
git log --oneline |
使用简介的方式列出提交记录 |
git log --reverse |
逆向列出提交日志 |
--author="用户名" |
指定列出用户提交的日志 |
-
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
这个不在这里面的,这个指令,是指克隆远端的某一个仓库到本地文件夹下。
-
pull
:从远程获取代码并合并本地的版本
指令 | 功能 |
---|---|
git pull |
更新 |
git pull <远程主机名> <远程分支名>:<本地分支名> |
将远程主机的分支拉取过来,与本地的分支合并 |
注意:要是远程分支和本地分支一致,那么:
及后面的内容可以删掉。
-
push
:上传远程代码并合并
git push <远程主机名> <本地分支名>:<远程分支名>
:将本地的分支版本上传到远程并合并。
-
fetch、merge
:从远程获取代码库
这其实是 git pull
的一个分离指令,先用 git fetah >远程主机名<
获取远端仓库数据,在用 git merge >远端主机名</>远程分支名<
合并。
-
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
分支,这个分支和别的分支是一样的,不过一般我们都将其认为是主分支,其他分支版本为别的开发版本分支。负责不同的功能及模块,最后合并到主分支上。
-
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
-
checkout
切换分支
指令 | 功能 |
---|---|
git checkout >branchname< |
切换到branchname 分支 |
git checkout -b >branchname< |
创建branchname 并切换过去 |
-
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.
# 这里的冲突时因为,两个不同的分支对同一个文件进行修改产生的,现在需要手动将冲突解决,然后在提交到本地库。当然你也可以不修改直接提交,那么也会显示冲突解决。
添加标签:没怎么用到,官网和菜鸟都有讲解