Linus在1991年创建了开源的Linux,Linux的代码是如何管理的呢?Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!
Git是目前世界上最先进的分布式版本控制系统,那什么是版本控制系统?
能够记录文档的改动历史
能够回滚到任意一个修改时间点
能够协作编辑文件
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候, 用的都是自己的电脑,所以要先从中央服务器取得最新的版本, 然后开始干活,干完活了,再把自己的工作推送给中央服务器。 中央服务器就好比是一个图书馆,你要改一本书, 必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A, 这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多, 因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧, 随便从其他人那里复制一个就可以了。 而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。 分布式版本控制系统通常也有一台充当“中央服务器”的电脑, 但这个服务器的作用仅仅是用来方便“交换”大家的修改, 没有它大家也一样干活,只是交换修改不方便而已。

最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。 我用的是Centos7.5版本,首先,可以试着输入Git,看看系统有没有安装Git:
[root@server ~]# yum install -y git
安装完成后,还需要最后一步设置,在命令行输入:
[root@server ~]# git config --global user.name "chao"
[root@server ~]# git config --global user.email "3386785198@qq.com"
[root@server ~]# git config --list
注意git config命令的--global参数,用了这个参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
5、git的安装与版本库的创建
版本库又叫仓库,英文名repository ,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以 还原
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
[root@server ~]# mkdir -p /data/mygit
[root@server ~]# cd /data/mygit
通过git init 命令把这个目录变成Git可以管理的仓库:
[root@server mygit]# git init
初始化空的 Git 版本库于 /data/mygit/.git/
[root@server mygit]# ls -a
. .. .git
注意:初始化之后当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
6、把文件添加到版本库
请注意,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
[root@server mygit]# vim readme.txt
git is a version
注意:上述文件一定要放到mygit目录下(子目录也行),因为这是一个Git仓库。
下面是将文件添加到仓库和提交到仓库
[root@server mygit]# git add readme.txt
[root@server mygit]# git commit -m "add files readme.txt"
[master(根提交) 4793fe7] add files readme.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.txt
还可以一次提交多次文件
[root@server mygit]# cp /etc/hosts .
[root@server mygit]# cp /etc/resolv.conf .
[root@server mygit]# git add hosts resolv.conf
[root@server mygit]# git commit -m "add two files"
[master f6a2ae4] add two files
2 files changed, 5 insertions(+)
create mode 100644 hosts
create mode 100644 resolv.conf
7、git版本回退、文件修改、撤销与删除
修改readme.txt文件内容如下
[root@server mygit]# echo "git is a version ok" > readme.txt
[root@server mygit]# cat readme.txt
git is a version ok
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 05e0843..fd78016 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-git is a version
+git is a version ok
[root@server mygit]# git add readme.txt
[root@server mygit]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: readme.txt
#
[root@server mygit]#git commit -m "add ok"
[master 7ebead4] add ok
1 file changed, 1 insertion(+), 1 deletion(-)
[root@hd1 mygit]#
[root@hd1 mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区
----------------------------------------------
#git 回退 首先修改readme.txt文件
[root@server mygit]# cat readme.txt
git is a version ok
git is very good
[root@server mygit]# git add readme.txt
[root@server mygit]# git commit -m "add a line"
#查看修改的日志
[root@server mygit]# git log
commit c46361af969cf7cac5b60f7217d1f629b616c328
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 14:25:44 2021 +0800
add a line
commit 7ebead447739c2d93d59bb39df0c24777f83141a
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 14:21:51 2021 +0800
add ok
commit 8f1ea6afbfe4b634bd8df9f65333ddf3dbf201e3
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 12:02:33 2021 +0800
add two files
commit da2ae5b05ac02d56e9039defde163b0d8d6a5e0e
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 11:55:37 2021 +0800
add files readme.txt
那么如何将readme.txt 回退到上一个版本呢,首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
[root@hd1 mygit]# git reset --hard HEAD^
HEAD 现在位于 7ebead4 add ok
[root@hd1 mygit]# cat readme.txt
git is a version ok
[root@hd1 mygit]# git log
commit 7ebead447739c2d93d59bb39df0c24777f83141a
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 14:21:51 2021 +0800
add ok
commit 8f1ea6afbfe4b634bd8df9f65333ddf3dbf201e3
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 12:02:33 2021 +0800
add two files
commit da2ae5b05ac02d56e9039defde163b0d8d6a5e0e
Author: duoduo <wmbenet@126.com>
Date: Sat Aug 7 11:55:37 2021 +0800
add files readme.txt
以上可以看到我们回退到上一次的内容中了 ,这里有一个问题我想恢复到,恢复操作之前的状态怎么办?
下面是见证奇迹的时刻,c46361af969cf是部分commit的编号
[root@server mygit]# git reset --hard c46361af969cf
HEAD 现在位于 c46361a add a line
[root@server mygit]# cat readme.txt
git is a version ok
git is very good
Git的版本回退速度非常快,因为Git在内部有一个指针,如下图所示:

关于回退,还有个命令
[root@server mygit]# git reflog
c46361a HEAD@{0}: reset: moving to c46361af969cf
7ebead4 HEAD@{1}: reset: moving to HEAD^
c46361a HEAD@{2}: commit: add a line
7ebead4 HEAD@{3}: commit: add ok
8f1ea6a HEAD@{4}: commit: add two files
da2ae5b HEAD@{5}: commit (initial): add files readme.txt
[root@server mygit]#
8、工作区和暂存区
工作区(Working Directory)就是你在电脑里能看到的目录,比如我的mygit文件夹就是一个工作区。
工作区有个隐藏的目录 .git ,这个不算工作区,而是git的版本库。git的版本库里存了很多东西,其中最重要的就是称为stage (或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:
第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
可以简单理解为,需要提交文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
9、git管理是修改而非文件
什么是修改?比如你新增加了一行,这就是修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又增加了一些,也是一个修改,而创建一个新文件,也是一个修改。
10、git如何撤销修改
我们写代码犯错是难免的,但是git允许你犯错,因为git有撤销修改的功能,git checkout --file 可以丢弃工作区的修改:
例1:只是在工作区进行了修改,并未进行add到暂存区
[root@server mygit]# echo "git 7788" >readme.txt
[root@server mygit]# cat readme.txt
git 7788
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# git checkout -- readme.txt
[root@server mygit]# cat readme.txt
git is a version ok
git is very good
例2:在工作区进行了修改,并且add到了暂存区
[root@server mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@server mygit]# cat readme.txt
git 7788
[root@server mygit]# echo "hao xiang ku " >readme.txt
[root@server mygit]# git add readme.txt
[root@server mygit]#
[root@server mygit]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: readme.txt
#
[root@server mygit]# git reset HEAD readme.txt
重置后撤出暂存区的变更:
M readme.txt
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# cat readme.txt
hao xiang ku
[root@server mygit]# git checkout -- readme.txt
[root@server mygit]# cat readme.txt
git 7788
注意:git checkout -- 后面有空格,有空格,有空格,让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file 命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
举例: 总结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
11、git删除文件
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
1)删除后,通过git恢复文件
[root@server mygit]# rm -rf readme.txt
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# git checkout -- readme.txt
[root@server mygit]# ls
readme.txt resolv.conf
2 )彻底删除,需要三个步骤
[root@server mygit]# rm -rf readme.txt
[root@server mygit]#
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# git rm readme.txt
rm 'readme.txt'
[root@server mygit]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 删除: readme.txt
#
[root@server mygit]# git commit -m "delete readme.txt"
[master fefbe0e] delete readme.txt
1 file changed, 1 deletion(-)
delete mode 100644 readme.txt
[root@server mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区
2)注册https://gitee.com账号

