文章目录

  • git下载与配置
  • 公开秘钥算法
  • git重点知识简介
  • 一个曾出现过的error


git下载与配置

关于git的下载,去官网下载好安装包,直接安装即可。配置中会用到下面的命令。

# global为全局参数,表示本地所有仓库都会用到这个配置
git config --global user.name "yourname"   
git config --global user.email "your_email@youremail.com"

公开秘钥算法

最后的最后,记一下最近了解的和git配置公钥私钥有关系的公开秘钥算法
简单用一句话来说就是

加密秘钥和解密秘钥是不同的。并且从加密秘钥不能得到解密密钥。

说的科学严谨点就是

记加密算法为E,解密算法为D,要加密的数据为P。满足:
1.D(E(P))= P
2.从E导出D非常困难
3.破译者即使能加密任意的选择明文,也无法破译密码。
满足以上三个条件,则加密算法可以完全空开。

在这种算法中,每个用户都有两个密钥,其中加密秘钥是供向他人发送报文用的,这是公开的。解密密钥是用于对收到的密文进行解密的,这是保密的。

在实际应用中,有个较好的算法是MIT一个研究小组所提出的RSA算法。
我简单的用代码实现了一下整个流程,如下:

/*RSA算法基于简单的数论事实:将两个大质数相乘十分容易,但是想要
对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。*/

#include<iostream>
using namespace std;
// <1> 选择两个大素数p, q (一般实际中超过几百位的10进制数)
// <2> 计算 n = p*q, z = (p-1)*(q-1)
// <3> 选择一个与z互质的数,令其为d
// <4> 找到一个e是的e*d=1(mod z)
// 理论上的推到可借助欧拉函数 
 
/*在一个安全实现中,Huge 最少要400位10进制数字*/
typedef unsigned long Huge; 

/*为RSA公钥定义一个数据结构,*/
typedef struct RsaPubKey{
    Huge e;
    Huge n;
}RsaPubkey;

/*为RSA私钥定义一个数据结构*/
typedef struct RsaPriKey{
    Huge d;
    Huge n;
}RsaPriKey;

// 加密过程就是 C = P的e次方mod n,解密就是P = C的d次方mod n 
static Huge modexp(Huge a, Huge b, Huge n){
    Huge y;
    /*使用二进制平方乘法计算 pow(a,b) % n*/
    y=1;   
    while(b != 0)
    {
        /*对于b中的每个1,累加y*/        
        if(b & 1)
            y = (y*a) % n;  
        /*对于b中的每一位,计算a的平方*/
        a = (a*a) % n;       
        /*准备b中的下一位*/
        b = b>>1;  
        }
    return y;
}

/*rsa_encipher RSA算法加密*/
Huge rsa_encipher(Huge plaintext, RsaPubKey pubkey){
	Huge ciphertext;
    ciphertext = modexp(plaintext, pubkey.e, pubkey.n);
    return ciphertext;
}
/*rsa_decipher RSA算法解密*/
Huge rsa_decipher(Huge ciphertext, RsaPriKey prikey){
	Huge plaintext;
	plaintext = modexp(ciphertext, prikey.d, prikey.n);
    return plaintext;
}

int main(){
	/*此处做一个简单演示 设p = 17, q = 11。则n = 187,z=160
    13与z=160互质,所以d可以为13,13*e = 1(mod z) 经计算选择
	e = 37 。所以公钥为(37,187) 私钥为(13,187)*/ 
	RsaPubKey pubkey;
	RsaPriKey prikey;
	pubkey.e=37;
	pubkey.n=187;
	prikey.d=13;
	prikey.n=187;
	/*这里要注意实际中明文转为的比特串要划分为一个个的数据块 
	进行加密。这里为了方便直接就一个数据块。这个数据块的大小有限制
	数据块的大小范围:      0<=P<=n
	如果为比特串,比特串的长度k的最大值满足:  2的k次方小于n*/ 
	Huge plaintext = 88; 
	Huge cipher = rsa_encipher(plaintext,pubkey);
	cout<<"加密后的密文:"<<cipher<<endl;
	Huge plain = rsa_decipher(cipher,prikey);
	cout<<"解密后的明文:"<<plain<<endl;
}

同时,也应当知道,RSA算法虽然安全方便,但是其运行速度较慢,因而通常只用来进行用户认证,数字签名或者发送一次性的密钥。数据加密仍使用密钥算法。

git重点知识简介

  • git本地仓库是由git维护的三个部分组成:
  1. 工作目录: 含有实际文件
  2. 暂存区: 类似于缓存区域,临时保存你的改动
  3. HEAD: 类似于指针,指向你最后一次提交的结果

例如执行

git add filename                 操作是将实际文件修改添加到暂存区
git commit -m "info"             将改动提交到本地的head 但是还没到远程仓库
git push origin master           可以将master换成任何你想要推送的分支
  • GitHub远程仓库中分支与主支
    分支和主支的区别,你可以理解为就是,分支是自己私人的空间,别人没办法看到和修改,主支大家都可以看到和修改。
    关于这块的详细解释,推荐一篇教程:
    GitHub分支管理 分支是用来将特性开发绝缘开来的。 在你创建仓库时,master
    是"默认的"分支,也即主分支
    ,串起来开始到现在git仓库的时间线
  1. 创建分支并切换
    $ git checkout -b newbran # -b参数表示创建并切换
    Switched to a new branch ‘newbran’
    以上这步也可这么分步执行
    $ git branch newbran
    $ git checkout newbran
    Switched to branch ‘newbran’
  2. 合并到主支:
    $ git merge newbran
    git merge命令用于合并指定分支到当前分支。
  3. 删除分支
    $ git branch -d newbran

注:

  1. git branch命令用于查看当前分支情况
  2. git最新版本提供了git switch命令来切换分支更容易理解。
  • 标签管理
    git中还有一个很方便的东西,叫做标签管理。详细介绍可去看详细教程。这里列出常用命令
  1. git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  2. git tag -a -m "blablabla…"可以指定标签信息;
  3. git tag可以查看所有标签。
  4. git push origin 可以推送一个本地标签;
  5. git push origin --tags可以推送全部未推送过的本地标签;
  6. git tag -d 可以删除一个本地标签;
  7. 命令git push origin :refs/tags/可以删除一个远程标签。

几个要知道的命令:
git status命令可以查看仓库当前的状态
git diff 查看difference,也就是到底哪里被修改了
git checkout – 可以丢弃工作区的修改
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
(最新版本提供了新的git switch命令)。
git reset HEAD 暂存区的修改撤销掉(unstage)
git当中的后悔药=— git reflog 在本地的仓库里执行会显示你执行的所有命令
git rm filename 删除文件
git reset --hard id 根据 id 回退到指定的版本

一个曾出现过的error

git解决error: The following untracked working tree files would be overwritten by checkout

(git bash中执行)git clean -d -fx

git clean 参数

-n 显示将要删除的文件和目录;

-x -----删除忽略文件已经对git来说不识别的文件

-d -----删除未被添加到git的路径中的文件

-f -----强制运行

git clean -n

git clean -df

git clean -f