导言:
在软件开发和团队协作中,版本控制系统是不可或缺的工具。Git作为最流行的分布式版本控制系统之一,提供了强大的功能和灵活的使用方式。本文将以我自己的文件路径为例,介绍如何通过Git进行版本控制和管理。
准备Git
下载地址
https://git-scm.com/
配置Git
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安
装成功!
打开命令窗口之后要设置一下姓名与邮箱地址
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --global --get user.name #得到user.name的值
$ git config --global -l #列表参数
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许
会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其
次,真的有冒充的也是有办法可查的。
注意 git config 命令的 --global 参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用
这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。这里我就不再过多阐述
本地文件的版本控制
1.创建版本库
- 打开git窗口。
2.导航到你要创建版本库的目录。例如,使用 cd 命令切换到该目录:
cd E:\learngit
3.初始化一个新的 Git 版本库:
git init
现在,你的目录中就创建了一个空的 Git 版本库。
- 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。通过 git init 命令把这个目录变成Git可以管理的仓库:
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现
当前目录下多了一个 .git 的目录(隐藏目录),这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目
录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到 .git 目录,那是因为这个目录默认是隐藏的,用 ls -ah 命令就可以看见。 - 首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网
页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个
单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制
系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改
成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 - 不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动
的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问
题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
使用Windows的童鞋要特别注意:千万不要使用Windows自带的记事本编辑任何文本文件。原因是
Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每
个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可
能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议
你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8
without BOM即可:
2. 添加文件到版本库
1.现在我们编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
ps:注意这个文件要放到刚刚版本库所在的目录,如果放到别处Git便找不到了
2.将文件添加到仓库(暂存区):执行以下命令将文件添加到Git仓库中:
$ git add readme.txt
- 这一步相当于将文件纳入Git的跟踪范围。
3.提交文件变更(由暂存区提交给分支)
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
$ git log
commit 6e4de12122b22ee3145dfa87af974d284f832dd2 (HEAD -> master)
Author: 799 <qwe799@163.com>
Date: Tue Jul 11 09:57:08 2023 +0800
wrote a readme file
- 这一步相当于保存了文件的当前状态,并生成了一个对应的提交记录。而且commit命令可以一次提交很多文件
4.查看提交历史:使用以下命令可以查看所有的提交历史记录:
git log
- 这个命令将显示每个提交的作者、日期、提交信息等信息,方便你追踪文件的变更历史。
5.使用git status查看git状态
git status
3. 版本控制
以readme文件作为演示文件
1.修改readme.txt文件(可以修改为任何东西)
Git is a distributed version control system.
Git is free software.
运行git status命令查看结果
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
- git status 命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们, readme.txt被修改过了,但还没有准备提交的修改。也就是现在还没有加到暂存区中
- 虽然Git告诉我们 readme.txt 被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如
你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的 readme.txt ,所以,需要用 git diff 这个命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
可以看到我们在第一行添加了一个distributed单词
2.提交到仓库(暂存区)
git add readme.txt
再次执行git status 查看当前仓库的状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
git status 告诉我们,将要被提交的修改包括 readme.txt 。
3.提交到分支
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后,我们再用 git status 命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
readme演示文件的版本回退
1.再次修改并提交文件readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL
$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)
2.查看版本
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
可以看到有三次提交 ,最近的一次是append GPL,上一次是add distributed,最早一次是wrote a readme file
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:
ps:前面的1094adb…是commit id(版本号)
3.1.版本回退
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
在git中HEAD表示当前版本,也就是最新的提交1094adb… (注意我的提交ID和你的肯定不一样),上一个版本就是 HEAD^ ,上上一个版本就是
HEAD^^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。
再次查看readme.txt文件
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
可以看到版本被回退了,也就是文件被还原了
再次查看提交历史
$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
可以发现最新的那个版本已经没有了
但是如果你版本回退的多了其实也有方法可以返回的
找到对应版本的commit id 放在hard后面可以直接返回。
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
但是commit id 不用一整个全复制下来,也不能只复制前一两位,建议复制5~6位
git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD`时,表示最新的
版本。
--soft :仅仅移动本地库 HEAD 指针
--mixed: 移动本地库 HEAD 指针,重置暂存区
--hard:移动HEAD指针,重置暂存区,工作区,省略git checkout -- file
再次查看readme文件即可看到文件又来到了前面写的GPL版本
另外Git还有一个命令 git reflog用来记录你的每一次命令
可以通过这个命令来找寻之前的操作
git reflog
远程仓库
可以自己搭建一个远程仓库,不过也可以使用现有的git远程库
,应用比较广泛的有 1.github 2.gitee
1.使用ssh协议:
ssh基于非对称加密的免密登录原理
2.创建SSH key
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可以直接跳到第三步
打开shell(windows下打开git bash)创建ssh key
$ ssh-keygen -t rsa -C "qwe799@163.com"
#用户宿主目录下.ssh c:\Users\Administrator\.ssh\
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到 .ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个文件,这
两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放心地告诉任
何人。
3:登陆GitHub
打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴 id_rsa.pub 文件的内容:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提
交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
4. HTTS协议
当然不配置公钥也可以使用HTTS协议,在使用HTTPS协议时输入用户名/密码
5. 克隆
使用https协议
git clone https://gitee.com/halo-dev/halo.git
#第一次访问需要输入gitee的用户名密码
halo:开源博客系统,基于spring boot和vue
使用ssh协议
1 git clone git@gitee.com:halo-dev/halo.git
对称加密与非对称加密
非对称加密
非对称加密是一种加密算法,使用了一对密钥,即公钥和私钥。它与对称加密算法不同,对称加密算法使用相同的密钥进行加密和解密。
下面是非对称加密的基本原理和一般流程:
1.密钥生成:首先,生成一对密钥,包括公钥和私钥。公钥可以被分享给其他人,而私钥必须保密。
2.加密过程:
加密方使用接收方的公钥对要发送的数据进行加密。
加密后的数据只能通过配对的私钥进行解密。
3.解密过程:
接收方使用自己的私钥解密收到的数据。
解密后,原始数据将恢复出来。
4.非对称加密算法通常用于以下目的:
1.保护通信安全:非对称加密在网络通信中起着重要作用,例如,HTTPS 使用非对称加密来确保网站和客户端之间的安全通信。
2.数字签名:非对称加密可用于创建和验证数字签名。发送方使用私钥对消息进行签名,接收方使用发送方的公钥来验证签名的真实性。
3.密钥交换:非对称加密可用于安全地交换对称加密算法所需的密钥。发件人使用接收者的公钥加密对称密钥,并将其发送给接收者。接收者使用自己的私钥解密对称密钥。
常见的非对称加密算法包括 RSA、DSA、ECC 等。
请注意,非对称加密算法相比对称加密算法更为计算密集,因此通常在对机密数据进行传输或签名等特定场景使用。对于大规模的数据加密,通常会使用对称加密算法,并使用非对称加密算法来安全地交换对称密钥。
对称加密
对称加密是一种加密方法,加密和解密过程中使用相同的密钥。在对称加密中,发送方使用该密钥对数据进行加密,接收方使用相同的密钥对密文进行解密,以获取原始数据。
以下是对称加密的一般步骤:
1.密钥生成:首先,需要生成一个加密密钥。这个密钥可以是一串随机的比特序列,并且必须保持机密。
2.加密:发送方使用生成的密钥将明文(需要加密的数据)转换为密文(加密后的数据)。加密算法将密钥和明文作为输入,生成密文作为输出。常见的对称加密算法有DES、AES和RC4等。
3.传输:发送方将加密后的密文发送给接收方,可以通过网络、存储介质等方式传输。由于密钥必须保密,所以在传输过程中需要采取措施确保密钥的安全性。
4.解密:接收方使用之前与发送方共享的密钥对密文进行解密,恢复为原始的明文。解密算法将密钥和密文作为输入,生成明文作为输出。
对称加密的优点包括:
- 处理速度快:对称加密算法通常具有高速且高效的处理能力,适用于大量数据的加密和解密。
- 实现简单:对称加密算法的实现相对较简单,只需一个密钥进行加密和解密操作。
然而,对称加密也存在一些挑战:
- 密钥管理:在使用对称加密时,发送方和接收方必须共享相同的密钥,因此需要确保密钥的保密性。
- 安全性依赖于密钥分发:对称加密的安全性在很大程度上取决于密钥的安全分发,密钥如果被第三方获取,数据的机密性将受到威胁。
总结而言,对称加密是一种简单而高效的加密方法,适用于需要处理大量数据的场景。但是,在需要安全分发密钥和保护密钥安全性的情况下,需要注意对称加密算法的限制。
工作区和暂存区详解
当使用 Git 进行版本控制时,有三个关键概念:工作区、暂存区和版本库(或仓库)。下面是一个简单的图示,说明了它们之间的关系:
+-------------------+
| 版本库(仓库) |
| (Repository) |
+-------------------+
| |
| 提交历史 |
| |
+-------------------+
| |
| 暂存区 |
| (Staging Area) |
+-------------------+
| |
| 工作区 |
| (Working Directory)|
| |
+-------------------+
-
工作区(Working Directory)是您在计算机上查看和编辑文件的目录。它是您当前正在工作的项目的实际文件夹。这些文件通常被认为是未被 Git 跟踪的文件。
-
暂存区(Staging Area)是位于 Git 仓库中的一个中间位置。当您进行 git add 命令时,将会把更改添加到暂存区。暂存区保存待提交的更改,但尚未被记录在版本库中。
-
版本库(Repository)是 Git 仓库中的数据库,用于存储整个项目的历史记录和元数据。它包含所有已经提交的更改,以及与这些更改相关的信息,例如作者、日期和提交消息。
Git 的基本工作流程如下:
在工作区 (Working Directory) 中进行文件的编辑和修改。
使用 git add 命令将所做的更改添加到暂存区 (Staging Area)。
使用 git commit 命令将暂存区的更改提交到版本库 (Repository)。
通过这种方式,您可以选择性地将更改添加到暂存区,并在完成一组相关更改后将它们作为一个逻辑单元提交到版本库中。
提交历史是指在 Git 仓库中记录的每次提交操作的信息。它包含了每次提交的作者、时间戳、提交消息等相关信息。提交历史可以用来跟踪项目的演变和更改的详细记录。
在提交历史中,每个提交都有一个唯一的哈希值来标识。这个哈希值就像是一个指纹,用于唯一标识每个提交。通过哈希值,您可以回溯到任意一个提交并查看它的详细信息。
您可以使用 git log 命令来查看提交历史。该命令会列出最近的提交,并按时间顺序进行排序。以下是一个示例:
$ git log
commit abcdefg1234567890 (HEAD -> master)
Author: John Doe <johndoe@example.com>
Date: Mon Jul 12 11:30:00 2023 +0800
Add new feature
commit 1234567890abcdefg
Author: Jane Smith <janesmith@example.com>
Date: Sun Jul 11 15:45:00 2023 +0800
Fix bug in login functionality
commit 9876543210gfedcba
Author: John Doe <johndoe@example.com>
Date: Sat Jul 10 09:20:00 2023 +0800
Initial commit
上面的输出展示了三个提交,每个提交都包含了作者、时间戳和提交消息。最新的提交在最上方,而最早的提交在最下方。
通过查看提交历史,您可以了解每次提交所做的更改、与其他提交的关系以及项目的演化过程。这对于跟踪问题、复查代码以及合并分支等任务非常有用。