3)在本地生成ssh公钥私钥对
[root@server mygit]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:6hwC1WNisvjI4MQMfweNH82B8a79J6kxbkSq00WNri8 root@server
The key's randomart image is:
+---[RSA 2048]----+
| .o. |
| +.+ . |
|. . * * +o |
|+o = = ++ . |
|o++ . o=S |
|=o o ..++ |
|.o. .o+++ . |
| o+Eo.+o . |
| .o++..o |
+----[SHA256]-----+
[root@server mygit]# cd /root/.ssh
[root@server .ssh]# ll
总用量 8
-rw-------. 1 root root 1679 6月 5 18:42 id_rsa
-rw-r--r--. 1 root root 393 6月 5 18:42 id_rsa.pub
[root@server .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdyhTmMNhOd6SkZAB+Kt/EldBizJ+Ks6E7syuQ23Eg/QHtLYBW/0P3NXI+40QxX9SLsPTA3CaM4VimaQLhtl0oyljC7HkczlqbtQMGyXxUpyUZgymZMTiS07pzrOMwVJ5W/oKsUA+UbOWYHvG4bfQhhs1kdMI1LAHYMYc7IBVrwE7WKjYKQUzr7ERHJGXg35Wvpezmz9iaqqiTcTdYsaSxtCJtFNBVB+RhhjTUlGB97EtJD5eaTX5wXfbdq491rqD8hfBxSOoiyR8fJti6WERU/uvOKO1Koep9ncI7mj+Fkif3T1uybj7VAkh2aeam0TjSE52vfv2i15weiyiuxcTL root@server
[root@server .ssh]#
将上面的公钥内容复制到gitee上面

创建完毕仓库之后,gitee上有git命令的提示,我们可以参考一下这些命令

5)本地仓库和远程仓库进行同步
本地仓库和远程仓库进行关联
[root@server mygit]# git remote add origin git@gitee.com:zhang7433892/mygit.git
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的
接下来我们将本地的仓库文件push上传到远程的服务器
[root@server mygit]# git push -u origin master
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (20/20), 1.85 KiB | 0 bytes/s, done.
Total 20 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To git@gitee.com:wmbenet/mygit.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
查看本地文件
[root@server mygit]# ls
resolv.conf
刷新页面,发现文件已经上传

