ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Git使用

2022-01-05 15:39:51  阅读:119  来源: 互联网

标签:git 仓库 暂存区 Git SSH 提交 使用 分支


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直接生成,不加参数,然后一路回车。

1

第一个回车处其实是为了让你输入创建的公钥和私钥的路径,这里我们默认的路径为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

2

  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的一些基本操作和基本概念,跟上节奏。首先,本地仓库的数据会存在三个区:工作区、暂存区、版本库。加上远端仓库就是四个区了。这里先暂时不管远端仓库,就只对本地仓库进行介绍。

3

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.
# 这里的冲突时因为,两个不同的分支对同一个文件进行修改产生的,现在需要手动将冲突解决,然后在提交到本地库。当然你也可以不修改直接提交,那么也会显示冲突解决。

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

标签:git,仓库,暂存区,Git,SSH,提交,使用,分支
来源: https://www.cnblogs.com/-xxhh-/p/15767219.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有