我们再上传一个文件
[root@server mygit]# cp /root/anaconda-ks.cfg .
[root@server mygit]# git add anaconda-ks.cfg
[root@server mygit]# git commit -m "add ks.cfg"
[root@server mygit]# git push origin master
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1.31 KiB | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.3]
To git@gitee.com:zhang7433892/mygit.git
3871dbd..d5931d1 master -> master
上面最后一个命令,因为是第二次执行,所以 -u参数就可以去掉了。
远程仓库也同步成功了

6)从远程库克隆
前面我们讲了先有本地库,后有远程库的时候,如何进行远程关联,现在,假设我们从零开发,最好的方式就是从远程克隆
假设我们有一个项目,一般是在gitee建立一个库,每个人都从远程库克隆一份到本地
首先我们建立一个远程仓库

将远程仓库clone到本地
[root@server mygit]# cd ..
[root@server data]# git clone git@gitee.com:zhang7433892/gamelife.git
正克隆到 'gamelife'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (4/4), done.
[root@server data]# ls
gamelife mygit
[root@server data]# cd gamelife/
[root@server gamelife]# ls
README.en.md README.md
修改本地文件,并上传到远程服务器
[root@server gamelife]# echo "mylife is not a game" >> README.md
[root@server gamelife]# git add README.md
[root@server gamelife]# git commit -m "add a line for readme"
[master 5821f71] add a line for readme
1 file changed, 1 insertion(+)
[root@server gamelife]# git push origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.3]
To git@gitee.com:zhang7433892/gamelife.git
ec52338..5821f71 master -> master
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co
我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://
Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装