seamew 1 år sedan
incheckning
c2133ce1fc
100 ändrade filer med 3893 tillägg och 0 borttagningar
  1. 1349 0
      孙浩博/Git学习笔记/A_Git详细学习笔记.md
  2. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210508171916951.png
  3. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210508182039450.png
  4. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510171915185.png
  5. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510172159472.png
  6. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180415796.png
  7. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180539437.png
  8. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180756184.png
  9. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180757993.png
  10. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510181329197.png
  11. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510181407805.png
  12. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510183253770.png
  13. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210621171934972.png
  14. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210621172453710.png
  15. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210701180547401.png
  16. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210705115521085.png
  17. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/列出仓库中最大的几个对象及其文件名.png
  18. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除大文件前大小.png
  19. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除大文件后大小.png
  20. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除引用.png
  21. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除截图.png
  22. BIN
      孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/强制提交.jpg
  23. 410 0
      孙浩博/Git学习笔记/git与vim常见指令集.md
  24. 26 0
      孙浩博/Git学习笔记/你可能会忽略的 Git 提交规范摘录.md
  25. 367 0
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记.md
  26. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702142024042.png
  27. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702144120442.png
  28. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152422183.png
  29. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152726339.png
  30. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152841056.png
  31. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702153021942.png
  32. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702153327715.png
  33. BIN
      孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702154430932.png
  34. 342 0
      孙浩博/Git学习笔记/开发中必须要掌握的 Git 技巧摘录.md
  35. BIN
      孙浩博/linux/linux备份/assets/image-20220604214134186.png
  36. BIN
      孙浩博/linux/linux备份/assets/image-20220604214638715.png
  37. BIN
      孙浩博/linux/linux备份/assets/image-20220604214754189.png
  38. BIN
      孙浩博/linux/linux备份/assets/image-20220604220115961.png
  39. BIN
      孙浩博/linux/linux备份/assets/image-20220604220217068.png
  40. BIN
      孙浩博/linux/linux备份/assets/image-20220604223018915.png
  41. BIN
      孙浩博/linux/linux备份/assets/image-20220604223141370.png
  42. BIN
      孙浩博/linux/linux备份/assets/image-20220605192912893.png
  43. BIN
      孙浩博/linux/linux备份/assets/image-20230211134903163.png
  44. BIN
      孙浩博/linux/linux备份/assets/image-20230211134956988.png
  45. BIN
      孙浩博/linux/linux备份/assets/image-20230211163017052.png
  46. BIN
      孙浩博/linux/linux备份/assets/image-20230211163054234.png
  47. BIN
      孙浩博/linux/linux备份/assets/image-20230211163106960.png
  48. BIN
      孙浩博/linux/linux备份/assets/image-20230211163233369.png
  49. BIN
      孙浩博/linux/linux备份/assets/watermar.png
  50. BIN
      孙浩博/linux/linux备份/assets/webp.webp
  51. 107 0
      孙浩博/linux/linux备份/mondorescue备份.md
  52. 111 0
      孙浩博/linux/linux备份/qemu.md
  53. 104 0
      孙浩博/linux/linux备份/vagrant.md
  54. 19 0
      孙浩博/linux/linux备份/vmwawre备份.md
  55. 96 0
      孙浩博/linux/linux常见命令/linux命令.md
  56. 56 0
      孙浩博/linux/linux常见命令/学习正则表达式.md
  57. 13 0
      孙浩博/linux/linux服务器运维/vmware exsi/0、配置要求.md
  58. 63 0
      孙浩博/linux/linux服务器运维/vmware exsi/10、Win10模板收集.md
  59. 49 0
      孙浩博/linux/linux服务器运维/vmware exsi/11、交换机安装.md
  60. 63 0
      孙浩博/linux/linux服务器运维/vmware exsi/1、vmware esxi安装.md
  61. 51 0
      孙浩博/linux/linux服务器运维/vmware exsi/2、vmware esxi配置.md
  62. 113 0
      孙浩博/linux/linux服务器运维/vmware exsi/3、vsphere的安装.md
  63. 137 0
      孙浩博/linux/linux服务器运维/vmware exsi/4、ad域安装.md
  64. 104 0
      孙浩博/linux/linux服务器运维/vmware exsi/5、sql服务器的安装.md
  65. 48 0
      孙浩博/linux/linux服务器运维/vmware exsi/6、许可证服务器安装.md
  66. 89 0
      孙浩博/linux/linux服务器运维/vmware exsi/7、DDC安装.md
  67. 158 0
      孙浩博/linux/linux服务器运维/vmware exsi/8、PVS安装.md
  68. 18 0
      孙浩博/linux/linux服务器运维/vmware exsi/9、BDM制作.md
  69. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/640.jpeg
  70. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125621659.png
  71. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125716689.png
  72. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125802442.png
  73. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330130555562.png
  74. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330130630432.png
  75. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330131015858.png
  76. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330131102430.png
  77. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134153184.png
  78. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134154704.png
  79. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134324506.png
  80. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134325511.png
  81. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134423778.png
  82. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134608687.png
  83. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134820533.png
  84. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134849973.png
  85. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134957405.png
  86. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094754144.png
  87. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094806868.png
  88. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094823368.png
  89. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094842228.png
  90. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094858955.png
  91. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094925022.png
  92. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094945355.png
  93. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095002044.png
  94. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095022649.png
  95. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095046522.png
  96. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095106749.png
  97. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095129212.png
  98. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100303313.png
  99. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100337248.png
  100. BIN
      孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100415625.png

+ 1349 - 0
孙浩博/Git学习笔记/A_Git详细学习笔记.md

@@ -0,0 +1,1349 @@
+> 此笔记为 本人洪详细学习Git阶段记录笔记,本笔记将记录 较深入的学习git知识点
+>
+> 如果仅仅简单使用,可先只看(必看)本笔记的:①高层命令 ②分支部分 ③数据恢复 ④远程操作
+>
+> 但是git知识是一个整体,系统的学习下来在之后使用也能更加得心应手
+>
+> 本人笔记地址分享:[`全部笔记`](https://gitee.com/hongjilin/hongs-study-notes)、[`Git笔记`](https://gitee.com/hongjilin/hongs-study-notes/tree/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Git%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0)
+>
+> ​															始于:2021-1-27    截至:2021-2-2
+
+# Git详细学习
+
+# #目录
+
+>[TOC]
+
+# Ⅰ-Git操作
+
+## 一、初始化
+
+> 该处是用来提交时当作签名使用的
+
+```shell
+git config --global user.name "我的用户名"
+git config --global user.email "我的邮箱"
+#删除配置信息
+git config --global --unset user.name
+git config --global --unset user.email
+```
+
+## 二、Git工作流程与区域
+
+### 1、区域
+
+1. 工作区
+
+   > 平时写代码的文件目录
+
+2. 暂存区
+
+   > git add 后提交暂存的地方
+
+3. 版本库
+
+   > git commit 后给你生成版本的地方,注意push是提交到远程仓库而不是版本库,请勿混淆
+
+### 2、工作流程
+
+> 每个项目都有一个Git目录(.git)他是Git用来保存元数据和对象数据库的地方.该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里的数据
+
+##### ①、在工作目录中修改某些文件
+
+>从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录,这些文件实际上都是从Git目录中的压缩对象数据库中提取出来的,接下去就可以在工作目录中对这些文件进行编辑
+
+##### ②、保存到暂存区域,对暂存区做快照
+
+> 暂存区域只不过是个简单的文件,一般都放在Git目录中,有时候人们会把这个区域的文件叫做索引文件,不过标准说法还是叫暂存区域
+
+##### ③、提交更新
+
+> 将保存区在暂存区域的文件快照永久转储到本地数据库(Git目录)中
+
+我们可以从文件所处位置来判断状态:如果是Git目录中保存着的特定版本文件,就属于提交版本;如果做了修改并已放入暂存区域,就属于已暂存状态;如果自上次去除后,做了修改但还没有放到暂存区域,就是已修改状态
+
+## 三、对象详解(底层命令)
+
+### 1、git对象
+
+> 1. key:val 组成的键值对(key是val相应的hash)
+>
+> ​		键值对在git内部是blob类型(git特有)
+>
+> 2. 存储数据文件内容,也称为数据对象
+
+##### ① 直接写入git对象方法与读取(存入".git/objects")
+
+```shell
+#将打印内容写入对象(git数据库)并且返回其相应哈希值
+echo "写入的对象内容" | git hash-object -w --stdin 
+#读取内容并不能直接cat读取,因为git存入时已经加密,需要如下代码 -p:内容  -t:类型
+git cat-file -p 存入对象的哈希值(此值可以由上一步得到) 
+#将文件写入git对象,即我们常见的版本控制中出现的
+git hash-object -w ./test.txt
+#查看Git存储的数据  返回其文件夹内的所有哈希文件
+find .git/objects -type f 
+```
+
+### 2、树对象
+
+> 树对象是存储键值 作用为控制版本,如我们的版本前回退 就是在操作这个对象的(指向改变)
+>
+> 作用就是生成快照
+>
+> 这个也是git的必杀特性,因为他的切换分支与版本都很快 只是指针切换
+
+#### 构建树对象
+
+> 我们可以通过 update-index , write-tree , read-tree 等命令来构建树对象并且塞到暂存区
+
+##### ① 利用 `update-index` 命令 创建暂存区
+
+>利用 `update-index` 命令 为test.txt文件的首个版本创建一个暂存区,并通过`write-tree`命令生成树对象
+
+```shell
+#1生成一个树对象
+git update-index --add --cacheinfo 100664(文件状态码:普通文件) 哈希值 对应文件名
+#生成快照(树对象)
+git write-tree
+#2 将第一个树对象加入第二个树对象,使其成为新的树对象
+git read-tree -prefix=bak 哈希值(树对象的)  
+git write-tree
+```
+
+##### ② 查看暂存区当前样子
+
+```shell
+git ls-files -s
+```
+
+### 3、提交对象
+
+> 1. 通过上述两个对象操作后,你会发现你已经生成了不同项目的快照,但是问题是:如果想重用这些快照,你必须记住所有三个 SHA-1(快照)哈希值 .但是,你也完全不知道是谁保存了这些快照,在什么时刻保存的,以及为什么保存这些快照.而以上这些,正是提交对象(commit object)能为你保存的基本信息
+> 2. 我们可以通过调用commit-tree命令创建一个提交对象,为此需要指定一个树对象的SHA-1值,为此需要指定一个树对象的SHA-1值 , 以及该提交的父提交对象(如果有的话,第一次将暂存区做快照就没有父对象)
+> 3. 真正的一个版本其实就是提交对象
+
+##### ① 创建提交对象
+
+```shell
+echo "first commit" |git commit-tree 树对象的哈希值
+```
+
+②指定一个树对象的SHA-1值 , 以及该提交的父提交对象
+
+```shell
+echo "second commit" | git commit-tree 提交的树对象哈希值 -p 父亲树对象哈希值
+```
+
+## 四、高层命令
+
+### 1、git add  .
+
+>1. 会将工作目录的修改,保存成git对象 `先到版本库,再到暂存区`,而不是直接到暂存区
+>
+>2. 在工作目录修改几个文件,就会生成几个git对象(一个文件对应一个git文件)
+>
+>3. 同一个文件,每次修改再add的时候都会生成一个新的git对象,是`增量`而不是覆盖
+>4. 所以说git是绝对安全的,就算我只存到暂存区没有提交 git也会给我保存
+>5. 只有后面提交的时候,才会根据暂存区内容给我生成树对象并存入版本区,然后加上我们的提交信息,才生成提交对象存入版本库
+
+```shell
+#相当于以下两个命令集合
+git hash-object -w 文件名(修改了多少个工作目录中的文件,就要被执行几次)
+git update-index ...
+```
+
+### 2、git  commit -m "注释内容"
+
+> 将暂存区提交到版本库
+
+```shell
+git write-tree
+git commit-tree
+```
+
+> 跳过暂存区存入(之前add过的,直接提交)
+
+```shell
+git commit -a -m ""
+```
+
+### 3、git init 
+
+> 初始化仓库 初始化后,在当前目录下出现一个名为.git的文件夹
+
+### 4、git status
+
+> 查看文件的状态
+
+### 5、git diff
+
+1. 当前做的那些更新没有暂存?
+
+   命令:`git diff`(不加参数直接输入git diff)
+
+2. 有哪些更新已经暂存起来准备好了下次提交
+
+   命令:`git diff --cached`或者`git diff --staged(1.6.1以上版本)`
+
+### 6、git log
+
+> 1. `git log`(不带参数)
+>
+>    `空格键`往下翻页 `b`向上翻页 `q`退出日志查阅
+>
+> 2. git log --oneline 
+>
+>    将日志信息拍成一行显示
+>
+> 3. git reflog
+>
+>    所有的日志信息
+>
+> 4. git log --oneline --decorate --graph --all
+>
+>    查看所有的分支信息命令
+
+### 7、git rm 
+
+> 删除工作目录对应的文件,再将修改添加到暂存区(如同删除后给你用了 `git add 文件名`)
+
+```shell
+#删除命令
+git rm 文件名 
+#直接提交修改,因为rm命令帮你提交到暂存区了
+git commit -m "xxx"
+```
+
+### 8、git mv
+
+>将工作目录中的文件进行重命名,再将修改添加到暂存区
+
+```shell
+git mv 原文件名  新文件名
+```
+
+## 五、配别名
+
+> Git并不会在你输入部分命令时自动推断出你想要的命令,如果不想每次都输入完整的Git命令,可以通过git config 文件来轻松为每一个命令设置一个别名
+>
+> 此处运行后将会写入你的配置文件,可以进入配置文件直接删除
+
+```shell
+git config --global alias.自定义命令 " `git` 命令后面的指令 "
+#如配置查看分支信息 "git log --oneline --decorate --graph --all"
+git config --global alias.logbranch "log --oneline --decorate --graph --all"
+#配置切换分支
+git config --global alias.co checkout
+#使用方式
+git logbranch
+```
+
+## 六、分支
+
+> 1. 前言:
+>
+>    几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线.在很多版本控制系统中,这是略微低效的过程--常常需要完全创建一个源代码目录的副本,对于大项目来说,这会耗费很多时间,而Git的分支模型极其的高校轻量,是Git的必杀特性,也正因为这一特性,是的Git从众多版本控制系统中脱颖而出
+>
+> 2. 分支的本质:
+>
+>    `Git的分支,其实本质上是提交对象`,,所有的分支都有机会被HEAD引用(`HEAD一个时刻只会指向一个分支`),当我们有新的提交的时候 HEAD会携带当前持有的分支向前移动
+>
+>    Git的默认分支名字是master,在多次提交后,你其实已经有一个指向最后那个提交对象的master分支.他会在每次的提交操作中自动向前
+>
+>    注意:Git的"master"分支并不是一个特殊分支.她就跟其他分支完全没有区别.之所以几乎每个仓库都有master分支,是因为`git init`命令默认创建它,并且大多数人懒得区改动它
+>
+> 3. 分支的原理:
+>
+>    1. `.git/refs`目录中保存了分支及其对应的提交对象
+>
+>    2. 当运行类似于`git branch (branchname)`这样的命令时,Git会取得当前所在分支最新提交对应的SHA-1值,并将其加入你想要创建的任何新分支中
+>
+>    3. 当你执行`git branch (branchname)`时,Git如何知道最新提交的SHA-1值呢?答案是HEAD文件
+>
+>       `HEAD文件`是一个符号引用(stmbolic reference),指向目前所在的分支.所谓符号医用,意味着它并不像普通引用那样包含一个SHA-1值.它时一个指向其他引用的指针
+
+### 1、git branch 
+
+> 1. git branch(不加参数)
+>
+>    作用:`显示所有分支`信息
+>
+> 2. git branch 分支名
+>
+>    作用:`创建分支`
+>
+> 3. git branch -v
+>
+>    作用:查看每一个分支最后一次提交
+>
+> 4. git branch -d(-D强制删除) 分支名
+>
+>    作用:`删除分支`,小d需要你这个分支是干净的才能删除(如已合并)
+>
+> 5. git branch --merged 
+>
+>    作用:查看那些分支已经合并到当前分支
+>
+>    在这个列表中的分支名字前没有*号的分支通常可以使用`git branch -d` 删除掉
+>
+> 6. git branch --no-merged
+>
+>    作用:查看所有包含未合并工作的分支
+>
+>    尝试使用`git branch -d`命令删除在这个列表中的分支时会失败,如果真的想要删除分支并丢掉哪些工作,可以使用`-D` 选项爱强制删除它
+>
+> 7. git log --oneline --decorate --graph --all
+>
+>    作用:查看所有的分支信息命令
+>
+> 8. git branch 分支名 commitHash
+>
+>    作用:新建一个分支,并且使分支指向对应的提交对象(版本穿梭`可以替代撤销与重置`)
+
+### 2、git checkout 分支名
+
+> 作用:`切换分支`  checkout还有其他作用,后面会提到
+>
+> 它会动三个地方:HEAD(指针) 暂存区 工作目录
+
+> 1. `注意`:分支切换会改变你工作目录中的文件,所以在切换分支时,一定要注意你的工作目录里的文件会被改变,如果时切换到一个比较旧的分支,你的工作目录会回复到该分支最后一次提交的样子,如果Git不能干净利落的完成这个任务,它将禁止切换分支
+>
+> 2. `坑`:在切换分支时, 如果当前分支上由未暂存的修改(`第一次`) 或者 有未提交的暂存`(第一次`) 分支可以切换成功,但是这种操作可能会污染其他分支
+>
+>    ps:`第一次`--当前分支如果已经提交过一次,将不让你切换,但是第一次没有提交过,git会帮你保存文件 但是它并不知道新增修改是属于哪个分支,所以会带回当前分支
+>
+> 3. 最佳操作方式:`每次在切换分支前,需要提交一下当前分支(先使用status查看状态)`
+
+### 3、git checkout -b "新的分支名"
+
+> 创建并进入该分支,类似于上面两个命令集合
+
+### 4、模拟实战流程
+
+>1. 需要解决主程序的的一个小BUG,所以使用`git  checkout -b "iss_bug"`新建分支并在这个分支进行bug调修
+>
+>2. 当你再`iss_bug`分支上开发到一半,这时,在主程序发现了一个紧急BUG需要你放下这个重要性为次要的bug进行修改.你老板都给你打了紧急电话,所以你需要先将写到一半的bug进行保存提交(`commit`提交或者储存  到暂存区,并不是提交合并到主分支,也不是push提交),确定status是干净的时候,切换回主分支,再用第一步的方法创建`hot_bug`分支(这时候`hit_bug`的版本是master没有进行`iss_bug`调修的版本),进行修复
+>
+>3. 当你将紧急bug修复后,进行提交,确定status干净后切换回master分支,进行合并:代码如下
+>
+> ```shell
+> git checkout master
+> git merge hit_bug
+> ```
+>
+>4. 修改完后再查看status(这是个好习惯,防止偶尔记忆混淆造成不必要的麻烦),再切换至普通bug分支`iss_bug`进行修改,成功后切换回去合并
+>5. 如果出现冲突,去出现冲突的文件手动修改(决定保留那部分代码),再进行`git add`表示冲突解决,在进行提交 
+
+### 5、合并分支
+
+> 命令: `git merge branchname`(分支名)
+>
+> 注意:合并分支时要先切换到`主要分支`(即下面的被合并分支),在这个分支上进行合并新分支,使得这个分支进行版本更新
+>
+> 1. 快进合并-->不会产生冲突
+>
+>    ​		指被合并分支并没有进行修改,停留在原地,只有新分支进行修改更新,更		新完成后进行合并,原版本相当于直接前进版本,称为快进合并
+>
+> 2. 典型合并-->有可能产生冲突
+>
+>    ​		指被合并分支在新分支进行开发时,本身也进行修改开发,可能会改动到同		一代码或者文件而产生重复修改
+>
+> 3. 解决冲突:`打开冲突的文件`  进行修改 ,修改完成后进行:`add标记修改完成`,然后commit进行提交
+
+>`git 在pull或者合并分支`的时候有时会遇到一个第一段是黄色,下面文字是青色(偏蓝色)。可以不管(直接下面3,4步),如果要输入解释的话就需要:
+>
+>1.按键盘字母 i 进入insert模式
+>
+>2.修改最上面那行黄色合并信息,可以不修改
+>
+>3.按键盘左上角"Esc"
+>
+>4.输入":wq",注意是冒号+wq,按回车键即可
+
+## 七、存储
+
+> 1. 需求背景:
+>
+>    有时,当你在项目的一部分上已经工作了一段时间后,所有东西都进入了混乱的状态,而这时你想要切换到另一个分支做一点别的事情.问题是,你不想仅仅因为过会儿回到这一点而做了一半的工作创建一次提交
+>
+> 2. 解决:
+>
+>    针对这个问题的答案是 `git stash` 命令(当然,直接提交`commit`也可以,这个是用来不想生成提交对象而用)
+>
+> 3. 原理:
+>
+>    git切换分支之所以保留你的未提交的修改文件,是因为它不想你因为误操作使得之前代码报废所以会当你status不干净时组织你切换分支(`ps`:如果是第一次创建的文件没有追踪过,它不认识是属于那份分支将会带到你切换后的分支造成污染),
+>
+>    而你将其保存到栈上(`ps`:换句话说将这部分内容抽取到一个类似共有的栈上,你在哪个分支都能够通过命令取到),git就知道你这个内容已经储存并不会造成切换分支使得你写的代码丢失,便不会阻止你切换分支或者切换带文件污染分支
+
+### 1、git stash
+
+> `git stash`命令会将未完成的修改保存到一个栈上,而你可以在任何时候重新应用这些改动(`git stash apply`),
+>
+> `注意!!!!!`:使用前你要先`git add .`,否则你会发现,你执行此命令后,没有追踪的部分全部消失了
+
+### 2、git stash list 
+
+> 查看存储
+
+### 3、git stash pop
+
+> 来应用储藏然后立即从栈上扔掉它 `这是最推荐的使用`
+
+#### 4、git stash apply stash@{2}
+
+> 如果不指定一个储藏,git认为指定栈顶`不常用`
+
+### 5、git stash drop "储藏的名字"
+
+>加上要储藏的名字移除他 `不常用`
+
+## 八、撤销与重置
+
+> 特别是重置部分理解即可(用到了再去查),撤销尽量可以掌握
+
+### 撤销
+
+#### 1、git commit --amend
+
+> 1. 这个命令会将暂存区中的文件提交,修订提交(`不是撤销而是重新提交`)
+>
+> 2. 如果自上次提交以来你还未做任何修改(如:在上次提交后马上执行此命令),那么快照会保持不变,而你修改的只是提交信息
+>
+> 3. 如果你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作
+>
+>    ```shell
+>    git commit -m "错误的注释" #或者commit了错误的修改
+>    git add "文件名或者."  #重新add正确的文件
+>    git commit --amend		#进行重新提交
+>    ```
+>
+>    最终你只会有一个提交 (第二次提交将会替代第一次提交)
+>
+> 4. 可以修改上次提交的文件与注释
+
+#### 2、git reset 
+
+>命令:`git reset HEAD 文件名`
+>
+>作用:将文件从`暂存区中撤回`到工作目录中
+
+#### 3、git checkout
+
+>是的,你没看错,这个是切换分支的命令,但是他也能用来`撤销文件修改`
+>
+>命令:`git checkout --文件名`
+>
+>将在工作目录中对文件的修改撤销
+>
+>`注意`:这是一个危险的命令,这很重要.你对那个文件做的任何修改都会消失--你只是拷贝了另一个文件(原来版本的文件)来覆盖它.除非你确实秦楚不想要那个文件了,否则不要使用这个命令
+
+### 重置reset
+
+> 注意:`--hard`标记是`reset`命令唯一的`危险用法`,也是Git真正的销毁数据的几个仅有操作之一.其他任何形式的`reset`调用都可以轻松撤销,但是`--hard`选项不能,因为它强制覆盖了工作目录中的文件.
+>
+> 如在这种特殊情况:我们的Git数据库中的一个提交内还留有该文件的几个版本,我们可以通过`reflog`来找回它,但若是该文件还未提交,Git仍会覆盖他导致它无法恢复
+
+#### reset三部曲
+
+>第一部:git reset --soft HEAD~(等于之前的--amend)
+>
+>​	移动HEAD (但带着分支一起移动,与checkout不同(它只动HEAD))
+>
+>第二部:git reset --mixed HEAD~
+>
+>​	移动HEAD 并且动了了暂存区
+>
+>第三部:git reset --hard HEAD~
+>
+>​	移动HEAD 并且动了了暂存区 动了工作目录
+
+## 九、数据恢复
+
+> 在你使用Git的时候,你可能会意外丢失一次提交:
+>
+> ①通常这是因为你强制删除了正在工作的分支,但是最后你却需要这个分支;②抑或是你硬重置了一个分支,放弃了你想要的提交.
+>
+> 如果这些事情已经发生,该如何找回你的提交呢?
+
+### 实例
+
+> 推荐方法最好是`直接看恢复`,上面实例时当你使用硬重置回当初未删除版本进行恢复,出现的一系列问题解决
+
+>1. 假设你已经提交了五次,而现在,我们将master分支硬重置到了第三次提交来找回当时删除的分支.但是这时候你会发现一个事情:
+>
+> 现在顶部的两个提交已经丢失了-没有分支指向这些提交(因为你将指针移到了第三个,那么前面两个就找不到了)
+>
+>2. 你现在已经得到并且恢复当时第三次还存在的的提交了(`恢复方法在下面,恢复文件到这步,下面3、4是回到最新版本`)
+>
+> 现在准备回到当初最新的版本时,你发现你进行打印竟然没有前面两次提交信息(你需要他的哈希值进行版本穿梭或者重置),你需要最新一次提交的哈希值,但是你估计想不起来了,对吗?
+>
+>3. 最方便,也是最常用的方法,是使用一个名叫`log reflog`的工具(前面高层命令提过),当你在工作时,Git会默默记录每一次你改变的HEAD时它的值,每一次你提交或者改变分支,引用日志都会被刷新
+>
+>4. 如果`git reflog`显示的内容你觉得不足够多,可以执行`git log -g`,这个命令会以标准日志的格式输出引用日志
+
+### 恢复 `推荐的`
+
+> 1. 通过`git reflog`找到你需要的文件还未删除的版本哈希值,那个就是你丢失的提交,你可以通过创建一个新的分支指向这个提交来恢复它.
+>
+>    例如:你可以创建一个名为`recover-branch`的分支执行这个提交
+>
+>    ```shell
+>    git branch recover-branch 当前需要恢复(之前丢失的)的提交哈希值
+>    ```
+>
+> 2. 现在有一个名为`recover-branch`的分支是你的`master`分支曾经指向的地方(即当时你删除该需要的文件的前的那个版本),这样你在这次提交的版本后,也能通过切换这个分支得到曾丢失的文件
+>
+> 3. 这个分支功能能帮你做很多东西,善用分支,Git最强功能
+
+## 十、打tag
+
+> Git可以给历史中的某一次提交打上标签,表示重要.比较有代表性的是人们会用这个功能来`标记发布节点`(v1.0等等)
+
+### 1、列出标签
+
+>命令:`git tag` 或者 `git tag -l 'v1.*'`
+>
+>​	前者列出所有,后者列出以`v1.`开头的所有
+
+### 2、创建标签
+
+> git使用两种主要类型的标签:轻量标签 与 附注标签
+
+##### ①轻量标签
+
+> 轻量标签很像一个不会改变的的分支(他只是一个特定提交的引用),直接在提交前使用命令即可给当前分支打上标签
+
+```shell
+git tag v1.0
+#或者下面的
+git tag v1.0 提交对象哈希
+```
+
+##### ②附注标签
+
+> 附注标签是存储在Git数据库中的一个完整对象.他们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间;通常`建议创建复制标签`,这样你可以拥有以上所有信息,但如果只是想用一个临时标签,或者由于某些原因不想表村那些信息,轻量标签也是可用的
+
+```shell
+git tag -a v1.0
+git tag -a v1.0 提交对象哈希
+git tag -a v1.0 提交对象哈希 -m "我的注释信息"
+```
+
+### 3、查看特定标签
+
+> `git show` 可以显示任意类型的对象(git对象 树对象 提交对象 tag对象)
+>
+> 命令: `git show tagname`
+
+### 4、删除标签
+
+> 1. 删除标签 要删除你在本地仓库上的标签,可以使用命令 `git tag -d <tagname>`如下:
+>
+>    ```shell
+>    git tag -d v1.0
+>    ```
+>
+> 2. 应该注意上述命令并不会从任何远程仓库中移出这个标签,你必须使用`git push <tamote>:refs/tags/<tagname>`来更新你的远程仓库,如下
+>
+>    ```shell
+>    git push origin :refs/tags/v1.0
+>    # origin是你配置的远程仓库地址别名,你可以直接用远程仓库地址
+>    ```
+
+### 5、捡出标签
+
+> 1. 如果说你想查看某个标签所指向的文件版本,可以使用`git checkout`命令
+>
+>    ```shell
+>    git checkout tagname
+>    ```
+>
+> 2. 虽然说这会使得你的仓库处于"分离 头指针(deacthed HEAD)"状态.在"分离头指针"状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问,除非访问确切的提交哈希,因此你如果需要进行更改--比如说你需要`修复旧版本`的错误--这通常需要创建一个新的分支(捡出后创建,就会默认将当前捡出的版本作为新分支的第一版本-前面分支提到过)
+>
+>    这样就可以修改到旧版本的代码(如同vue的尤雨溪在vue3.x会更新vue1.0版本生态)
+>
+>    ```shell
+>    git checkout -b version(新的分支)
+>    ```
+
+# Ⅱ-代码风格
+
+## 1、Eslint
+
+> ESlint是一个开源的JavaScript代码检查工具,由红宝书作者创建
+>
+> 初衷是为了让程序员可以创建自己的检测规则.ESLint的所有规则都被设计成可插入的
+>
+> ESLint使用Node.js编写,这样既可以有一个快速的运行环境同时也便于安装
+>
+> 此处引入概念,具体学习之后将开新的笔记
+
+## 2、commit提交规范
+
+>1. [参考自阮一峰老师的文章](http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html)
+>
+>2. Header
+>
+> Header部分只有一行,包括三个字段:`type`(必需)、`scope`(可选)和`subject`(必需)。
+>
+> **(1)type**
+>
+> `type`用于说明 commit 的类别,只允许使用下面几个标识。
+>
+> > ```js
+> > feat:新功能(feature)。
+> > fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
+> > fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
+> > to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
+> > docs:文档(documentation)。
+> > style:格式(不影响代码运行的变动)。
+> > refactor:重构(即不是新增功能,也不是修改bug的代码变动)。
+> > perf:优化相关,比如提升性能、体验。
+> > test:增加测试。
+> > chore:构建过程或辅助工具的变动。
+> > revert:回滚到上一个版本。
+> > merge:代码合并。
+> > sync:同步主线或分支的Bug。
+> > ```
+>
+> 如果`type`为`feat`和`fix`,则该 commit 将肯定出现在 Change log 之中。其他情况(`docs`、`chore`、`style`、`refactor`、`test`)由你决定,要不要放入 Change log,建议是不要。
+>
+> **(2)scope**
+>
+> `scope`用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
+>
+> **(3)subject**
+>
+> `subject`是 commit 目的的简短描述,不超过50个字符。
+>
+> > - 以动词开头,使用第一人称现在时,比如`change`,而不是`changed`或`changes`
+> > - 第一个字母小写
+> > - 结尾不加句号(`.`)
+
+# Ⅲ-远程操作
+
+>三个必须懂的概念
+>
+>1. 本地分支
+>
+>   工作目录中的分支
+>
+>2. 远程跟踪分支
+>
+>   当你往远程分支`push`(还有克隆)的时候会创建远程跟踪分支
+>
+>3. 远程分支
+>
+>   指保存在git网站上的那个远程仓库中的分支
+
+### 1、团队协作流程
+
+>1. 项目经理初始化远程仓库
+>
+>     一定要初始化一个空的仓库:再github上操作
+>
+>2. 项目经理创建本地仓库
+>
+>     1. `git remote 别名 仓库地址`
+>     2. `git --init`,然后将源码复制进来
+>     3. 修改用户名 修改邮箱(双账号的才需要这步)
+>     4. `git  add` 和 `git commit`
+>
+>3. 项目经理推送到本地仓库到远程仓库
+>
+>     1. 清理window凭据
+>     2. `git push 别名 分支`(输入账号密码;推完之后会附带生成远程跟踪分支) 
+>
+>4. 项目邀请成员&&成员接受邀请
+>
+>     在git网站上操作
+>
+>5. 成员克隆远程仓库
+>
+>     `git clone 仓库地址`
+>
+>     只有在克隆的时候 本地分支master 和 远程跟踪分支别名/master 是有同步关系的(可以直接pull或者push后面不用加origin)
+>
+>     原因是,每次你push的时候是你远程跟踪分支替换掉(同步)你的远程分支,如果你想要新分支能直接push,需要本地分支去追踪远程追踪分支
+>
+>6. 成员做出贡献
+>
+>     1. 修改源代码文件
+>     2. `git add -> commit -> push`
+>
+>7. 项目经理更新修改
+>
+>     1. `git fetch 别名`(将修改同步到远程跟踪分支上)
+>     2. git merge 远程跟踪分支
+
+### 2、远程库
+
+> 正常的数据推送 和 拉取步骤
+>
+> 1. 确保本地分支已经跟踪了远程跟踪分支
+> 2. 拉取上传数据: git `pull` or `push`
+
+####  Ⅰ-远程跟踪分支
+
+> 流程与释义:
+>
+> 1. `远程跟踪分支`是远程分支状态的引用。它们是你不能移动的本地分支。当你做任何网络通信操作时,它们会自动移动
+>
+> 2. 它们以(remote)/(branch)形式命名,如果你想要看你最后一次与远程仓库origin时master分支的状态,可以查看origin/master分支
+>
+> 3. 当`克隆`一个仓库时,它通常会自动的创建一个跟踪`origin/master`的master分支(所以你可以不跟踪直接pull与push后面不跟origin)
+> 4. 当我克隆之后,别人新建了一个分支push上去,我这时候想要或者并且跟踪这个新分支,我需要先`git fetch origin`获取下来,获取下来后想要切换并且跟踪这个分支时使用命令`git checkout --track 远程跟踪分支名(origin/分支名)`
+
+##### 做跟踪:
+
+>1. 克隆仓库时,会自动为master做跟踪
+>
+>2. 本地没有分支,要新建分支且追踪
+>
+>   ```shell
+>   git checkout --track 远程跟踪分支(remote/分支名)
+>   ```
+>
+>3. 本地已经创建了分支,
+>
+>   ```shell
+>   git branch -u 远程跟踪分支(remote/分支名)
+>   ```
+
+#### Ⅱ-本地分支怎么跟踪远程跟踪分支
+
+> 1. 当克隆的时候 会自动生成一个master本地分支(已经跟踪了对应的远程跟踪分支)
+>
+> 2. 在新建其他分支时,可以指定想要跟踪的远程跟踪分支
+>
+>    ```shell
+>    git checkout -b 本地分支名 远程跟踪分支名
+>    #简写形式
+>    git checkout --track 远程跟踪分支名(origin/分支名)
+>    ```
+>
+> 3. 将一个已经存在的本地分支 改成 一个跟踪分支
+>
+>    ```shell
+>    git branch -u 远程跟踪分支名
+>    ```
+
+#### Ⅲ-冲突
+
+>1. git本地操作会不会有冲突?
+>
+>   典型合并的时候(如新建分支合并时)
+>
+>2. git远程协作的时候会不会有冲突
+>
+>   `push`与`pull`
+
+>解决流程:
+>
+>1. 假设你修改了a.js的代码,已经`add &&commit`(必须先这样才能提交,才能触发冲突)
+>
+>2. 但是这时别人也改了a.js同一行代码并且已经push上去了,你这时候进行push将会报错
+>
+>3. 这时候你需要先将其pull下来,这时候你会发现你的git将会给你提示,并且在本地的a.js中文件代码中,保留了你们两个的代码(并且会给你标注出来)
+>
+>4. 这时候一定要去与`与你冲突的开发人员交流`,讨论保留哪一个人的代码,或者进行修改(直接在你pull后的本地目录中修改),修改完成后使用`git add .`标记解决冲突然后`push`提交,这样别人pull的时候git就知道这部分时保留哪部分代码,直接覆盖(即在一个地方更改然后标记提交即可)
+>
+>5. 如果你发生冲突`不进行沟通`,将别人代码`直接注释掉`,让自己代码能跑,那么--真的很爽
+>
+>   但是别人功能可能就炸了,这时候你会被暴打:smirk:
+>
+>   因为你解决冲突后(git add .)别人pull的时候并不会提示冲突,因为你用`add`标记解决了冲突,git认出来后会直接默认`覆盖`他的代码,不知不觉,你可能就毁了另外一个程序员美好的一天(莫名其妙的BUG导致加班),如果他没反应过来,可能就是两天甚至...,你到时候住院的时间也与这个成正比:smirk:
+
+#### Ⅳ- pull request 流程
+
+> ​	`如果你想要参加某个项目,但是并没有推送权限`,这时候可以对这个项目进行”派生“(`Fork`),派生是指GitHub将在你的空间创建一个完全属于你的项目副本,且你对其有推送权限.通过这种方式,项目的管理者不再需要忙着把用户添加到贡献者列表并给予它们推送权限.人们可以派生这个项目,将修改推送到派生出的项目副本中,并通过创建合并请求(pull request)让它们改动进入原版本库
+>
+> 基本流程:
+>
+> 1. 自己在git网站上fork的项目到自己空间中,下面的操作都是基于这个fork的项目
+> 2. 从master分支中创建一个新的分支
+> 3. 提交一些修改来改进项目
+> 4. 将这个分支推送到git上
+> 5. 创建一个`合并`请求(在网站上点击发送信息)
+> 6. 在网站上进行讨论,并且根据实际情况继续修改
+> 7. 项目的拥有者合并或者关闭你的合并请求
+>
+> 注意:
+>
+>  每次在发起新的`Pull Request`时 要去拉去最新的原仓库的代码 而不是自己fork的那个仓库
+>
+> ```sh
+> git remote add <源仓库名字(自己定义)> <仓库地址链接>
+> git fetch 远程仓库名字
+> git merge 对应的远程跟踪分支
+> ```
+
+------
+
+
+
+# Ⅳ-版本控制工具的使用基本原则
+
+## 1、精准的提交
+
+每次提交都是一个小儿完整的功能或者一个BUG的修复。不应该出现多个功能点一块提交或者多个BUG一起修复的情况。如果一旦发现提交的代码有问题,可以方便的会滚到改动之前的正确状态,不会影响到其他协作者开发进程。
+
+## 2、频繁的提交
+
+尽可能频繁的提交你的改动到远程仓库,这样,可以避免将来合并代码的时候产生大量的冲突以至于难以解决。同时,也可以让其他同事比较快的共享你的改动。
+
+## 3、不要提交不完整的功能
+
+如果你正在开发的新功能比较庞大,那么可以讲这个功能尽可能拆分为几个逻辑模块,并且要保证分次提交的逻辑模块不会影响到整个系统的正确性。如果你只是因为临时的一些事情需要切到别的分支或者是临时需要中断开发(比如说下班),那么应该使用`Stash`储藏功能来保存你的更改。   -->[相关知识点部分我跳转](#七、存储)
+
+## 4、提交前进行测试
+
+不要想当然的认为自己的代码是正确的,提交之前应该经过充分的测试才能提交,即使是提交到本地仓库,也应该进行测试,因为这些代码在未来会被推送到远程共享给你的同事。
+
+## 5、高质量的提交注释
+
+每次提交都应该包含完整的注释。团队成员应当遵循统一的提交规则,一般应当明确的体现出提交的类型以及具体的事情,例如 feat: add message list;
+
+## 6、遵循统一的流程规范
+
+Git 可以支持很多不同的工作流程:长期分支、功能分支、合并以及 rebase、git-flow 等等。选择什么样的开发流程要取决如下一些因素:项目开发的类型,部署模式和(可能是最重要的)开发团队成员的个人习惯。不管怎样,选择什么样的流程都需要得到所有开发成员的一致认可,并且一直遵循它。
+
+
+
+
+
+# Ⅴ- 实际遇到的问题与解决Mark
+
+## 1、将本地已有的一个项目上传到新建的git仓库的方法
+
+将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种。
+
+### Ⅰ-  克隆+拷贝
+
+>第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去。然后push到远程仓库上去即可。**此方法适用于本地项目不是一个git仓库的情况。**
+>
+>具体步骤如下:
+>
+>#### 1、首先克隆
+>
+>```bash
+>git clone git@github.com:yuanmingchen/tensorflow_study.git
+>```
+>
+>#### 2、然后复制自己项目的所有文件到刚刚克隆下来的仓库中
+>
+>#### 3、最后push到远程仓库上面去:
+>
+>```bash
+>git push -u origin master
+>```
+
+### Ⅱ-  强行合并两个仓库
+
+>第二种方法就是先将本地的项目初始化为一个git仓库,然后再强行合并本地仓库和远程仓库,由于这两个仓库是完全不同的两个仓库,所以直接pull都会报错,需要在pull的时候假加上–allow-unrelated-histories才可以pull成功。**此方法适用于本地项目已经是一个git仓库的情况。**
+>
+>具体步骤如下:
+>
+>#### 1、新建git仓库,将本地项目设置为一个git仓库。如果本地项目已经是一个git仓库了,请跳过这一步。在项目根目录下:
+>
+>```bash
+>git init
+>```
+>
+>#### 2、把当前目录下的已有文件全部加到刚刚新建的git仓库中:
+>
+>```bash
+>git add .
+>```
+>
+>#### 3、保存刚刚加入的文件,并书写保存信息:
+>
+>```bash
+>git commit -m "push current files"
+>```
+>
+>#### 4、将本地仓库与远程仓库关联起来:
+>
+>```bash
+>git remote add origin git@github.com:yuanmingchen/tensorflow_study.git
+>```
+>
+>#### 5、pull远程仓库的内容,更新本地仓库,使用–allow-unrelated-histories忽略本地仓库和远程仓库的无关性,强行合并(关键):
+>
+>```bash
+>git pull origin master --allow-unrelated-histories
+>```
+>如果不采用上述代码可以使用git rebase命令合并
+>```bash
+>git pull origin master 
+>git rebase FETCH_HEAD
+>```
+>或者直接在pull命令指定参数,pull默认为fetch+merge
+>指定参数为fetch+rebase
+>```bash
+>git pull origin master --rebase 
+>```
+>#### 6、把本地仓库的内容push到远程仓库:
+>
+>```bash
+>git push -u origin master
+>```
+>
+>然后就ok了。
+
+### Ⅲ- 强制合并仓库不保留原仓库文件
+>第三种方法不会保留原有仓库的东西
+>
+>#### 1、新建git仓库,将本地项目设置为一个git仓库。如果本地项目已经是一个git仓库了,请跳过这一步。在项目根目录下:
+>
+>```bash
+>git init
+>git add .
+>git commit -m "add some files"
+>```
+>#### 2、强制push
+>```bash
+>git remote add origin git@github.com:yuanmingchen/tensorflow_study.git
+>git push origin master --force
+>```
+
+
+### Ⅳ- 其他git命令
+
+>最后附上git的一些其他命令:
+>1、删除已将关联的远程主机
+>
+>```bash
+>git remote rm origin
+>```
+>
+>2、查看所有本地分支
+>
+>```bash
+>git branch -a
+>```
+>
+>3、新建一个分支,名字叫xf
+>
+>```bash
+>git branch xf
+>```
+>
+>4、切换分支到xf分支
+>
+>```bash
+>git checkout xf
+>```
+>
+>5、把远程分支的代码pull到本地分支:git pull <远程主机名> <远程分支名>:<本地分支名>
+>如:取回origin主机的master分支,与本地的xf分支合并,输入命令:
+>
+>```bash
+>git pull origin master:xf
+>```
+>
+>6、推送当前的分支,git push <远程主机名> <本地分支名>:<远程分支名>
+>PS:注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
+>如:把本地的xf分支推送到origin主机的master分支,输入命令:
+>
+>```bash
+>git push origin xf:master
+>```
+
+
+
+## 2、解决同一台电脑生成两份或多份ssh密钥、公钥映射两个或多个GitHub账号
+
+> 此解决方案由百度多个方案结合而来,截取对我有用部分
+
+### Ⅰ- 需求分析
+
+> 本人注册一个GitHub账户,用来分享本人自己的开源项目或者代码,同时,公司注册了一个GitHub账户,用来分享公司的开源项目。如果按照单个ssh公钥生成的方法则会把之前的公钥覆盖掉,这样将导致其中一方在下一次上传代码,本机和GitHub无法映射成功。
+>
+> 解决这个问题首先要明确如何生成单个ssh公钥。
+> ssh生成单个公钥命令:`ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`。[如何生成ssh公钥](https://blog.csdn.net/mynameissls/article/details/50528048)
+> 上述命令会在当前`~/.ssh`目录下生成`id_rsa`和`id_rsa.pub`两个文件。其中`id_rsa`是私钥文件,`id_rsa_.pub`是公钥文件。
+> `id_rsa`和`id_rsa_.pub`文件都是通过一个邮箱号生成的,同一个公钥文件不可以配置两个不同GitHub账户(已测试)。
+> 那么两个GitHub账户就需要两个不同的邮箱号,来生成两组不同的公钥文件。
+
+### Ⅱ- 解决方案思路
+
+>命令:`ssh-keygen -t rsa -C "your_email@example.com" -f ~/.ssh/id_rsa_example`
+>示例:分别以791815567@qq.com和galaxysoft@sina.cn两个邮箱在`~/.ssh`目录下生成两级不同的公钥文件。
+>791815567@qq.com邮箱:`ssh-keygen -t rsa -C "791815567@qq.com" -f ~/.ssh/id_rsa_me`
+>galaxysoft@sina.cn邮箱:`ssh-keygen -t rsa -C "galaxysoft@sina.cn" -f ~/.ssh/id_rsa_galaxysoft`
+>生成过程可参考[如何生成单个ssh公钥](https://blog.csdn.net/mynameissls/article/details/50528048) 这篇文章。
+>执行完成后,会以`~/.ssh`目录下看791815567@qq.com邮箱对应的私钥文件`id_rsa_me`、公钥文件`id_rsa_me.pub`和galaxysoft@sina.cn邮箱对应的私钥文件`id_rsa_galaxysoft`、公钥文件`id_rsa_galaxysoft.pub`
+>分别在两个GitHub账户中添加对应的公钥信息即可,可参考[如何生成单个ssh公钥](https://blog.csdn.net/mynameissls/article/details/50528048) 这篇文章
+
+### Ⅲ- 生成新ssh key
+
+> 如果我们电脑上已经存在了一个ssh key,那么我们需要在我们电脑上生成第二个你想在本电脑上使用的id_rsa,使用命令:`ssh-keygen -t rsa -C "你的github注册邮箱"`。
+>
+> 下图红色标注部分会提示你把新生成的id_rsa存放到哪里,此处默认会存放在c盘的用户名下的.ssh文件夹下(即你第一个github用户ssh key存放的目录),因此我们需要输入路径/c/Users/DodoMonster/.ssh(注意此路径是你的系统盘下用户目录安放ssh密钥的目录,请使用自己电脑上相对应的目录),最后我以“id_rsa_me”重新命名了ssh key防止默认与已有的ssh key重复。
+>
+> > 在输入了路径后,会提示你输入提交项目时输入的验证密码,不输则表示不用密码,这是为了防止别人随便在你的项目上push东西,所以最好还是输入以下你的密码。回车,再重复输入确认回车即可。
+
+### Ⅳ- 添加新ssh key
+
+>默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥,需要将其添加到SSH agent
+>使用命令:`ssh-add ~/.ssh/id_rsa_me`(后面的是自己取的名字)
+>
+>如果报错:Could not open a connection to your authentication agent.无法连接到ssh agent
+>可执行`ssh-agent bash`命令后再执行`ssh-add`命
+>
+>然后将公钥添加到git账号中 https://github.com/settings/keys
+
+### Ⅴ- 配置config文件
+
+> 查看.ssh文件中是否存在config文件
+>
+> 如果已存在则直接编辑config文件,命令:`vim config` #这是linux的命令,进入了vim界面后按`a或i或A或I`进入编辑模式,编辑完成后按esc键输入`:wq` 保存文件退出
+>
+> 如果不存在则需要创建config文件,命令:`touch config`,再对config文件进行编辑
+>
+> 对config文件进行配置填写:
+>
+> ```bash
+> #Default 第一个账号(123456@xxxx.com)
+> 
+> Host gsgit
+>     HostName gitee.com
+>     PreferredAuthentications publickey
+>     IdentityFile ~/.ssh/id_rsa_me
+>     
+>    
+> #second 第二个账号(38894403@xxxx.com)
+>     
+> Host mygit
+>      HostName gitee.com
+>     PreferredAuthentications publickey
+>     IdentityFile ~/.ssh/id_rsa
+> ```
+>
+> > 其中Host 后的名字可以随意方便自己记忆,但HostName必须为`github.com(或者其它git地址)。`
+
+### Ⅵ- 测试是否配置成功
+
+>使用命令:
+>
+>```bash
+>ssh -T git@zc
+>```
+>
+>出现欢迎语则为配置成功。
+>
+>注意:配置完成后,在连接Host不是github.com的github仓库时,远程库的地址要对应地做一些修改:
+>
+>而并非原来的git@github.com
+>
+>```shell
+>git clone git@gitee.com:hongjilin/cx.git
+>//改为
+>git clone git@mygit:hongjilin/cx.git
+>```
+>
+>这样每次连接都会使用id_rsa_me与服务器进行连接。
+>
+>配置至此,大功告成!
+
+###  Ⅶ- 问题Mark
+
+> 当我切换到另外一个账号提交时 commit的提交者仍寻找全局配置中的username作为签名 而不是当前本地库绑定提交账号的用户名(所以我用公司账号的`.ssh`配置绕过了组织检测,但是署名却用的是个人账户)
+>
+> 别小看这个BUG,挺恐怖的,下面举个我的栗子:
+>
+> ![image-20210621172453710](A_Git详细学习笔记中的图片/image-20210621172453710.png)
+>
+> 到这时候你可能觉得好像也没啥吧?但是我个人账号不是公司组织里面的(也不好解释)、计算公司个人绩效时也无法统计、之前版本还无法用搜索条件查找我个人账号(因为本身个人账号就不是组织里面的)的提交.....问题可大可小
+>
+> 所以此处`Mark`,留待后续学习生活解决
+
+#### 此问题解决
+
+> 之前只是将此问题Mark,但是未将解决方式具体写下,现将其更新
+>
+> ![image-20210621171934972](A_Git详细学习笔记中的图片/image-20210621171934972.png)
+>
+> 或者可以直接写个python小脚本来修改:如果根据该仓库clone时的账号来进行切换是否更合理,这是个好办法... 
+
+## 3、commit报错无法提交
+
+>```shell
+>> running pre-commit hook: lint-staged
+>[STARTED] Preparing...
+>[FAILED] warning: LF will be replaced by CRLF in sh.exe.stackdump.
+>[FAILED] The file will have its original line endings in your working directory.
+>[STARTED] Running tasks...
+>[SKIPPED] Skipped because of previous git error.
+>[STARTED] Applying modifications...
+>[SKIPPED]
+>[SKIPPED]   × lint-staged failed due to a git error.
+>
+>  × lint-staged failed due to a git error.
+>[STARTED] Cleaning up...
+>[SKIPPED]   × lint-staged failed due to a git error.
+>  Any lost modifications can be restored from a git stash:
+>
+>
+>pre-commit hook failed (add --no-verify to bypass)
+>```
+>
+>解决方式
+>
+>```shell
+>执行npm run lint, 根据提示修改错误(推荐)
+>git commit -m "" --no-verify 绕过了lint的检查
+>```
+
+
+
+## 4、Git提交时出现(`合并提示`)`Merge branch 'master' of ...`之解决方法
+
+>多人协作开发项目,在上传代码时通常会先pull一下远程代码,使本地与远程同步更新,但是如果远程此时与自己代码存在冲突,在解决冲突后提交有时会出现“Merge branch ‘master’ of …”这条信息。这是因为pull其本质是fetch+Merge的结合。通常会分为以下两种情况:
+>
+>1.如果远程分支超前于本地分支,并且本地也没有commit操作,此时pull会采用’fast-forward’模式,该模式不会产生合并节点,也即不产生"Merge branch ‘master’ of …"信息。
+>
+>2.如果本地有commit提交,此时若存在冲突,pull拉取代码时远程和本地会出现分叉,会进行分支合并,就会产生"Merge branch ‘master’ of …"信息。
+>
+>**解决方法**
+>
+>>使用`git pull --rebase`命令,如果没有冲突,则会直接合并,如果存在冲突,手动解决冲突即可,不会再产生那条多余的信息。如果你不想每次都rebase,可以在git bash里执行
+>>
+>>```shell
+>>git config --global pull.rebase true
+>>```
+>>
+>>这个配置就是告诉git在每次pull前先进行rebase操作。
+
+### ① 可能出现的相关报错`error:Cannot pull with rebase`
+
+>1. git 执行`git pull –rebase`后报错误如下:
+>
+>   ```sh
+>   error: cannot pull with rebase: Your index contains uncommitted changes.
+>   error: please commit or stash them.
+>   ```
+>
+>2. 原因:如果有未提交的更改,是不能git pull的
+>
+>3. 解决:
+>
+>   - 先执行`git stash`    -->#可用来暂存当前正在进行的工作
+>   - 再执行`git pull –-rebase`
+>   - 最后再执行`git stash pop`  -->#从Git栈中读取最近一次保存的内容
+>
+>4. 截图示例
+>
+>   ![image-20210705115521085](A_Git详细学习笔记中的图片/image-20210705115521085.png)
+
+### ② *防止冲突的有效操作*
+
+>不要直接用`git pull`拉取,而是分开操作,先拉取代码(拉取后可以先查看冲突部分取解决).随后再去合并
+>
+>1. `git fetch 别名`(将修改同步到远程跟踪分支上)
+>2. git merge 远程跟踪分支
+
+## 5、Git删除误提交的大文件历史记录
+
+>1. 应用场景:在我们日常使用Git的时候,一般比较小的项目,我们可能不会注意到.git 这个文件。其实.git文件主要用来记录每次提交的变动,当我们的项目越来越大的时候,我们发现.git文件越来越大。很大的可能是因为提交了大文件,如果你提交了大文件,那么即使你在之后的版本中将其删除,但是`实际上记录中的大文件仍然存在`。
+>2. 原因分析:为什么呢?仔细想一想,虽然你在后面的版本中删除了大文件,但是Git是有版本倒退功能的吧,那么如果大文件不记录下来,git拿什么来给你回退呢?
+>3. 导致的问题:.git文件越来越大导致的问题是--每次拉项目都要耗费大量的时间,并且每个人都要花费那么多的时间。
+>4. git给出了解决方案,使用git branch-filter来遍历git history tree, 可以永久删除history中的大文件,达到让.git文件瘦身的目的。
+>
+>下面给出步骤(以下步骤非常危险,`操作需谨慎!`,最好最好不要在公司项目中使用)
+
+### Ⅰ-列出仓库中最大的几个对象及其文件名
+
+>列出所有仓库中的对象(包括SHA值、大小、路径等),并按照大小降序排列,列出TOP 5(本人示例,你也可多展示)
+>
+>1. 命令示例
+>
+>   ```bash
+>   git rev-list --all --objects | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -n 5 | awk -F ' '  '{print $1}')"
+>   ```
+>
+>2. 图示
+>
+>   ![image-20210508171542001](A_Git详细学习笔记中的图片/列出仓库中最大的几个对象及其文件名.png)
+
+### Ⅱ-将某文件从历史记录中删除
+
+>既然文件找到了(此处删除`杂记_其他(如破解与配置)的碎片化笔记/Typora笔记软件分享/tools/软件包/Typora.dmg`),那么得将该文件从历史记录中删除,执行以下命令:
+>
+>1. 命令示例:
+>
+>   ```bash
+>   git log --pretty=oneline --branches -- "杂记_其他(如破解与配置)的碎片化笔记/Typora笔记软件分享/tools/软件包/Typora.dmg"
+>   ```
+>
+>2. 图示
+>
+>   ![image-20210508171916951](A_Git详细学习笔记中的图片/image-20210508171916951.png)
+
+### Ⅲ-重写所有 commit,将该文件从 Git 历史中完全删除
+
+>上面的命令执行后只是从历史记录中移除,还没有完全删除它,我们需要重写所有 commit,将该文件从 Git 历史中完全删除:
+>
+>1. 代码示例:
+>
+>   ```bash
+>   git filter-branch --index-filter 'git rm --cached --ignore-unmatch  "杂记_其他(如破解与配置)的碎片化笔记/Typora笔记软件分享/tools/软件包/Typora.dmg"' -- --all
+>   ```
+>
+>2. 图示
+>
+>   ![](A_Git详细学习笔记中的图片/删除截图.png)
+>
+>3. 补充注意点:
+>
+>   如果你像我一样,工作区有新写的内容没有追踪与提交导致无法进行删除操作时,千万不要直接暂存`stash`,否则这些没有暂存的内容就没了,要记得先`git add .`
+
+### Ⅳ-把该文件的引用完全删除
+
+>上面的命令执行后,此时历史记录中已经没有该文件了,此时是真正删除了它。 不过我们运行 filter-branch 产生的日志还是会对该文件有引用,所以我们还需要运行以下几条命令,把该文件的引用完全删除:
+>
+>1. 命令示例:
+>
+>  ```bash
+>  rm -rf .git/refs/original/
+>  git reflog expire --expire=now --all
+>  git gc --prune=now
+>  git gc --aggressive --prune=now
+>  ```
+>
+>2. 图示
+>
+>  ![image-20210510183253770](A_Git详细学习笔记中的图片/image-20210510183253770.png)
+>
+>3. 果真编程其实殊途同归,该学的都得学,这里就暴露的Linux没学好的弊端,所以暗下决心,争取今年内将linux系统学习一遍
+
+### Ⅴ-强制提交
+
+>现在我们再看 .git 文件的大小明显变小了,少了那个大文件,说明我们之前误提交的大文件已经删除了。 最后一步就是 push 代码了,不过就是需要强制 push
+>
+>1. 命令示例
+>
+>   ```bash
+>   git push --force
+>   ```
+>
+>2. 图示
+>
+>   ![](A_Git详细学习笔记中的图片/强制提交.jpg)
+
+### Ⅵ-远程仓库GC
+
+>网上所能百度的方法中都没有说到要进行远程存储库GC,但是本人操作后发现,明明命令行中运行了`git gc`,但你的远程仓库仍然会非常庞大甚至更加庞大,也许你本地已经删减至几十兆,但是远程仓库已经"爆仓"达到`1300+兆`,详见`问题7`
+>
+>
+>
+>![image-20210510180757993](A_Git详细学习笔记中的图片/image-20210510180757993.png)
+
+### Ⅶ-删除前后`.git`大小对比
+
+>本人此时测试删除的文件正好为10M,成功删除
+>
+>1. 删除前截图
+>
+>  <img src="A_Git详细学习笔记中的图片/删除大文件前大小.png" style="zoom:67%;" />
+>
+>2. 删除后截图
+>
+>  <img src="A_Git详细学习笔记中的图片/删除大文件后大小.png" style="zoom:67%;" />
+>
+>3. 删除多个文件后
+>
+>   <img src="A_Git详细学习笔记中的图片/image-20210508182039450.png" alt="image-20210508182039450" style="zoom:67%;" />
+
+## 6、git出现文件夹后面跟`@+数字`问题
+
+>1. 问题出现场景:本人欲将两个仓库代码合到一个仓库中,但是原本文件夹内还有.git,导致这些文件夹push后变成了子模块
+>
+>2. 问题场景图例-->具体出问题时并没有截图,此处截图提交时差别(原本应该是一大堆V1.0的文件,结果只有一个文件夹,后面跟着哈希值)
+>
+>   ![image-20210510171915185](A_Git详细学习笔记中的图片/image-20210510171915185.png)
+>
+>3. 解决思路
+>
+>   >删除原来的子文件夹的.git  -->`rm -r .git`,当然也可以手动删除
+>   >
+>   >删除本地git缓存  -->`git rm -r --cached fileName`
+>   >
+>   >重新add,push 
+>
+>4. 解决结果截图
+>
+>   <img src="A_Git详细学习笔记中的图片/image-20210510172159472.png" alt="image-20210510172159472" style="zoom:67%;" />
+
+## 7、远程仓库过大导致无法push
+
+>问题出现场景:在前两天本人发现笔记仓库过大 已经达到600M的时候,本人花了一些时间将无用的大文件删除(详见`问题5`),并且减小到了100M+,然后推送上了gitee上,但是今天push的时候突然报错仓库过大无法推送
+>
+>1. 问题报错截图![image-20210510180415796](A_Git详细学习笔记中的图片/image-20210510180415796.png)
+>
+>2. 本人就产生很大的疑惑,明明我本地仓库才100+M,`.git`文件也才86M,但是远程仓库竟然达到了恐怖的1300M+(当时急于寻找解决方案,没有截图)
+>
+>   本人推测(不确定,也找不到人问,朋友都没经历过这个情况,所以引出记录待定,如果有小伙伴知道了希望可以发在评论区或者私信我)
+>
+>   1. 当时我是将多条命令一起复制进去运行,可能导致`git gc`命令没有运行到(可能性极小,但还是留下悔恨的泪水)
+>
+>   2. 也许本地的gc命令只是清理了本地仓库的,远程也要清理,但这个并不重要,知道了这个点后我们能进行解决了
+>
+>       <img src="A_Git详细学习笔记中的图片/image-20210510180539437.png" alt="image-20210510180539437" style="zoom:50%;" /><img src="A_Git详细学习笔记中的图片/image-20210510181407805.png" alt="image-20210510181407805" style="zoom:67%;" />
+>
+>3. 问题解决:
+>
+>    ![image-20210510180757993](A_Git详细学习笔记中的图片/image-20210510180757993.png)
+>
+>    GC后内存![image-20210510181329197](A_Git详细学习笔记中的图片/image-20210510181329197.png)
+>
+>   4. GC详解
+>
+>   >Git的底层并没有采用 CVS、SVN 底层所采用的那套增量式文件系统,而是采用一套自行维护的存储文件系统。当文件变动发生提交时,该文件系统存储的不是文件的差异信息,而是文件快照,即整个文件内容,并保存指向快照的索引。这种做法,提高 Git 分支的使用效率;但也容易导致代码仓库中内容重复程度过高,从而仓库体积过大。当遇到这种情况时,或者需要将仓库推送到远程主机时,就需要Git中的gc(garbage collect)功能,也就是`垃圾回收功能`。
+>   >
+>   >大体来说,当运行 "git gc" 命令时,Git会收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。 此外,Git还会将所有引用 (references) 并入一个单独文件。
+>   >
+>   >就细节而言,Git做了这几件事:
+>   >
+>   >pack_refs 过程
+>   >reflog expire 过程
+>   >repack 过程
+>   >prune 过程
+>   >rerere 过程
+>   >
+>   >pack_refs 过程相当于执行"git pack-refs --all --prune",它会将$GIT_DIR/refs目录下的所有heads和tags打包成一个文件并保存为$GIT_DIR/packed-refs下。
+>   >
+>   >reflog expire 过程相当于执行"git reflog expire --all",它会将删除所有超过期限而且没有被refs涉及的reflog条目。
+>   >
+>   >repack 过程相当于执行"git repack -d -l",一般情况下还会包括"-A"选项,它会将所有未被包含在一个pack的松散对象连结成一个pack,也会将现有的pack重新组织为一个新的更有效率的pack,并删除冗余的pack(如果她们中存在不可达的松散对象,会先把这些对象释放出来)。
+>   >
+>   >prune 过程相当于执行"git prune --expire",他会删除所有过期的、不可达的且未被打包的松散对象。
+>   >
+>   >rerere 过程相当于执行"git rerere gc",这种情形下似乎没什么用。
+>   >
+>   >所以本人推测应该是进行了`问题5`操作后还需要`进行一次GC操作`
+
+## 8、Git GUI中文乱码问题解决方法
+
+>当我们使用Git GUI的查看代码的时候,有时候会出现中文乱码:
+>
+>1. 解决方案1:直接在`GIT GUI`中操作
+>
+>   **![image-20210701180547401](A_Git详细学习笔记中的图片/image-20210701180547401.png) 
+>
+>2. 解决方案2:命令行
+>
+>   ```sh
+>   git config --global gui.encoding utf-8
+>   ```
+>
+>3. 解决方案3:直接修改配置文件
+>
+>   >在软件的安装目录下,在`Git\mingw32\etc\gitconfig`文件末尾添加:
+>   >
+>   >```sh
+>   >[gui]encoding=utf-8
+>   >```

BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210508171916951.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210508182039450.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510171915185.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510172159472.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180415796.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180539437.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180756184.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510180757993.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510181329197.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510181407805.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210510183253770.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210621171934972.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210621172453710.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210701180547401.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/image-20210705115521085.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/列出仓库中最大的几个对象及其文件名.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除大文件前大小.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除大文件后大小.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除引用.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/删除截图.png


BIN
孙浩博/Git学习笔记/A_Git详细学习笔记中的图片/强制提交.jpg


+ 410 - 0
孙浩博/Git学习笔记/git与vim常见指令集.md

@@ -0,0 +1,410 @@
+> [十分详细的git指令](https://juejin.im/post/5deb81b0e51d4557fd76f5f3)
+
+# 常用Git命令总结
+
+```shell
+- git config --global user.name "你的名字" 让你全部的Git仓库绑定你的名字
+- git config --global user.email "你的邮箱" 让你全部的Git仓库绑定你的邮箱
+- git init 初始化你的仓库
+- git add . 把工作区的文件全部提交到暂存区
+- git add ./<file>/ 把工作区的<file>文件提交到暂存区
+- git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡
+- git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来
+- git push -u origin master 把仓库区的主分支master提交到远程仓库里
+- git push -u origin <其他分支> 把其他分支提交到远程仓库
+- git status查看当前仓库的状态
+- git diff 查看文件修改的具体内容
+- git log 显示从最近到最远的提交历史  git log --pretty=oneline(更简洁的方式显示)
+- git clone + 仓库地址下载克隆文件
+- git reset --hard + 版本号 回溯版本,版本号在commit的时候与master跟随在一起
+- git reflog 显示命令历史
+- git checkout -- <file> 撤销命令,用版本库里的文件替换掉工作区的文件。我觉得就像是Git世界的ctrl + z
+- git rm 删除版本库的文件
+- git branch 查看当前所有分支
+- git branch <分支名字> 创建分支
+- git checkout <分支名字> 切换到分支
+- git merge <分支名字> 合并分支
+- git branch -d <分支名字> 删除分支,有可能会删除失败,因为Git会保护没有被合并的分支
+- git branch -D + <分支名字> 强行删除,丢弃没被合并的分支
+- git log --graph 查看分支合并图
+- git merge --no-ff <分支名字> 合并分支的时候禁用Fast forward模式,因为这个模式会丢失分支历史信息
+- git stash 当有其他任务插进来时,把当前工作现场“存储”起来,以后恢复后继续工作
+- git stash list 查看你刚刚“存放”起来的工作去哪里了
+- git stash apply 恢复却不删除stash内容
+- git stash drop 删除stash内容
+- git stash pop 恢复的同时把stash内容也删了
+- git remote 查看远程库的信息,会显示origin,远程仓库默认名称为origin
+- git remote -v 显示更详细的信息
+- git pull 把最新的提交从远程仓库中抓取下来,在本地合并,和git push相反
+- git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观
+- git tag 查看所有标签,可以知道历史版本的tag
+- git tag <name> 打标签,默认为HEAD。比如git tag v1.0
+- git tag <tagName> <版本号> 把版本号打上标签,版本号就是commit时,跟在旁边的一串字母数字
+- git show <tagName> 查看标签信息
+- git tag -a <tagName> -m "<说明>" 创建带说明的标签。-a指定标签名,-m指定说明文字
+- git tag -d <tagName> 删除标签
+- git push origin <tagname> 推送某个标签到远程
+- git push origin --tags 一次性推送全部尚未推送到远程的本地标签
+- git push origin :refs/tags/<tagname> 删除远程标签<tagname>
+- git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目
+- git add -f <file> 强制提交已忽略的的文件
+- git check-ignore -v <file> 检查为什么Git会忽略该文件
+```
+
+
+
+
+
+# vim常用指令
+
+## VIM 进入和退出命令
+
+> **常用命令是ESC,然后:wq(保存并退出),:q!(不保存并强制退出),i进入vim模式。另外还有其它的,我可能都不会用到。。。**
+> **按ESC键 跳到命令模式,然后:**
+
+```shell
+1. :w 保存文件但不退出vi
+2. :w file 将修改另外保存到file中,不退出vi
+3. :w! 强制保存,不推出vi
+4. :wq 保存文件并退出vi
+5. :wq! 强制保存文件,并退出vi
+6. q: 不保存文件,退出vi
+7. :q! 不保存文件,强制退出vi
+8. :e! 放弃所有修改,从上次保存文件开始再编辑
+```
+
+## 命令历史
+
+```shell
+以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。
+```
+
+## 导航命令
+
+```shell
+% 括号匹配
+```
+
+
+
+## 插入命令
+
+```shell
+i 在当前位置生前插入
+
+I 在当前行首插入
+
+a 在当前位置后插入
+
+A 在当前行尾插入
+
+o 在当前行之后插入一行
+
+O 在当前行之前插入一行
+```
+
+
+
+## 查找命令
+
+```shell
+/text  查找text,按n健查找下一个,按N健查找前一个。
+
+?text  查找text,反向查找,按n健查找下一个,按N健查找前一个。
+
+vim中有一些特殊字符在查找时需要转义  .*[]^%/?~$
+
+:set ignorecase  忽略大小写的查找
+
+:set noignorecase  不忽略大小写的查找
+
+查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。
+
+:set hlsearch  高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。
+
+:set nohlsearch  关闭高亮搜索显示
+
+:nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。
+
+:set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。
+
+:set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。
+```
+
+
+
+## 替换命令
+
+```shell
+ra 将当前字符替换为a,当期字符即光标所在字符。
+
+s/old/new/ 用old替换new,替换当前行的第一个匹配
+
+s/old/new/g 用old替换new,替换当前行的所有匹配
+
+%s/old/new/ 用old替换new,替换所有行的第一个匹配
+
+%s/old/new/g 用old替换new,替换整个文件的所有匹配
+
+:10,20 s/^/  /g 在第10行知第20行每行前面加四个空格,用于缩进。
+
+ddp 交换光标所在行和其下紧邻的一行。
+```
+
+
+
+## 移动命令
+
+```shell
+h 左移一个字符
+l 右移一个字符,这个命令很少用,一般用w代替。
+k 上移一个字符
+j 下移一个字符
+以上四个命令可以配合数字使用,比如20j就是向下移动20行,5h就是向左移动5个字符,在Vim中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!<Esc>,这里的Esc是必须的,否则命令不生效。
+
+w 向前移动一个单词(光标停在单词首部),如果已到行尾,则转至下一行行首。此命令快,可以代替l命令。
+
+b 向后移动一个单词 2b 向后移动2个单词
+
+e,同w,只不过是光标停在单词尾部
+
+ge,同b,光标停在单词尾部。
+
+^ 移动到本行第一个非空白字符上。
+
+0(数字0)移动到本行第一个字符上,
+
+<HOME> 移动到本行第一个字符。同0健。
+
+$ 移动到行尾 3$ 移动到下面3行的行尾
+
+gg 移动到文件头。 = [[
+
+G(shift + g) 移动到文件尾。 = ]]
+
+f(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符。
+
+F 同f,反向查找。
+
+跳到指定行,冒号+行号,回车,比如跳到240行就是 :240回车。另一个方法是行号+G,比如230G跳到230行。
+
+Ctrl + e 向下滚动一行
+
+Ctrl + y 向上滚动一行
+
+Ctrl + d 向下滚动半屏
+
+Ctrl + u 向上滚动半屏
+
+Ctrl + f 向下滚动一屏
+
+Ctrl + b 向上滚动一屏
+```
+
+
+
+## 撤销和重做
+
+```shell
+u 撤销(Undo)
+U 撤销对整行的操作
+Ctrl + r 重做(Redo),即撤销的撤销。
+```
+
+
+
+## 删除命令
+
+```shell
+x 删除当前字符
+
+3x 删除当前光标开始向后三个字符
+
+X 删除当前字符的前一个字符。X=dh
+
+dl 删除当前字符, dl=x
+
+dh 删除前一个字符
+
+dd 删除当前行
+
+dj 删除上一行
+
+dk 删除下一行
+
+10d 删除当前行开始的10行。
+
+D 删除当前字符至行尾。D=d$
+
+d$ 删除当前字符之后的所有字符(本行)
+
+kdgg 删除当前行之前所有行(不包括当前行)
+
+jdG(jd shift + g)  删除当前行之后所有行(不包括当前行)
+
+:1,10d 删除1-10行
+
+:11,$d 删除11行及以后所有的行
+
+:1,$d 删除所有行
+
+J(shift + j)  删除两行之间的空行,实际上是合并两行。
+```
+
+
+
+## 拷贝和粘贴
+
+```shell
+yy 拷贝当前行
+
+nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。
+
+p 在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。
+
+shift+p 在当前行前粘贴
+
+:1,10 co 20 将1-10行插入到第20行之后。
+
+:1,$ co $ 将整个文件复制一份并添加到文件尾部。
+
+正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制
+
+ddp交换当前行和其下一行
+
+xp交换当前字符和其后一个字符
+```
+
+
+
+## 剪切命令
+
+```shell
+正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切
+
+ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
+
+:1,10d 将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。
+
+:1, 10 m 20 将第1-10行移动到第20行之后。
+```
+
+
+
+## 退出命令
+
+```shell
+:wq 保存并退出
+
+ZZ 保存并退出
+
+:q! 强制退出并忽略所有更改
+
+:e! 放弃所有修改,并打开原来文件。
+```
+
+
+
+## 窗口命令
+
+```shell
+:split或new 打开一个新窗口,光标停在顶层的窗口上
+
+:split file或:new file 用新窗口打开文件
+
+split打开的窗口都是横向的,使用vsplit可以纵向打开窗口。
+
+Ctrl+ww 移动到下一个窗口
+
+Ctrl+wj 移动到下方的窗口
+
+Ctrl+wk 移动到上方的窗口
+
+关闭窗口
+
+:close 最后一个窗口不能使用此命令,可以防止意外退出vim。
+
+:q 如果是最后一个被关闭的窗口,那么将退出vim。
+
+ZZ 保存并退出。
+
+关闭所有窗口,只保留当前窗口
+
+:only
+
+录制宏
+
+按q键加任意字母开始录制,再按q键结束录制(这意味着vim中的宏不可嵌套),使用的时候@加宏名,比如qa。。。q录制名为a的宏,@a使用这个宏。
+```
+
+
+
+## 执行shell命令
+
+```shell
+:!command
+
+:!ls 列出当前目录下文件
+
+:!perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。
+
+:!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。
+
+:suspend或Ctrl - Z 挂起vim,回到shell,按fg可以返回vim。
+```
+
+
+
+## 注释命令
+
+```shell
+perl程序中#开始的行为注释,所以要注释某些行,只需在行首加入#
+
+3,5 s/^/#/g 注释第3-5行
+
+3,5 s/^#//g 解除3-5行的注释
+
+1,$ s/^/#/g 注释整个文档。
+
+:%s/^/#/g 注释整个文档,此法更快。
+```
+
+
+
+## 帮助命令
+
+```shell
+:help or F1 显示整个帮助
+:help xxx 显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。
+:help 'number' Vim选项的帮助用单引号括起
+:help <Esc> 特殊键的帮助用<>扩起
+:help -t Vim启动参数的帮助用-
+:help i_<Esc> 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式
+帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回
+```
+
+
+
+## 其他非编辑命令
+
+```shell
+. 重复前一次命令
+
+:set ruler?  查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看
+
+:scriptnames  查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等。
+
+:set list 显示非打印字符,如tab,空格,行尾等。如果tab无法显示,请确定用set lcs=tab:>-命令设置了.vimrc文件,并确保你的文件中的确有tab,如果开启了expendtab,那么tab将被扩展为空格。
+
+Vim教程
+在Unix系统上
+$ vimtutor
+在Windows系统上
+:help tutor
+
+:syntax 列出已经定义的语法项
+:syntax clear 清除已定义的语法规则
+:syntax case match 大小写敏感,int和Int将视为不同的语法元素
+:syntax case ignore 大小写无关,int和Int将视为相同的语法元素,并使用同样的配色方案
+```
+

+ 26 - 0
孙浩博/Git学习笔记/你可能会忽略的 Git 提交规范摘录.md

@@ -0,0 +1,26 @@
+# 本人笔记提交标准
+
+**分支命名**:日期_姓名首字母缩写_功能单词,如:`210804_xfg_buildFramework`
+
+**提交规范**:`作者,type: desc` 如:`孙浩博,fix:修复查询用户信息逻辑问题` *参考Commit message 规范*
+
+```shell
+# 主要type
+feat:     增加新功能
+fix:      修复bug
+
+# 特殊type
+docs:     只改动了文档相关的内容
+style:    不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
+build:    构造工具的或者外部依赖的改动,例如webpack,npm
+refactor: 代码重构时使用
+revert:   执行git revert打印的message
+
+# 暂不使用type
+test:     添加测试或者修改现有测试
+perf:     提高性能的改动
+ci:       与CI(持续集成服务)有关的改动
+chore:    不修改src或者test的其余修改,例如构建过程或辅助工具的变动
+```
+
+

+ 367 - 0
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记.md

@@ -0,0 +1,367 @@
+# #说明
+
+> 本笔记是本人对于Git工作流的学习感悟与记录(部分是摘录)
+>
+> 借阅参考的资料:阮一峰的[Git工作流程](http://www.ruanyifeng.com/blog/2015/12/git-workflow.html)、[《Git 分支管理策略》](https://www.ruanyifeng.com/blog/2012/07/git.html);掘金上zifeiyu的[GIT工作流指南系列--gitFlow工作流](https://juejin.cn/post/6844903997589946382#heading-4)、红尘炼心的[『前端进阶』—— 代码管理方案之Aone Flow](https://juejin.cn/post/6979605217184579591);[钱五哥の自由空间](http://www.brofive.org/)的[Git 代码分支模型GitFlow、GitHub Flow、Trunk Based Development](http://www.brofive.org/?p=2165);[替代分支模型](https://trunkbaseddevelopment.com/alternative-branching-models/);*[刘尚奇](https://insights.thoughtworks.cn/author/liushangqi/)*的[Gitflow有害论](http://insights.thoughtworks.cn/gitflow-consider-harmful/);Paul Hammant的[What is Trunk-Based Development?](https://paulhammant.com/2013/04/05/what-is-trunk-based-development/);以及公司前辈在技术分享会上的讲述
+>
+> 本人笔记地址分享:[`全部笔记`](https://gitee.com/hongjilin/hongs-study-notes)、[`Git笔记`](https://gitee.com/hongjilin/hongs-study-notes/tree/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Git%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0)
+
+# #目录
+
+>[TOC]
+
+# 一、Git 工作流程概念
+
+>Git 作为一个源码管理系统,不可避免涉及到多人协作。
+>
+>协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去。"工作流程"在英语里,叫做"workflow"或者"flow",原意是水流,比喻项目像水流那样,顺畅、自然地向前流动,不会发生冲击、对撞、甚至漩涡。
+>
+>如果你对于Git还不是很熟练,可以看本人关于Git的详细学习笔记,内给出了对应的学习教程来源    -->**[点我跳转](https://gitee.com/hongjilin/hongs-study-notes/tree/master/编程_前端开发学习笔记/Git学习笔记)** 
+
+## 1、定义
+
+>- 基于Git的强大分支能力所构建的一套软件开发工作流
+>- 根据项目具体需求定制的一套工作规范
+
+## 2、存在意义
+
+>1. 整个研发流程(软件工程)管理中的重要环节
+>    - 上游:项目管理/缺陷管理  
+>    - 下游:运维部署(CD)
+>
+>2. 所有类型的提出基本能解决:
+>   - 特性独立开发互不影响,记录发布历史
+>    - 多版本并行,多环境多渠道部署的不同需求
+
+## 3、功能驱动
+
+>- 常见的几种工作流程,有一个共同点:都采用["功能驱动式开发"](https://en.wikipedia.org/wiki/Feature-driven_development)(Feature-driven development,简称FDD)。
+>- 它指的是,需求是开发的起点,先有需求再有功能分支(feature branch)或者补丁分支(hotfix branch)。完成开发后,该分支就合并到主分支,然后被删除。
+>
+>例如:Git flow、Github flow、Gitlab flow等
+
+## 4、省流总结
+
+>- `没有银弹!!`-->没有非黑即白的工作流,只有不同应用场景的选择
+>- `branch的本质是一种轻量级的代码隔离技术,生命周期应该尽可能地短`
+>- 本身工作流也是一种人为规定的规范,可以结合常见的几种工作流然后取其精华去其糟粕规定出自己所需的工作流
+>- 工作中最好细致拆解任务,这样可以防止feature开发周期过长导致合并时带上`痛苦面具`
+>- 养成习惯:频繁进行pull与rebase操作,冲突还真是麻烦的
+
+# 二、Git Flow
+
+> 更详细的关于Git flow相关知识可以查阅阮一峰的[《Git 分支管理策略》](https://www.ruanyifeng.com/blog/2012/07/git.html)。
+>
+> 此工作流也是最具有争议的
+
+## 1、工作流程图
+
+>![image-20210702142024042](分支管理策略[Git工作流]学习笔记中的图片/image-20210702142024042.png)
+
+## 2、特点
+
+>它主要有两个特点
+>
+>1. 首先项目存在两个长期分支:
+>   - 主分支`master`
+>   - 开发分支`develop`
+>   - `ps`:前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;后者用于日常开发,存放最新的开发版。
+>2. 其次,项目存在三种短期分支
+>   - 功能分支(feature branch)
+>   - 补丁分支(hotfix branch)
+>   - 预发分支(release branch)
+>   - ps`:一旦完成开发,它们就会被合并进`develop`或`master`,然后被删除。
+
+## 3、分支删除管理
+
+>- 特性分支合并到dev后,删除feature
+>- 发布分支合并到master和dev后,删除release
+>- 修复分支合并到master和dev后,删除hotfix
+
+## 4、GitFlow分支说明
+
+>根据主流的Git工作流,一般分为:master(`必须`)、release(`通常必须`)、develop(`必须`)、hoxfix/xxx、bug/xxx、feature/xxx,分支贯穿了整个**开发、测试、部署**流程
+>
+>各分支的定位以及权限描述:
+>
+>![image-20210702154430932](分支管理策略[Git工作流]学习笔记中的图片/image-20210702154430932.png) 
+
+## 5、缺点与其有害论
+
+>缺点
+>
+>- 特性分支基于dev,代码不够稳定
+>- 发布分支基于dev,可能含有不打算发布的特性
+>- 非官方推荐,类似于民间约定俗成的工作流
+>
+>有害论
+>
+>- 流程相对复杂,需要要求成员深刻理解流程并且严格执行
+>- merge总是痛苦和易错的,成本异常高,特别是feature的周期很长的时候.合并的时候总会带上`痛苦面具`
+>- 持续集成引起的不适
+>- 借阅的资料:[Gitflow有害论](http://insights.thoughtworks.cn/gitflow-consider-harmful/)
+
+## 6、工作流实践
+
+> 此实践参考资料来自于掘金的[zifeiyu的GIT工作流指南系列](https://juejin.cn/post/6844903997589946382)
+
+### Ⅰ-初始化
+
+>你可以从远程仓库clone项目或者本地新建项目
+>
+>1. 初始化命令
+>
+>```sh
+>git flow init
+>```
+>
+>2. 该命令会指引你去修改不同分支的前缀,建议没有特别的需求使用默认前缀即可
+>
+>   ```sh
+>   $ git flow init
+>   Initialized empty Git repository in /Users/tobi/acme-website/.git/
+>   Branch name for production releases: [master] 
+>   Branch name for "next release" development: [develop] 
+>   
+>   How to name your supporting branch prefixes?
+>   Feature branches? [feature/] 
+>   Release branches? [release/] 
+>   Hotfix branches? [hotfix/] 
+>   ```
+>
+>3. 如果你不需要修改默认的分支前缀(大多数情况)那么也可以使用如下命令进行初始化来跳过询问过程
+>
+>```sh
+>git flow init -d
+>```
+
+### Ⅱ-feature分支
+
+#### ① *本地操作流程*
+
+>- 当我们初始化完成之后,就可以开始一个新功能的开发,开发新功能需要在feature分支上进行,下面就让我们创建一个新的叫做rss-feed的feature分支
+>
+>```sh
+>git flow feature start rss-feed
+>```
+>
+>- 这个功能可能需要多人协作才能完成,所以我们需要把它发布到远端(如果是本地创建的项目,请先与远端仓库建立联系)
+>
+>```sh
+>git flow feature public rss-feed
+>```
+>
+>这条指令在远程仓库新建了一个feature/rss-feed的分支,并将本地ree-feed分支track上述分支,push本地分支代码。
+>
+>ps:该命令只能执行一次,当远程仓库已经有了相应分支,在执行该命令将会报错,这个时候只要执行push命令就可以了。
+>
+>- 经过一段时间的努力,我们跟同事一起协作开发完成了rss-feed分支上的功能,我们需要把这个feature分支合并到develop分支(可能还有别的feature分支,一起合并到develop)。
+>
+>```sh
+>git flow feature finish rss-feed
+>```
+>
+>*该命令做了以下几件事*
+>
+>- 切换到develop分支
+>- 将feature/rss-feed分支merge到develop分支
+>- 删除本地feature/rss-feed分支
+>
+>  `注意`:
+> - git flow进行merge操作或者tag操作的时候,会让打开vim编辑器让你填写merge信息或者tag信息(tag信息必须填写,否则无法打tag)
+> - 如果merge过程发生了冲突,则在第二步merge时终止流程,即不会再删除本地分支。但当前已处于develop分支,待本地冲突解决并commit后,重新执行git flow feature finish <feature_name>即可完成finish流程。
+
+#### ② *同步远程仓库*
+
+>- push本地develop分支
+>
+>- 删除远端仓库feature/rss-feed分支
+>
+>- ```sh
+>  git push origin develop
+>   git push origin :feature/rss-feed
+
+#### ③ ***finish指令的附加参数***
+
+>- -r mege前先进行rebase操作
+>- -F merge操作完成后删除远程和本地feature分支
+>- -k 保留feature分支
+
+### Ⅲ-release分支
+
+>当项目组的各个成员都完成了自己在本次版本中feature分支的功能开发并合并到develop分支,项目的管理员应当开始`release`操作。
+>
+>基于develop分支拉出release分支进行测试,发现bug项目组成员拉取release分支后直接在release分支上进行修改,并提交到远程仓库。
+
+#### **操作具体流程**
+
+>1. 切换到master分支
+>2. 执行git fetch检查更新: 如果远程仓库有更新,会停下来并让你先执行git pull命令(如果有冲突解决冲突并提交,这可能是唯一一种直接操作master分支的情形了), 确保本地master是最新的。
+>3. 如果没有更新,将release/v2.0分支合并到本地master: 会让你填写merge信息,vim的形式(如何操作vim)
+>4. 将release/v2.0分支合并到本地develop
+>5. 删除本地release/v2.0分支
+>6. 注意:
+>   - 建议在使用`release finish`命令之前使用git pull更新develop和master代码,特别是master
+>   - 如果本地还有未finish的release分支,将不允许使用start指令开启新的release分支,这一点是对并行发布的一个限制。
+>7. 然后同步到远程
+
+### Ⅳ-hotfix分支
+
+>当我们的线上版本出现BUG需要紧急修复的时候,流程如下:
+>
+>1. 假设修复bug的版本号为v2.0-patch
+>
+>   ```sh
+>   git flow hotfix start v2.0-patch
+>   ```
+>
+>   hotfix并没有public命令,因为BUG一般是比较小且不可分割的逻辑单元,通常是单人在单个工作周期内完成,也不需要跟其他人协作。
+>
+>2. 本地完成修复,并测试通过commit之后就可以执行finish命令
+>
+>   ```sh
+>   git flow hotfix finish v2.0-patch
+>   ```
+>
+>3. 运行结果
+>
+>   ```sh
+>   Summary of actions:
+>   - Latest objects have been fetched from 'origin'
+>   - Hotfix branch has been merged into 'master'
+>   - The hotfix was tagged 'v2.0-patch'
+>   - Hotfix branch has been back-merged into 'develop'
+>   - Hotfix branch 'hotfix/v2.0-patch' has been deleted
+>   ```
+>
+>   对应的意思
+>
+>   - git fetch 检查本地与远端是否up-to-date
+>   - 将v2.0-patch分支合并到master分支
+>   - 生成「v2.0-pathc」标签
+>   - 将v2.0-patch分支合并到develop分支
+>   - 删除本地v2.0-patch分支
+
+### Ⅴ-关于feature分支的讨论
+
+>不知道大家有没有这个疑问?feature分支的逻辑功能颗粒度应当是怎样的?是一个可拆分的大任务?需要多人协作?还是一个不可拆分的逻辑单元,只能由一个人独立完成?
+>
+>我的看法是,每个人都应该有自己的feature分支,feature分支应当是不可拆分的完整逻辑功能,不应当多人协作;如果能够拆分那就拆成两个不同的feature分支。
+
+**这么做的理由是:**
+
+- 如果多人使用同一个feature,势必会导致publish的冲突,因为只能publish一次。
+- finish操作也只能有一个人完成
+- feature分支需要时不时的进行pull/push操作
+- 每个分支还必须有一个管理者,整个项目还需要一个最终管理者进行release操作,导致组织结构复杂,而软件工程开发本身是一个扁平化的结构,扁平化代表了高效率。
+
+**由此引发的讨论:**
+
+- 既然feature分支只是自己在用,是否有必要将feature分支publish到远程仓库呢?
+- 前端如何进行任务分配?模块化,微服务等概念如何在前端落地?一个项目如何能够拆分成互不干涉,完全解耦的几个部分?如果不能,那么多人协作的过程中势必会产生冲突和功能重复,代码冗余,如何避免呢?
+
+
+
+
+## 7、结论
+
+>Git flow的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。大多数工具都将`master`当作默认分支,可是开发是在`develop`分支进行的,这导致经常要切换分支,非常烦人。
+>
+>更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本。但是,很多网站项目是"持续发布",代码一有变动,就部署一次。这时,`master`分支和`develop`分支的差别不大,没必要维护两个长期分支。
+
+
+
+
+# 三、Trunk-based Flow
+
+>也许你会突然有疑惑,不应该先说 Github flow与Gitlab flow吗?
+>
+>其实这个工作流是本人学习`Git flow`过程中根据其缺点有人提出的新的工作流程,此处就将其排于`Git flow`之后
+>
+>更详细请看相关资料:[What is Trunk-Based Development?](https://paulhammant.com/2013/04/05/what-is-trunk-based-development/)
+
+## 1、工作流程图
+
+>![image-20210702144120442](分支管理策略[Git工作流]学习笔记中的图片/image-20210702144120442.png)
+>
+>适用场景:`适合于单一稳定产品线,迭代排期稳定,需求边界完全可控的团队`
+
+## 2、提出的原因
+
+>- 使用`Git flow`:
+>
+>  你会发现,在坚持持续集成实践的情况下,feature branch是一件非常矛盾的事情。持续集成在鼓励更加频繁的代码集成和交互,让冲突越早解决越好。feature branch的代码隔离策略却在尽可能推迟代码的集成。延迟集成所带来的恶果在软件开发的历史上已经出现过很多次了,每个团队自己写自己的代码是挺high,到最后不同团队进行联调集成的时候就傻眼了,经常出现写两个月代码,花一个月时间集成的情况,质量还无法保证。
+>
+>- 而此工作流所有的开发工作都在同一个master分支上进行,同时利用[Continuous Integration](http://www.martinfowler.com/articles/continuousIntegration.html)确保master上的代码随时都是production ready的。从master上拉出release分支进行release的追踪。
+
+## 3、缺点
+
+>没有Feature分支:feature branch可以确保没完成的feature不会进入到production呀。没关系,[Feature Toggle](http://martinfowler.com/bliki/FeatureToggle.html)技术也可以帮你做到这一点
+
+## 4、优点
+
+>对于持续集成,每日构建,每日冒烟十分友好
+
+# 四、GitHub Flow
+
+## 1、工作流程图
+
+>![image-20210702152422183](分支管理策略[Git工作流]学习笔记中的图片/image-20210702152422183.png) 
+>
+>详细了解看:https://guides.github.com/introduction/flow/
+
+## 2、特点
+
+>分支结构简单,`非常强调CR`,通过CR保证理论上主干代码质量有保障
+
+## 3、缺点
+
+>没有解答部署、环境、发布、集成等问题
+
+# 五、GitLab Flow
+
+>在`GitHub Flow`的基础上考虑了一些环境部署、项目管理等问题
+>
+>![image-20210702152726339](分支管理策略[Git工作流]学习笔记中的图片/image-20210702152726339.png) 
+
+# 六、Aone Flow
+
+>参考资料:掘金的红尘炼心的[『前端进阶』—— 代码管理方案之Aone Flow](https://juejin.cn/post/6979605217184579591)
+>
+>其关于此知识点博客写的已经很好了,摘录下来并加上自己少许理解
+
+## 1、开发流程
+
+>
+>
+>![image-20210702152841056](分支管理策略[Git工作流]学习笔记中的图片/image-20210702152841056.png) 
+>
+>在Aone Flow中只有三种分支,正式分支master,预发布分支release,功能分支(特性分支)feature。
+>
+>当开发新功能时,从master分支创建feature分支,分支的命名通常以“feature/功能名称”来命名,每个feature分支可以是一个人完成,或是多个人协作完成。
+>
+>切记不能用master分支去合并feature分支,也不能在master分支上直接修改代码然后提交,master分支只能用来合并release分支
+
+## 2、预发布流程
+
+>![image-20210702153327715](分支管理策略[Git工作流]学习笔记中的图片/image-20210702153327715.png) 
+>
+>在Aone Flow中使用release分支作为预发布分支,先用master分支创建一个release分支,分支的名称通常以release/环境名称,然后将要预发布的功能对应的feature分支合并到release分支。最后将release分支的代码部署到对应的预发布环境进行测试,若出现BUG,直接在release分支上修复,修复完成后再部署到对应的预发布环境测试。
+
+## 3、正式发布流程
+
+>![image-20210702153021942](分支管理策略[Git工作流]学习笔记中的图片/image-20210702153021942.png) 
+>
+>当release分支的代码在对应的预发布环境测试通过后,用master分支合并release分支,合并完成后打出一个tag,其tag的名称可以用版本号来命名,然后将tag上的代码部署到正式环境,正式发布流程完成,同时删除release分支和相关联的feature分支。
+
+## 4、修复正式环境的BUG流程
+
+>- 若正式环境出现BUG,那么要找到对应版本的tag,用tag创建出一个release分支,此时的release分支相当fixbug分支,在release分支上修复BUG后,将代码部署到对应的预发布环境进行测试。
+>- 若测试通过后,在release分支打一个tag,其tag的名字用该版本号后面加个小版本号来命名,如修复v1.1版本的BUG,则tag的名称为v1.1.1,然后将该tag的代码部署在正式环境,最后再用master分支合并release分支,合并完成后将release分支删除。
+>- 若测试未通过,继续在release分支修复BUG,再将代码部署到对应的预发布环境进行测试。
+
+## 5、可能的玩法
+
+>- 发布分支对应具体的环境
+>- 一个发布分支对应多个环境,比如把`灰度发布`和正式发布串在一起,中间加上人工验收的步骤  -->[什么是灰度发布?](http://www.appadhoc.com/blog/what-is-gray-release/)
+>- 分布分支对应办呢吧,再将一系列环境串联起来

BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702142024042.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702144120442.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152422183.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152726339.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702152841056.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702153021942.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702153327715.png


BIN
孙浩博/Git学习笔记/分支管理策略[Git工作流]学习笔记中的图片/image-20210702154430932.png


+ 342 - 0
孙浩博/Git学习笔记/开发中必须要掌握的 Git 技巧摘录.md

@@ -0,0 +1,342 @@
+# #目录
+
+>[TOC]
+
+## 开发中必须要掌握的 Git 技巧
+
+本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会有出错的地方,欢迎指正。
+
+廖雪峰老师讲Git讲的通俗易懂,对小白很友好。认认真真花上两天时间去整理,会有所收获的。
+
+廖老师的个人网站传送门:
+
+> https://www.liaoxuefeng.com/
+
+## Git是什么
+
+官方话:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。
+
+它能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。
+
+## 为什么要学习Git
+
+- 面试要被问。可以应付面试。
+- 很多公司开发都用Git来处理项目。现在不学,以后肯定还要学。
+- 在我看来Git是现如今所有程序员都要掌握的,以后与同事共同开发项目必定要用到的,熟练掌握Git命令,可以提高开发的效率。
+
+## 安装Git
+
+### Windows
+
+直接在官网上去下载。下载完成后,随便在某个文件下右键如果有Git Bash Here就安装成功。安装后,还要在命令行输入
+
+```
+$git config --global user.name "你的名字"
+$git config --global user.email "你的邮箱"
+```
+
+global表示全局,这台机器所有的Git仓库都会使用这个配置。允许单个仓库使用其他的名字和邮箱。
+
+### Mac
+
+> Mac也可以像Windows一样,按上面的步骤安装。
+
+也可以直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
+
+## 仓库
+
+![图片](https://mmbiz.qpic.cn/mmbiz/eQPyBffYbufTCibib86U9CCeu7ibdH4FyIsH10EpW9P88HfHYRVab9HxJjpmXpS2RqI0wNIiaibCOsZUWPrc3bfHs5w/640?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
+
+本地仓库是对于远程仓库而言的。本地仓库 = 工作区 + 版本区。
+
+- 工作区即磁盘上的文件集合。
+- 版本区(版本库)即.git文件。
+- 版本库 = 暂存区(stage) + 分支(master) + 指针Head。
+
+以我使用最频繁的git命令为例,即提交到github为例。
+
+- git init 原本本地仓库只包含着工作区,这是最常见的工作状态。此时,git init一下,表示在本地区域创建了一个.git文件,版本区建立。
+- git add . 表示把工作区的所有文件全部提交到版本区里面的暂存区
+- 当然你也可以通过 git add ./xxx/ 一条一条分批添加到暂存区。
+- git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡。
+- git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来。
+- git push -u origin master 把仓库区的文件提交到远程仓库里。
+- 一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。会有这样的信息nothing to commit, working tree clean
+
+## 提交到GitHub
+
+以前不熟悉git命令的时候,我提交项目到github上都是直接在网页上直接拉取文件提交上去的。有点羞耻。
+
+![图片](https://mmbiz.qpic.cn/mmbiz/eQPyBffYbufTCibib86U9CCeu7ibdH4FyIs0icjYJkBm5FgUxI39IuibpzHx7zGpcb9EE0sPp19dqluib7icLHAGFnhOQ/640?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
+
+
+
+- git init .初始化,表示把这个文件变成Git可以管理的仓库。初始化后打开隐藏的文件可以看到有一个.git文件。
+- git add . 后面的一个点表示把这个文件全部提交到暂存区。
+- git add ./readme.md/ 表示把这个文件下面的readme.md文件提交到暂存区。
+- git commit -m "你要评论一点什么东西" git commit的意思是把暂存区的全部文件提交到本地仓库。-m后接评论。
+- git remote add origin https://github.com/name/name_cangku.git表示把你本地的仓库与GitHub上的远程仓库连接起来。只需要连接一次,以后提交的时候就可以不用谢这条命令了。name是你的github名字,name_cangku是你的仓库名。注意不要把后面的.git给漏掉了。因为我前面就是这么走过来的,绕了很多弯路。至于如何在GitHub上新建仓库,网上有很多教程,这里不再赘述了。
+- git push -u origin master 把本地仓库提交到远程仓库。(最后一步)在你的远程仓库上刷新一下就可以看到你提交的文件了。
+- 最后提到的是,在git commit -m ""之前,可以重复git add到暂存区。但是git commit会把你之前存放在暂存区的全部文件一次性全部提交到本地仓库。
+
+## 版本的回溯与前进
+
+提交一个文件,有时候我们会提交很多次,在提交历史中,这样就产生了不同的版本。每次提交,Git会把他们串成一条时间线。如何回溯到我们提交的上一个版本,用git reset --hard + 版本号即可。版本号可以用git log来查看,每一次的版本都会产生不一样的版本号。
+
+回溯之后,git log查看一下发现离我们最近的那个版本已经不见了。但是我还想要前进到最近的版本应该如何?只要git reset --hard + 版本号就行。退一步来讲,虽然我们可以通过git reset --hard + 版本号,靠记住版本号来可以在不同的版本之间来回穿梭。
+
+但是,有时候把版本号弄丢了怎么办?git reflog帮你记录了每一次的命令,这样就可以找到版本号了,这样你又可以通过git reset来版本穿梭了。
+
+## 撤销
+
+**场景1:**在工作区时,你修改了一个东西,你想撤销修改,git checkout -- file。廖雪峰老师指出撤销修改就回到和版本库一模一样的状态,即用版本库里的版本替换工作区的版本。
+
+**场景2:**你修改了一个内容,并且已经git add到暂存区了。想撤销怎么办?回溯版本,git reset --hard + 版本号,再git checkout -- file,替换工作区的版本。
+
+**场景3:**你修改了一个内容,并且已经git commit到了master。跟场景2一样,版本回溯,再进行撤销。
+
+## 删除
+
+如果你git add一个文件到暂存区,然后在工作区又把文件删除了,Git会知道你删除了文件。如果你要把版本库里的文件删除,git rm 并且git commit -m "xxx".
+
+如果你误删了工作区的文件,怎么办?使用撤销命令,git checkout --就可以。这再次证明了撤销命令其实就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
+
+## 分支
+
+分支,就像平行宇宙,廖雪峰老师如是说。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
+
+### 创建与合并分支
+
+![img](data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)
+
+在没有其他分支插进来时,只有一个master主分支。每次你git push -u origin master 提交就是增加一条时间轴,master也会跟着移动。
+
+创建一个other的分支,通过other提交,虽然时间轴向前走了,但是主分支master还在原来的位置。
+
+理论分析完,看一下命令怎么写。
+
+**创建分支other,切换到other分支。**
+
+```
+git branch other
+git checkout other
+```
+
+**查看当前所有分支**
+
+```
+git branch
+```
+
+
+
+```
+* other
+  master
+```
+
+当前的分支会有一个*
+
+**用other提交**
+
+```
+git add ./xxx/
+git commit -m "xxx"
+```
+
+**other分支完成,切换回master**
+
+```
+git checkout master
+```
+
+此时,master分支上并没有other的文件,因为分支还没有合并。
+
+**合并分支**
+
+```
+git merge other
+```
+
+合并完成之后,就可以在master分支上查看到文件了。
+
+**删除other分支**
+
+```
+git branch -d other
+```
+
+我由此想到,在以后工作中,应该是一个开放小组共同开发一个项目,组长会创建很多分支,每一个分支可以交给一个人去开发某一个功能,一个小组共同开发而且不会相互干扰。谁的功能完成了,可以由组长合并一下完成了的分支。哦,完美!
+
+## 解决合并分支问题
+
+
+
+![图片](https://mmbiz.qpic.cn/mmbiz/eQPyBffYbufFIDkCuX4BXqUgSibdycoPPEfd4SmMEBDPQzEjXN5rSCuxY0X4b1wmPCckSmnlSfAYOKFA9kWleWQ/640?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
+
+假如有这样一种情况,分支other已经commit了,但是此时指针指回master时,并且master没有合并,而是git add / commit 提交了。这样,就产生了冲突,主分支master文件内容与other分支的内容不一样。合并不起来!所以,
+
+ 
+
+- 修改文件的内容,让其保持一致。
+
+- git add git commit 提交。
+
+- 分支合并了。
+
+  ![img](data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)
+
+- git log --graph 查看分支合并图
+
+- git branch -d other 删除分支,任务结束。
+
+## 分支管理策略
+
+git merge --no-ff other 禁用Fast forward模式,因为使用Fast forward模式,删除分支后,分支历史信息会丢失。Git的实现原理,点这里:[深入理解Git的实现原理](http://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247486905&idx=2&sn=50d4e5789262d7440c49684e1a652c7d&chksm=ebd63295dca1bb83f50f1b5fe2947fbcf1564decb95f4d3e4a04104f2c406f3f6fb23947be56&scene=21#wechat_redirect)
+
+### BUG分支
+
+> 廖雪峰老师提到,工作中每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。但如果你手上有分支在工作中,你的上级要你改另外的分支的BUG。
+>
+> 
+>
+> 你要把现在正在工作的分支保存下来,git stash,把当前工作现场“存储”起来,等以后恢复后继续工作。当你解决BUG后,git checkout other回到自己的分支。用git stash list查看你刚刚“存放”起来的工作去哪里了。
+
+此时你要恢复工作:
+
+- git stash apply恢复却不删除stash内容,git stash drop删除stash内容。
+- git stash pop恢复的同时把stash内容也删了.
+- 此时,用git stash list查看,看不到任何stash 内容。
+
+**总结:修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场**
+
+### 删除分支
+
+- git branch -d + 分支有可能会删除失败,因为Git会保护没有被合并的分支。
+- git branch -D + 分支 强行删除,丢弃没被合并的分支。
+
+### 多人协作
+
+- git remote 查看远程库的信息,会显示origin,远程仓库默认名称为origin
+- git remote -v显示更详细的信息
+- git push -u origin master推送master分支到origin远程仓库。
+- git push -u origin other 推送other到origin远程仓库。
+
+### 抓取分支
+
+产生上图的冲突时,
+
+- git pull 把最新的提交从远程仓库中抓取下来,在本地合并,解决冲突。在进行git pull
+- 如果git pull 也失败了,还要指定分支之间的链接,这一步Git会提醒你怎么做。然后再git pull。
+
+廖雪峰老师的总结:多人协作的工作模式通常是这样:
+
+- 首先,可以试图用git push origin 
+
+  推送自己的修改;
+
+- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
+
+- 如果合并有冲突,则解决冲突,并在本地提交;
+
+- 没有冲突或者解决掉冲突后,再用git push origin 
+
+  推送就能成功!
+
+- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
+
+### Rebase
+
+git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观.缺点是本地的分叉提交已经被修改过了。
+
+最后在进行git push -u origin master
+
+rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
+
+## 标签管理
+
+比如一个APP要上线,通常在版本库中打一个标签(tag),这样,就确定了打标签的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
+
+Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。
+
+tag其实就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。比如tag v2.1就是把历史上的一个版本的东西叫做v2.1
+
+### 创建标签
+
+步骤:
+
+- git branch查看当前分支,git checkout master切换到master分支。
+- git tag <name> 打标签,默认为HEAD。比如git tag v1.0
+- 默认标签是打在最新提交的commit上的。如果想要打标签在以前的commit上,要git log找到历史提交的commit id.
+- 如果一个commt id是du2n2d9,执行git tag v1.0 du2n2d9就把这个版本打上了v1.0的标签了。
+- git tag 查看所有标签,可以知道历史版本的tag
+- 标签不是按时间顺序列出,而是按字母排序的。
+- git show <tagname> 查看标签信息。
+- git tag -a <标签名> -m "<说明>",创建带说明的标签。-a指定标签名,-m指定说明文字。用show可以查看说明。
+
+### 操作标签
+
+- git tag -d v1.0 删除标签。因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
+- git push origin <tagname> 推送某个标签到远程
+- git push origin --tags 一次性推送全部尚未推送到远程的本地标签
+- 如果标签推送到远程。git tag -d v1.0 先删除本地标签v1.0。git push origin :refs/tags/v1.0删除远程标签v1.0
+
+### 自定义Git
+
+- git config --global color.ui true让Git显示颜色,会让命令输出看起来更醒目
+- 忽略特殊文件 创建一个.gitignore文件,把需要忽略的文件名填进去。Git就会自动忽略这些文件。我也在学习中遇到过这样的问题,比如node_modules文件就可以忽略。
+
+> 忽略文件原则:忽略操作系统自动生成的文件,比如缩略图等;忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
+
+- 强制提交已忽略的的文件。git add -f <file>
+- git check-ignore -v <file>检查为什么Git会忽略该文件。
+- 给Git命令配别名,这个有点骚,就是你以后想输入git rebase时,你给它一个“外号”,就叫它git nb。以后你可以通过git nb来代替git rebase。
+
+## 常用Git命令总结
+
+- git config --global user.name "你的名字" 让你全部的Git仓库绑定你的名字
+- git config --global user.email "你的邮箱" 让你全部的Git仓库绑定你的邮箱
+- git init 初始化你的仓库
+- git add . 把工作区的文件全部提交到暂存区
+- git add ./<file>/ 把工作区的<file>文件提交到暂存区
+- git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡
+- git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来
+- git push -u origin master 把仓库区的主分支master提交到远程仓库里
+- git push -u origin <其他分支> 把其他分支提交到远程仓库
+- git status查看当前仓库的状态
+- git diff 查看文件修改的具体内容
+- git log 显示从最近到最远的提交历史  git log --pretty=oneline(更简洁的方式显示)
+- git clone + 仓库地址下载克隆文件
+- git reset --hard + 版本号 回溯版本,版本号在commit的时候与master跟随在一起
+- git reflog 显示命令历史
+- git checkout -- <file> 撤销命令,用版本库里的文件替换掉工作区的文件。我觉得就像是Git世界的ctrl + z
+- git rm 删除版本库的文件
+- git branch 查看当前所有分支
+- git branch <分支名字> 创建分支
+- git checkout <分支名字> 切换到分支
+- git merge <分支名字> 合并分支
+- git branch -d <分支名字> 删除分支,有可能会删除失败,因为Git会保护没有被合并的分支
+- git branch -D + <分支名字> 强行删除,丢弃没被合并的分支
+- git log --graph 查看分支合并图
+- git merge --no-ff <分支名字> 合并分支的时候禁用Fast forward模式,因为这个模式会丢失分支历史信息
+- git stash 当有其他任务插进来时,把当前工作现场“存储”起来,以后恢复后继续工作
+- git stash list 查看你刚刚“存放”起来的工作去哪里了
+- git stash apply 恢复却不删除stash内容
+- git stash drop 删除stash内容
+- git stash pop 恢复的同时把stash内容也删了
+- git remote 查看远程库的信息,会显示origin,远程仓库默认名称为origin
+- git remote -v 显示更详细的信息
+- git pull 把最新的提交从远程仓库中抓取下来,在本地合并,和git push相反
+- git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观
+- git tag 查看所有标签,可以知道历史版本的tag
+- git tag <name> 打标签,默认为HEAD。比如git tag v1.0
+- git tag <tagName> <版本号> 把版本号打上标签,版本号就是commit时,跟在旁边的一串字母数字
+- git show <tagName> 查看标签信息
+- git tag -a <tagName> -m "<说明>" 创建带说明的标签。-a指定标签名,-m指定说明文字
+- git tag -d <tagName> 删除标签
+- git push origin <tagname> 推送某个标签到远程
+- git push origin --tags 一次性推送全部尚未推送到远程的本地标签
+- git push origin :refs/tags/<tagname> 删除远程标签<tagname>
+- git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目
+- git add -f <file> 强制提交已忽略的的文件
+- git check-ignore -v <file> 检查为什么Git会忽略该文件

BIN
孙浩博/linux/linux备份/assets/image-20220604214134186.png


BIN
孙浩博/linux/linux备份/assets/image-20220604214638715.png


BIN
孙浩博/linux/linux备份/assets/image-20220604214754189.png


BIN
孙浩博/linux/linux备份/assets/image-20220604220115961.png


BIN
孙浩博/linux/linux备份/assets/image-20220604220217068.png


BIN
孙浩博/linux/linux备份/assets/image-20220604223018915.png


BIN
孙浩博/linux/linux备份/assets/image-20220604223141370.png


BIN
孙浩博/linux/linux备份/assets/image-20220605192912893.png


BIN
孙浩博/linux/linux备份/assets/image-20230211134903163.png


BIN
孙浩博/linux/linux备份/assets/image-20230211134956988.png


BIN
孙浩博/linux/linux备份/assets/image-20230211163017052.png


BIN
孙浩博/linux/linux备份/assets/image-20230211163054234.png


BIN
孙浩博/linux/linux备份/assets/image-20230211163106960.png


BIN
孙浩博/linux/linux备份/assets/image-20230211163233369.png


BIN
孙浩博/linux/linux备份/assets/watermar.png


BIN
孙浩博/linux/linux备份/assets/webp.webp


+ 107 - 0
孙浩博/linux/linux备份/mondorescue备份.md

@@ -0,0 +1,107 @@
+# 1、安装mondorescue
+
+## 1.1、centos7
+
+```shell
+cd /etc/yum.repos.d
+wget ftp://ftp.mondorescue.org/centos/7/x86_64/mondorescue.repo
+vim mondorescue.repo
+[mondorescue]
+name=centos 7 x86_64 - mondorescue Vanilla Packages
+baseurl=ftp://ftp.mondorescue.org//centos/7/x86_64
+enabled=1
+gpgcheck=0 # 1改为0
+gpgkey=ftp://ftp.mondorescue.org//centos/7/x86_64/mondorescue.pubkey
+
+yum install mondo -y
+```
+
+## 1.2、优麒麟
+
+```shell
+vim /etc/apt/sources.list
+#4.0.2桌面版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2-desktop main restricted universe multiverse
+
+#4.0.2-sp1桌面版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp1-desktop main restricted universe multiverse
+
+#4.0.2-sp2桌面版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp2-desktop main restricted universe multiverse
+
+#4.0.2服务器版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2-server main restricted universe multiverse
+
+#4.0.2-sp1服务器版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp1-server main restricted universe multiverse
+
+#4.0.2-sp2服务器版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp2-server main restricted universe multiverse
+
+#4.0.2-sp2 FT2000+服务器版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp2-server-ft2000 main restricted universe multiverse
+
+#4.0.2-sp3版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp3 main restricted universe multiverse
+
+#4.0.2-sp4版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 4.0.2sp4 main restricted universe multiverse
+
+#V10版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.0 main restricted universe multiverse
+
+#V10.1版本:
+deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
+
+
+wget ftp://ftp.mondorescue.org/ubuntu/16.04/mondorescue.sources.list
+sh -c "cat mondorescue.sources.list >> /etc/apt/sources.list" 
+# sh -c "cat mondorescue-test.sources.list >> /etc/apt/sources.list"
+apt-get update 
+apt-get install mondo 
+```
+
+# 2、生成iso文件
+
+```shell
+mondoarchive
+```
+
+* 选择hard disk
+
+![image-20220604220115961](assets/image-20220604220115961.png)
+
+* 其他的一律选择OK,等待备份完成
+
+![image-20220604220217068](assets/image-20220604220217068.png)
+
+* 进入`/var/cache/mondo`目录,导出iso文件
+
+# 3、恢复
+
+* 选择刚刚的iso文件。默认选择centos7系统
+
+![image-20220604223018915](assets/image-20220604223018915.png)
+
+* 输入nuke选择自动恢复
+
+![image-20220604223141370](assets/image-20220604223141370.png)
+
+* 恢复完成后,`重启电脑`,直接关机有可能不成功,虚拟机内存至少1G,硬盘至少20G。直接输入`exit`
+
+![image-20220605192912893](assets/image-20220605192912893.png)
+
+* 如果没有ip,直接重启即可
+
+# 3、如果安装了docker需要安装时候忽略这个目录
+
+```shell
+/var/lib/docker/devicemapper/devicemapper/ ## 或者这个
+/var/lib/docker/overlay2/
+```
+
+# 注意:!!!!!
+
+**恢复这个镜像的磁盘空间必须大于原始镜像的磁盘空间!!!!!!!**
+
+**例如:初始选择40G构建一个镜像,那么恢复镜像就必须选择大于等于40G的硬盘空间**

+ 111 - 0
孙浩博/linux/linux备份/qemu.md

@@ -0,0 +1,111 @@
+# 1、安装KVM
+
+## 1.1、虚拟机配置
+
+1. 保证开启虚拟化
+
+![image-20230211134903163](assets/image-20230211134903163.png)
+
+2. 关闭windows功能
+
+![](assets/watermar.png)
+
+3. 关闭内核隔离
+
+![image-20230211134956988](assets/image-20230211134956988.png)
+
+## 1.2、物理机配置
+
+**保证开启虚拟化**
+
+![image-20230211134903163](assets/image-20230211134903163.png)
+
+
+
+## 1.3、安装
+
+1. 检查CPU参数是否支持虚拟化
+
+```shell
+grep -Ei 'vmx|svm' /proc/cpuinfo
+```
+
+如果结果有过滤出vmx或者svm的关键字代表支持虚拟化,vmx是Intel的CPU,svm是AMD的CPU,如图所示
+
+![img](assets/webp.webp)
+
+2. 下载安装KVM软件
+
+```shell
+mkdir /kvm
+yum install -y epel-release
+yum -y install kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
+cp ifcfg-ens33 ifcfg-br0  
+cp ifcfg-ens33 ifcfg-ens33.bak
+```
+
+# 2、qemu制作镜像
+
+```shell
+mkdir /mnt/test
+cd /mnt/test
+qemu-img convert -f raw -O qcow2 /dev/sda /mnt/test/test.qcow2
+# qcow2镜像在导入前,如果需要进行兼容性转换,请运行以下命令:
+qemu-img amend -f qcow2 -o compat=0.10 test.qcow2
+qemu-img info test.qcow2
+```
+
+# 3、qemu转换镜像
+
+```shell
+## qemu-img convert -f 镜像之前的格式 镜像名称 -O 转换格式 转换之后的名称.vmdk
+qemu-img convert -f qcow2 test.qcow2 -O vmdk test.vmdk
+qemu-img convert  -f vmdk centos.vmdk -O raw centos.raw
+
+```
+
+1. -f 代表源镜像文件和格式
+
+2. -O【大写】代表目标镜像的格式
+
+3. -o 【小写】转换为qcow2格式时需要的必要参数项,参数:compat=0.10表明目标镜像(qcow2)版本为兼容版本。
+
+# 4、在vmware里运行qcow2镜像
+
+首先使用`qemu-img`工具,把qcow2的镜像转化成vmdk格式的:
+
+```shell
+qemu-img convert -f qcow2 test.qcow2 -O vmdk test.vmdk
+```
+
+使用VMware建立一个空的虚拟机,系统因你的qcow2镜像系统进行选择,因为我是Centos7。我这里选择的是Centos 7 64位系统。
+
+创建好了之后,进入`Virtual Machines`目录下的你刚刚创建虚拟机的目录,把vmdk文件删除,用之间`qemu-img`转化后的文件,覆盖过去,启动Vmware就成功了。
+
+# 5、在物理机上运行qcow2镜像
+
+```shell
+virt-manager
+```
+
+1. ![image-20230211163017052](assets/image-20230211163017052.png)
+1. ![image-20230211163054234](assets/image-20230211163054234.png)
+1. ![image-20230211163106960](assets/image-20230211163106960.png)
+
+# 附录--一些问题
+
+## 1、无法正常还原快照
+
+需要将vmware更新到16.2.2以上的版本,最好使用最新的17pro版本
+
+## 2、qcow2镜像扩容
+
+1. 新增磁盘
+
+![image-20230211163233369](assets/image-20230211163233369.png)
+
+2. 手动扩容
+
+[KVM虚拟机下qcow2镜像文件所在虚拟机磁盘扩容方法](https://cloud.tencent.com/developer/article/1884742)
+
+[(20条消息) centos7扩容根目录(/dev/mapper/centos-root)_杨咩咩yang的博客-CSDN博客_centos7 根目录扩容](https://blog.csdn.net/yang1393214887/article/details/120346704)

+ 104 - 0
孙浩博/linux/linux备份/vagrant.md

@@ -0,0 +1,104 @@
+# 1、常用命令
+
+## 1.1、镜像
+
+```shell
+vagrant box add CentOS-7.box --name centos7
+
+vagrant box list
+
+vagrant box remove box名	
+```
+
+## 1.2、虚拟机
+
+```shell
+# 初始化虚拟机配置文件
+vagrant init boxname
+# 根据当前目录下的Vagrantfile 启动虚拟机
+vagrant up 
+# 根据当前目录下的Vagrantfile 启动虚拟机,并执行provision里面的指令
+# 因为里面的指令只有在第一次up 的时候会执行。
+vagrant up --provision
+# 根据当前目录下的Vagrantfile 进入虚拟机(交互模式)
+vagrant ssh
+# 根据当前目录下的Vagrantfile 暂停虚拟机
+vagrant suspend
+# 关机
+vagrant halt
+# 重新加载Vagrantfile,使之生效(相当于先 halt,再 up)
+vagrant reload
+# 根据当前目录下的Vagrantfile 重启虚拟机的时候执行Vagrantfile 里面的provision 的指令
+# 默认是vagrant up 的时候启动一次
+vagrant reload 一provision
+# 执行Vagrantfile 里面的provision 的指令
+vagrant provission
+# 查看虚拟机状态
+vagrant status 
+# 启动虚拟机
+vagrant up 
+# 删除虚拟机
+vagrant destroy 
+```
+
+## 1.3、启动
+
+```shell
+vagrant ssh
+sudo -i
+vi /etc/ssh/sshd_config
+PasswordAuthentication yes
+systemctl restart sshd
+echo root|passwd --stdin root
+```
+
+## 1.4、扩容
+
+```shell
+# pvcreate命令不存在解决方案
+yum -y install lvm2
+```
+
+
+
+[[(20条消息) centos7根目录扩容(根目录在sda3 vgdisplay为空)_杨咩咩yang的博客-CSDN博客_vgdisplay为空](https://blog.csdn.net/yang1393214887/article/details/120345884)](https://blog.csdn.net/umufeng/article/details/120940916?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-120940916-blog-105744142.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-120940916-blog-105744142.pc_relevant_antiscanv3&utm_relevant_index=6)
+
+[(20条消息) centos7扩容根目录(/dev/mapper/centos-root)_杨咩咩yang的博客-CSDN博客_centos7 根目录扩容](https://blog.csdn.net/yang1393214887/article/details/120346704)
+
+## 1.5、打包
+
+```shell
+# 查看虚拟机名称
+vboxmanage list vms
+vagrant package –-base [虚拟机名称] –-output [打包后的box名称]
+```
+
+# 2、配置文件
+
+```shell
+Vagrant.configure("2") do |config|
+  # 设置虚拟机的主机名
+  config.vm.hostname="k8s-node#{i}"
+  # 设置主机与虚拟机的共享目录
+  config.vm.synced_folder "~/Documents/vagrant/share", "/home/vagrant/share"
+
+  config.vm.box = "centos7"
+  config.vm.network "private_network", ip: "192.168.56.10"
+  config.disksize.size = '60GB'
+  config.vm.provider "virtualbox" do |vb|
+    vb.memory = "2048"
+    vb.name= "lab1"
+    vb.cpus= 2
+  end
+end
+
+```
+
+
+
+# 附录
+
+| 软件       | 官网                                                         |
+| ---------- | ------------------------------------------------------------ |
+| vagrant    | [Vagrant by HashiCorp (vagrantup.com)](https://www.vagrantup.com/) |
+| VirtualBox | [Oracle VM VirtualBox](https://www.virtualbox.org/)          |

+ 19 - 0
孙浩博/linux/linux备份/vmwawre备份.md

@@ -0,0 +1,19 @@
+# 1、导出
+
+* 选择文件,导出为ovf即可
+* 注意事项,原有的镜像必须存在,即根镜像必须存在
+
+![image-20220604214134186](assets/image-20220604214134186.png)
+
+# 2、导入
+
+* 文件选择打开
+
+
+* 选择刚才的ovf文件即可
+
+![image-20220604214638715](assets/image-20220604214638715.png)
+* 注意事项:这三个文件必须在一个文件夹
+
+![image-20220604214754189](assets/image-20220604214754189.png)
+

+ 96 - 0
孙浩博/linux/linux常见命令/linux命令.md

@@ -0,0 +1,96 @@
+# 什么是source命令?
+
+运行shell时,会同时存在两种变量:
+
+- **1) 局部变量** 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
+- **2) 环境变量** 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
+
+在 Linux 中,source 命令用于执行指定的 shell 脚本文件,并将脚本文件中的所有命令都当作当前 shell 环境的命令来运行。简单地说,source 命令可以让你在当前的 shell 环境中执行一个脚本文件,并将其中定义的环境变量和函数等内容加载到当前的 shell 环境中。
+
+具体而言,source 命令可以实现如下功能:
+
+1. 在当前 shell 环境中载入指定脚本文件的内容,包括环境变量、函数等。
+2. 不创建新的子 shell 进程,而是在当前 shell 环境中执行脚本文件中的命令,从而实现在当前 shell 中设置环境变量或执行函数等操作。
+
+使用 source 命令的常见场景包括:
+
+1. 执行 shell 脚本文件,以实现设置环境变量、执行别名或函数等功能。
+2. 加载特定的 shell 配置文件,例如 ~/.bashrc 或 /etc/profile,以初始化 shell 环境。
+
+总之,source 命令可以帮助你在当前的 shell 环境中执行指定的脚本文件,并将其中定义的环境变量、函数等内容加载到当前的 shell 操作中,非常有用。
+
+## 简单例子
+
+```sh
+export var=999
+```
+
+如果`./my.sh`,运行后,执行`echo $var`是空的。
+
+如果`source ./my.sh`运行后,执行`echo $var`会显示999。
+
+因为调用`./my.sh`来执行`shell`是在一个子`shell`里运行的,所以执行后,里面定义的变量并没有反应到本`shell`里,但是 `source`不同,是在本`shell`中执行的,所以本shell能够看到其定义的变量。
+
+# export命令
+
+在 Linux 中,export 命令用于向当前 shell 环境中添加新的环境变量,使其能被当前 shell 环境及其子进程所访问和使用。简单地说,export 命令可以将一个变量设置为环境变量,从而可以在当前 shell 会话中以及当前 shell 的子进程中使用该变量。
+
+具体而言,export 命令可以实现如下功能:
+
+1. 将指定的变量设置为当前 shell 环境的环境变量。
+2. 将环境变量持久化保存到系统文件中,以便在下次启动时仍然可用。
+3. 环境变量的作用范围不仅限于当前 shell 环境,还包括当前 shell 环境的所有子进程,因此可以实现父子进程之间的环境变量共享。
+
+使用 export 命令可以将一个普通变量设置为环境变量,例如:
+
+```shell
+MY_VAR="hello"
+export MY_VAR
+```
+
+这样就将 MY_VAR 变量设置为当前 shell 环境的环境变量,以便在当前 shell 会话和当前 shell 的子进程中使用。
+
+同时,你也可以直接在一行中同时定义和导出一个环境变量,例如:
+
+```shell
+export MY_VAR="hello"
+```
+
+这样也可以将 MY_VAR 设置为环境变量,并将其导出到当前 shell 环境中。
+
+总之,export 命令可以将指定变量设置为环境变量,并将其在当前 shell 环境及其子进程中进行共享和使用,非常有用。
+
+# #!/bin/bash 作用
+
+`#!/bin/bash` 是一种脚本文件的头部声明,也称为 Shebang 或 Hashbang。在 Linux 和 Unix 系统中,这行命令用于指定解释器的路径,让操作系统知道该如何执行该脚本文件。
+
+具体而言,当一个脚本文件被执行时,操作系统会读取脚本文件的第一行,如果该行指定了解释器的路径,操作系统就会使用该解释器来执行该脚本文件;否则,操作系统会使用默认的解释器来执行该脚本文件(在大多数情况下是 /bin/sh)。
+
+因此,在编写 Shell 脚本时,将 `#!/bin/bash` 添加到脚本文件的开头可以确保脚本文件将使用 Bash 解释器来执行,而不是其他解释器。同时,还可以通过修改 Shebang 行的内容来指定使用其他解释器来执行脚本文件。
+
+需要注意的是,`#!/bin/bash` 命令在脚本文件的开头必须是第一行,并且不能有任何空格或其他字符紧随其后,否则该命令将不会被正确识别,从而导致脚本无法执行。
+
+总之,`#!/bin/bash` 命令的作用是指定解释器的路径,让操作系统知道该如何执行该脚本文件。在编写 Shell 脚本时,通常需要添加该命令到脚本文件的开头。
+
+# -e作用
+
+`-e` 是 Bash 脚本中的一个选项,用于指定在脚本执行过程中如果出现错误就立即退出并返回非零(非正常)状态码。
+
+具体而言,当在 Bash 脚本中添加了 `set -e` 命令后,表示开启了该选项(也可以使用 `set -o errexit`),此时如果在脚本的任何一行命令或管道执行失败,Bash 就会立即退出并返回非零状态码。这个特性可以确保脚本在执行过程中出现错误后可以立即停止执行,避免产生更多的错误。
+
+举个例子,假设有一个名为 `test.sh` 的 Shell 脚本文件,它的内容如下:
+
+```shell
+#!/bin/bash
+set -e
+
+echo "start"
+command_not_exist
+echo "end"
+```
+
+其中,`set -e` 指定了开启 `-e` 选项,`command_not_exist` 是一条不存在的命令。
+
+如果在执行该脚本时,命令 `command_not_exist` 执行失败,那么该脚本就会立即退出,并且不会输出 "end"。同时,脚本会返回一个非零状态码(通常是 1),表示脚本执行过程中发生错误。
+
+总之,`-e` 选项可以确保在 Bash 脚本执行过程中出现错误就立即退出并返回非零状态码,从而更好地确保脚本执行的可靠性。

+ 56 - 0
孙浩博/linux/linux常见命令/学习正则表达式.md

@@ -0,0 +1,56 @@
+## 基本使用
+
+## grep  "搜索的字符"  文件名
+
+	grep "good"  test
+
+* -c	统计出现次数
+* -i	 不区分大小写
+* -n	删除行号
+* -v	反向匹配
+>这些参数也可以一起使用
+
+
+## 正则表达式与grep
+
+### 基础的正则表达式
+
+* \*符号	 匹配0次或者多次
+* .符号	匹配除了换行符之外的所有符号
+* \{n,m\}    指定匹配次数
+* ^表示以……开头
+* $		结尾
+* ^$	空行
+
+### 正则表达式的范围匹配
+
+* []	  匹配范围
+* \b	 匹配边界---表示只匹配\b里面的字符
+* \B	 非单词边界匹配
+* \w	 字母数字和下划线
+* \W	非字母非数字非下划线
+
+### 通配符的使用
+
+>注意该字符都要加上转义字符\
+
+
+* ?	      匹配前一个字符0次或者1次
+* \+	       匹配前一个字符1次以上
+* () 	  	一般与 | 一起使用表示枚举
+
+
+
+## 高级使用
+
+### 可以使用$()或者``结合运行复杂命令
+
+```shell
+docker rmi --force `docker images | grep doss-api | awk '{print $3}'`    
+或者
+docker rmi --force $(docker images | grep doss-api | awk '{print $3}')
+表示先执行docker images | grep doss-api | awk '{print $3}'
+将它执行后的结果,执行docker  rmi   
+
+```
+

+ 13 - 0
孙浩博/linux/linux服务器运维/vmware exsi/0、配置要求.md

@@ -0,0 +1,13 @@
+| 机器名称    | CPU        | 内存     | 硬盘     | 版本                | 用途                            |
+| ----------- | ---------- | -------- | -------- | ------------------- | ------------------------------- |
+| vmware exsi | 无穷       | 无穷     | 无穷     | 7.5                 | 基本虚拟机                      |
+| vsphere     | 按照文档   | 按照文档 | 按照文档 | 7.5                 | 管理esxi                        |
+| server-102  | 大于8核心  | 大于16G  | 大于120G | windows server 2019 | AD主域名                        |
+| server-103  | 大于8核心  | 大于16G  | 大于120G | windows server 2019 | AD辅域名                        |
+| server-104  | 大于8核心  | 大于16G  | 大于800G | windows server 2019 | sql服务器                       |
+| server-105  | 大于8核心  | 大于16G  | 大于120G | windows server 2019 | citrix许可证服务器              |
+| server-110  | 按照要求   | 按照要求 | 按照要求 | win10任意版本       | WIN10模板  --  向外暴露的虚拟机 |
+| server-100  | 大于16核心 | 大于32G  | 大于512G | windows server 2019 | DDC + storefront                |
+| server-101  | 大于16核心 | 大于32G  | 大于512G | windows server 2019 | 安装vsphere虚拟机的虚拟机       |
+
+![image-20230425185752705](assets/image-20230425185752705.png)

+ 63 - 0
孙浩博/linux/linux服务器运维/vmware exsi/10、Win10模板收集.md

@@ -0,0 +1,63 @@
+# Win10模板安装
+
+Windows10 完装完成后需要对WIN10进行基本配置,这里不在阐述
+
+* IP地址配置
+* 加域
+* 激活
+* 安装常用的办公软件
+* 关闭防火墙
+* 安装上Citrix VDA代理
+
+# Citrix VDA安装,懒得打字了看图
+
+1.![image-20230425171355143](assets/image-20230425171355143.png)
+
+2. ![image-20230425171436218](../../../image-20230425171436218.png)
+
+3. ![image-20230425171451578](assets/image-20230425171451578.png)
+
+4. ![image-20230425171502231](assets/image-20230425171502231.png)
+
+5. ![image-20230425171512595](assets/image-20230425171512595.png)
+
+   ## DDC发布 -- 在DDC机器上面操作
+
+   1. 添加计算机目录
+
+   ![image-20230425171628413](assets/image-20230425171628413.png)
+
+   2. ​	![image-20230425171655715](assets/image-20230425171655715.png)
+   3. ![image-20230425171704988](assets/image-20230425171704988.png)
+   4. ![image-20230425171712722](assets/image-20230425171712722.png)
+   5. ![image-20230425171728609](assets/image-20230425171728609.png)
+   6. 添加交付组
+
+   ![image-20230425171807112](assets/image-20230425171807112.png)
+
+   7. 按照提示下一步即可
+
+   ![image-20230425171838092](assets/image-20230425171838092.png)
+
+   ![image-20230425171842975](assets/image-20230425171842975.png)
+
+   ![image-20230425171848822](assets/image-20230425171848822.png)
+
+   ![image-20230425171855634](assets/image-20230425171855634.png)
+
+   ![image-20230425171900585](assets/image-20230425171900585.png)
+
+   ![image-20230425171905139](assets/image-20230425171905139.png)
+
+   
+
+## 安装完毕之后即可使用
+
+![image-20230425171954841](assets/image-20230425171954841.png)
+
+![image-20230425172012720](assets/image-20230425172012720.png)
+
+
+
+
+

+ 49 - 0
孙浩博/linux/linux服务器运维/vmware exsi/11、交换机安装.md

@@ -0,0 +1,49 @@
+## 安装VPS交换机
+
+1. 在vsphere中选择部署OVF模板
+
+![image-20230525143835817](assets/image-20230525143835817.png)
+
+2. 选择三个模板文件
+
+![image-20230525143521677](assets/image-20230525143521677.png)
+
+3. 按照具体选择虚拟机位置
+
+![image-20230525143554957](assets/image-20230525143554957.png)
+
+4. 选择一个exsi机器,这里选择默认的即可
+
+![image-20230525143606116](assets/image-20230525143606116.png)
+
+5. 选择安装磁盘
+
+![image-20230525143655534](assets/image-20230525143655534.png)
+
+6. 网络选择自定义的server网络
+
+![image-20230525143806979](assets/image-20230525143806979.png)
+
+7. 打开虚拟机配置IP,网关,子网掩码
+
+![image-20230525161825139](assets/image-20230525161825139.png)
+
+8. 打开上述配置的IP,默认用户名密码是nsroot
+
+![image-20230525161811186](assets/image-20230525161811186.png)
+
+9. 安装配置完毕
+
+![image-20230526141545083](assets/image-20230526141545083.png)
+
+## 升级
+
+1. 登录citrix站点,下载最新的安装包
+2. FTP 客户端上传安装包到此设备
+3. 将升级所需要的安装包从计算机复制到设备上的 /var/nsinstall 目录。
+4. 使用安全的SSH客户端打开与设备的 SSH 连接。
+5. 在命令提示窗口中,键入: `shell`
+6. 进入安装目录,在命令提示符下键入:`cd /var/nsinstall`
+7. 需要解压安装软件,输入:tar –xvzf build_X_XX.tgz,其中 Build_x_xx.tgz 是要升级到的内部版本的名称。
+8. 开始安装,在命令提示符下键入:`./installns`
+9. 安装完成后,重新启动服务器

+ 63 - 0
孙浩博/linux/linux服务器运维/vmware exsi/1、vmware esxi安装.md

@@ -0,0 +1,63 @@
+> **宿主机要开启硬件辅助虚拟化,VMware vsphere必须依赖宿主机开启硬件辅助虚拟化功能,即必须在宿主机的BIOS设置中开启Inter vt-x。而且vmware esxi虚拟机也要开启虚拟化**
+
+# VMware ESXi 7.0安装过程详解
+
+
+## 1、如下图将镜像挂在CD/DVD驱动器口来安装
+
+![image-20230331094754144](assets/image-20230331094754144.png)
+
+## 2、然后进行ENTER继续下一步
+
+![image-20230331094806868](assets/image-20230331094806868.png)
+
+## 3、开始扫描引导中
+
+![image-20230331094823368](assets/image-20230331094823368.png)
+
+## 4、各种协议,选择F11接受
+
+![image-20230331094842228](assets/image-20230331094842228.png)
+
+## 5、选择默认US DEFAULT
+
+![image-20230331094858955](assets/image-20230331094858955.png)
+
+
+
+## 6、选择安装的磁盘位置
+
+![image-20230331094925022](assets/image-20230331094925022.png)
+
+
+
+## 7、输入密码,以后用于管理Esxi
+
+![image-20230331094945355](assets/image-20230331094945355.png)
+
+## 8、开始确认安装
+
+![image-20230331095002044](assets/image-20230331095002044.png)
+
+
+
+## 9、移除光驱用于安装
+
+![image-20230331095022649](assets/image-20230331095022649.png)
+
+## 10、安装完成
+
+![image-20230331095046522](assets/image-20230331095046522.png)
+
+## 11、配置静态IP
+
+![image-20230331095106749](assets/image-20230331095106749.png)
+
+## 12、添加现有本地磁盘
+
+![image-20230331095129212](assets/image-20230331095129212.png)
+
+## 13、开启bios设置  ----  一定要开启
+
+![image-20230406093831139](assets/image-20230406093831139.png)
+

+ 51 - 0
孙浩博/linux/linux服务器运维/vmware exsi/2、vmware esxi配置.md

@@ -0,0 +1,51 @@
+
+
+> [TOC]
+
+# 1、vmware esxi配置网络
+
+1. 新建端口组,注意VLAN ID设置为0与VM Network,名字最好为英文,这里新建一个server端口组
+
+![image-20230406100849836](assets/image-20230406100849836.png)
+
+2. 新建虚拟机绑定端口组server,并且配置ip和网关
+
+![image-20230330134608687](assets/image-20230330134608687.png)
+
+![image-20230406100922239](assets/image-20230406100922239.png)
+
+3. 关闭虚拟机防火墙(**必要且关键**)(**必要且关键**)(**必要且关键**)(**必要且关键**),测试网络
+
+![image-20230406101003380](assets/image-20230406101003380.png)
+
+
+
+# 2、虚拟机克隆
+
+1. 克隆虚拟机前先关闭虚拟机电源。
+
+![image-20230330125621659](assets/image-20230330125621659.png)
+
+2. 在左边导航栏 ,存储 项目里 点击 数据存储浏览器 ,“server2019”是我在服务器安装的第一个windows系统。
+
+![image-20230330125716689](assets/image-20230330125716689.png)
+
+3. 点击上方“创建目录”按钮,输入文件夹名,建议和想要新建的虚拟机名称一致,便于维护。
+
+![image-20230330125802442](assets/image-20230330125802442.png)
+
+4. 然后进入需要复制的虚拟机目录(就是刚刚我们关机了的那台机器server2019),将后将缀名为.nvram、.vmxf 、.vmx(虚拟机)和.vmdk(虚拟磁盘)的文件进行复制到刚刚创建好的目录,.log文件不需要复制。
+
+![image-20230330130555562](assets/image-20230330130555562.png)
+
+5. 粘贴完成之后,右键点击. vmx(虚拟机)文件,再点击“注册虚拟机”。
+
+![image-20230330130630432](assets/image-20230330130630432.png)
+
+6. 成功之后会多出一个server2019的虚拟机(它不会自己修改虚拟机名称的),重命名输入新的虚拟机名称server-101。
+
+![image-20230330131015858](assets/image-20230330131015858.png)
+
+7. 首次运行虚拟机时,ESXi会询问虚拟机文件的来源,这时候我们选择“我已复制”,这样ESXi就会自动修改虚拟机中的唯一标识,最重要的就是网卡的MAC地址,这是避免冲突的最好办法。
+
+![image-20230330131102430](assets/image-20230330131102430.png)

+ 113 - 0
孙浩博/linux/linux服务器运维/vmware exsi/3、vsphere的安装.md

@@ -0,0 +1,113 @@
+> **宿主机要开启硬件辅助虚拟化,VMware vsphere必须依赖宿主机开启硬件辅助虚拟化功能,即必须在宿主机的BIOS设置中开启Inter vt-x。而且vmware esxi虚拟机也要开启虚拟化**
+
+
+
+# 0、安装一个windows
+
+**在esxi中安装一个windows server2019版本的虚拟机**
+
+* 内存要大于等于32G
+* 硬盘大于等于120G
+
+安装过程不再赘述,安装完成之后挂载vsphere的iso文件
+
+![image-20230406101237995](assets/image-20230406101237995.png)
+
+# 1、安装第一步
+
+1. 打开安装文件
+
+![image-20230406101323094](assets/image-20230406101323094.png)
+
+2. 选择安装
+
+![image-20230406101411362](assets/image-20230406101411362.png)
+
+3. 下一步,输入esxi的域名,用户名和密码
+
+![image-20230406101503155](assets/image-20230406101503155.png)
+
+4. 设置名称   ----   名称最好不要有空格
+
+![image-20230406101546665](assets/image-20230406101546665.png)
+
+5. 按照实际需求选择
+
+![image-20230406101617906](assets/image-20230406101617906.png)
+
+6. 注意勾选
+
+![image-20230406101636874](assets/image-20230406101636874.png)
+
+7. 填写网络配置
+
+![image-20230406101727315](assets/image-20230406101727315.png)
+
+* 网络选择VM Network,不要选择和esxi主机同一个网络
+* FQDN域名最好按照我的填写
+* DNS服务器必须填写8.8.8.8
+
+8. 静静等待第一步安装完成
+
+![image-20230406101920635](assets/image-20230406101920635.png)
+
+# 2、第二步安装
+
+1. 此时打开浏览器中,在地址栏中输入https://10.234.234.90:5480 ,会显示系统配置界面,单击“设置”,提示输入root密码登录,输入即可。
+
+![image-20230406102055380](assets/image-20230406102055380-16807476558291.png)
+
+2. 设置网络
+
+![image-20230406102309810](assets/image-20230406102309810.png)
+
+3. 耐心等待一段时间后,先不要配置SSO域,使用xshell连接服务器,配置hosts,配置必须和下图一直,分别为FQNQ,主机名,localhost
+
+![image-20230406102441198](assets/image-20230406102441198.png)
+
+4. 输入SSO域名及密码。
+
+![image-20230406102530005](assets/image-20230406102530005-16807479305482.png)
+
+5. 等vCenter Server系统启动完成之后,配置完成。
+
+![image-20230406102552675](assets/image-20230406102552675.png)
+
+# 3、配置vsphere
+
+1. 进入主界面
+
+![image-20230406102638133](assets/image-20230406102638133.png)
+
+2. 分配许可证
+
+![image-20230406102703588](assets/image-20230406102703588.png)
+
+![image-20230406102753782](assets/image-20230406102753782.png)
+
+![image-20230406102838021](assets/image-20230406102838021.png)
+
+![image-20230406102851012](assets/image-20230406102851012-16807481316263.png)
+
+2. 配置vCenter Server,将ESXi主机加入到vCenter中,创建名为“Datacenter”的数据中心。
+
+![image-20230406103058002](assets/image-20230406103058002.png)
+
+3. 创建名为“cluster”的集群,将vSphere DRS功能开启。注意HA功能只有在存在多个esxi主机的时候才可以开启,这里关闭即可。
+
+![image-20230406110807099](assets/image-20230406110807099.png)
+
+4. 点击步骤2的“添加主机”,将ESXi主机添加到集群。
+
+![image-20230406103223763](assets/image-20230406103223763.png)
+
+5. 配置集群,点击步骤3的“配置”。
+
+![image-20230406103326115](assets/image-20230406103326115.png)
+
+6. 检查,确认信息无误后,点击“完成”。
+
+![image-20230406110914300](assets/image-20230406110914300.png)
+
+![image-20230406103420977](assets/image-20230406103420977.png)	
+

+ 137 - 0
孙浩博/linux/linux服务器运维/vmware exsi/4、ad域安装.md

@@ -0,0 +1,137 @@
+# 1、AD域的安装
+
+## 1.1、AD域服务器的安装
+
+准备好域控服务器,可用虚拟机,配置好IP,更改好计算机名,点击“服务器管理器”
+
+![image-20230331100303313](assets/image-20230331100303313.png)
+
+选择“添加角色和功能”
+
+![image-20230331100337248](assets/image-20230331100337248.png)
+
+接下来按照步骤安装即可
+
+![image-20230331100415625](assets/image-20230331100415625.png)
+
+![image-20230331100433250](assets/image-20230331100433250.png)
+
+![image-20230331100449642](assets/image-20230331100449642.png)
+
+勾选AD域服务器和DNS服务器,期间会弹出窗口,选择添加功能:
+
+![image-20230331100514593](assets/image-20230331100514593.png)
+
+添加SMP功能
+
+![image-20230331100630100](assets/image-20230331100630100.png)
+
+下一步
+
+![image-20230331100650810](assets/image-20230331100650810.png)
+
+![image-20230331100700190](assets/image-20230331100700190.png)
+
+勾选自动重启
+
+![image-20230331100722370](assets/image-20230331100722370.png)
+
+等待安装完毕
+
+![image-20230331100920895](assets/image-20230331100920895.png)
+
+## 1.2、ad域的配置
+
+![image-20230406134309371](assets/image-20230406134309371.png)
+
+1. ”符号,选择“将此服务器提升为域控制器”
+
+![image-20230406134348228](assets/image-20230406134348228.png)
+
+![image-20230406134439251](assets/image-20230406134439251.png)
+
+![image-20230406134516129](assets/image-20230406134516129.png)
+
+![image-20230406134622905](assets/image-20230406134622905.png)
+
+2. 点击“安装”,安装安成后系统将会自动重启
+
+![image-20230406134717018](assets/image-20230406134717018.png)
+
+## 1.3、AD域上创建OU
+
+接上一章节,重启启完成后,点击开始菜单,Windows管理工具:
+
+![image-20230406135346855](assets/image-20230406135346855.png)
+
+此时可以看到管理工具里多了几项域控的组件,打开“Active Directory用户和计算机”,选择主域,点击工具栏上的
+
+![image-20230406135459919](assets/image-20230406135459919.png)
+
+输入要创建的主OU
+
+![image-20230406135612403](assets/image-20230406135612403.png)
+
+此时我们选中刚创建的主OU,在主OU下再创建子OU,输入子OU名称
+
+![image-20230406135630540](assets/image-20230406135630540.png)
+
+## 1.4、AD域用户帐号的创建
+
+选择我们创建的子OU,在此OU下创建用户帐号,下图我们创建的CTX帐号将做为Citrix的管理员帐号
+
+![image-20230406135909888](assets/image-20230406135909888.png)
+
+![image-20230406135949875](assets/image-20230406135949875-16807607904622.png)
+
+由于我们需要将此用户做于管理员帐号,因此需要将此帐号加入到域管理员组里,按如下图所示操作:
+
+![image-20230406140200430](assets/image-20230406140200430.png)
+
+# 2、AD2
+
+AD域通常是做为辅助域,也称之为备用域。此域会与主域进行实实同步,在主域上创建的帐号,会被系统自动同步到辅助域里;在辅助域上创建的信息也同样会被同步到主域里,所以我们在新建用户帐号和做配置更改时,可随便在哪台上设置都行。这里我们选择server-103
+
+步骤和主域差不多,开始菜单,选择“服务器管理器”
+
+选择“添加角色和功能”
+
+![image-20230406140822935](assets/image-20230406140822935.png)
+
+![image-20230406141017209](assets/image-20230406141017209.png)
+
+## 2.1、配置主域
+
+上一步安装完成后,首先配置windows的hosts和DNS
+
+![image-20230406142716304](assets/image-20230406142716304.png)
+
+![image-20230406143839263](assets/image-20230406143839263.png)
+
+然后选择“将此服务器提升为域控制器”
+
+![image-20230406141932369](assets/image-20230406141932369.png)
+
+选择“将域控制器添加到现有域”,输入主域的域名,输入具有域管理员的一个域帐号:
+
+![image-20230406143950765](assets/image-20230406143950765.png)
+
+输入主域创建时配置的密码:
+
+![image-20230406144112390](assets/image-20230406144112390.png)
+
+点安装,等待一会即完成:
+
+![image-20230406144353181](assets/image-20230406144353181.png)
+
+如果有报错按照指示操作即可
+
+![image-20230406144443432](assets/image-20230406144443432.png)
+
+![image-20230406151716585](assets/image-20230406151716585-16807654372213.png)
+
+![image-20230406151739708](assets/image-20230406151739708.png)
+
+## 2.2、Server 2016/Windows 10使用域管理员账户操作提示权限不足的问题
+
+在受影响的工作站上使用域管理员账号登录,打开工作站的“本地安全策略”,找到“本地策略”——“安全选项”——“用户账户控制:用于内置管理员账户的管理员批准模式”,选择“已启用”,然后重启电脑。

+ 104 - 0
孙浩博/linux/linux服务器运维/vmware exsi/5、sql服务器的安装.md

@@ -0,0 +1,104 @@
+# SQL服务器安装准备
+
+1. 创建好SQL服务器后,配置好IP,将DNS指向域控服务器
+
+![image-20230407101125950](assets/image-20230407101125950.png)
+
+2. 计算机命名并加域
+
+![image-20230407101253507](assets/image-20230407101253507.png)
+
+3. 为此服务器挂一块500G的D盘,用户存储数据库:
+
+![image-20230407101727732](assets/image-20230407101727732.png)
+
+![image-20230407102001754](assets/image-20230407102001754.png)
+
+![image-20230407102511902](assets/image-20230407102511902.png)
+
+4. 创建一个Sqladmin的数据库专用域帐号,并且给提供Domain admin权限,**这里是在server-102上面操作**
+
+![image-20230407104003701](assets/image-20230407104003701.png)
+
+![image-20230407104122052](assets/image-20230407104122052.png)
+
+![image-20230407104429415](assets/image-20230407104429415.png)
+
+5. 登陆成功后点击“服务器管理器”-“添加角色和功能”,选择“故障转移群集”,在弹出的向导中点击添加功能,然后下一步
+
+![image-20230407104757832](assets/image-20230407104757832.png)
+
+6. 选择自动重启
+
+![image-20230407104836517](assets/image-20230407104836517.png)
+
+# SQL数据库安装
+
+1. 接下来开始安装SQL数据库,挂载对应的CD,选择“Setup”开始安装
+
+![image-20230407111445614](assets/image-20230407111445614.png)
+
+2. 输入安装密钥,下一步
+
+![image-20230407111611516](assets/image-20230407111611516.png)
+
+![image-20230407111731092](assets/image-20230407111731092.png)
+
+3. 先打开控制面板里的防火墙设置,关闭防火墙,然后下一步
+
+![image-20230407111942695](assets/image-20230407111942695.png)
+
+4. 选择功能
+
+![image-20230407112106206](assets/image-20230407112106206.png)
+
+5. 直接下一步
+
+![image-20230407112202109](assets/image-20230407112202109.png)
+
+6. 选择混合格式,输入两次相同的SA密码,点击添加当前用户,然后再点击数据目录,**这里也需要添加ctx作为管理员**
+
+![image-20230407112341875](assets/image-20230407112341875.png)
+
+7. 只需要将数据根目录的C改为D即可,下方会自动跟随变更,下一步
+
+![image-20230407112406616](assets/image-20230407112406616.png)
+
+8. 点击“安装”
+
+![image-20230407112522077](assets/image-20230407112522077.png)
+
+# 安装Studio
+
+1. 在某台SQL服务器安装Studio管理工具,这里选择SQL1
+
+![image-20230411100803091](assets/image-20230411100803091.png)
+
+2. 安装完成后点击重启,在开始菜单找到:Microsoft SQL Server Manager管理工具
+
+![image-20230411111059727](assets/image-20230411111059727.png)
+
+3. 使用登陆的SQLADMIN域帐号认证登陆,SQL1数据库
+
+![image-20230411111233785](assets/image-20230411111233785.png)
+
+4. 选择“数字引擎”
+
+![image-20230411111643500](assets/image-20230411111643500.png)
+
+5. 在服务名称输入:SQL的计算机名,同样也是使用SQLADMIN域帐号登陆
+
+![image-20230411111753383](assets/image-20230411111753383-16811830742011.png)
+
+6. 授权ctx帐号的访问权限
+
+![image-20230411111839093](assets/image-20230411111839093.png)
+
+7. 输入要授权的域帐号
+
+![image-20230411111955926](assets/image-20230411111955926.png)
+
+8. 赋予“sysadmin”的权限
+
+![image-20230411112057520](assets/image-20230411112057520.png)
+

+ 48 - 0
孙浩博/linux/linux服务器运维/vmware exsi/6、许可证服务器安装.md

@@ -0,0 +1,48 @@
+# 许可证服务器安装
+
+1. 重新生成SID
+
+![image-20230411164440614](assets/image-20230411164440614.png)
+
+2. 此计算机加入AD域中
+
+![image-20230413103550732](assets/image-20230413103550732.png)
+
+2. 设置防火墙和IP
+3. 此计算机使用CTX账户登录
+
+# 安装
+
+1. 打开安装文件
+
+![image-20230411170730592](assets/image-20230411170730592.png)
+
+2. 下一步
+
+![image-20230411170847167](assets/image-20230411170847167.png)
+
+3. 等待安装完毕
+
+![image-20230411171137754](assets/image-20230411171137754.png)
+
+4. 打开应用程序
+
+![image-20230411171708852](assets/image-20230411171708852.png)
+
+5. 输入ctx用户名密码
+
+![image-20230413105925959](assets/image-20230413105925959.png)
+
+6. 上传密钥文件
+
+![image-20230413093556459](assets/image-20230413093556459.png)
+
+7. 选择上传
+
+![image-20230413105951972](assets/image-20230413105951972.png)
+
+8. 查看证书
+
+![image-20230413110007937](assets/image-20230413110007937.png)
+
+![image-20230413110934856](assets/image-20230413110934856.png)

+ 89 - 0
孙浩博/linux/linux服务器运维/vmware exsi/7、DDC安装.md

@@ -0,0 +1,89 @@
+# DDC
+
+数据库装备好后就可以安装DDC,DDC安装相对简单,几乎是一路下一步。
+
+**分别使用Citrix专用管理员帐号**(以后默认也都是使用这个帐号做为维护管理员)登陆DDC服务器(这里选择Test),挂载上Virtual Desktops 7.15的安装镜像,双击Autoselect.exe开始安装
+
+
+
+# DDC安装
+
+1. 控制台安装可以都选择XenDesktop那项的启动
+
+![image-20230411152650629](assets/image-20230411152650629.png)
+
+2. 选择开始里的『Delivery Controller』
+
+![image-20230411152734881](assets/image-20230411152734881.png)
+
+3. 点击我已阅读,下一步
+
+![image-20230411152805063](assets/image-20230411152805063.png)
+
+4. 如果许可服务器和StoreFront不安装在这台的话,就把勾给去掉,点击下一步
+
+![image-20230411152902538](assets/image-20230411152902538.png)
+
+5. 数据库我们已装过,也可以不安装,勾去掉后下一步。
+
+![image-20230411152948192](assets/image-20230411152948192.png)
+
+6. 提示会自动打开这台服务器防火墙上的80和443端口,下一步
+
+![image-20230411153124480](assets/image-20230411153124480.png)
+
+7. 点安装
+
+![image-20230411153205383](assets/image-20230411153205383.png)
+
+8. 安装过程中可能会重启1-3次,每次重启完后都使用Citrix管理员专用账号登陆安装
+
+![image-20230411155232048](assets/image-20230411155232048.png)
+
+9. 完成后自动打开Studio,即可开始配置DDC了,见下一章节
+
+![image-20230411155320415](assets/image-20230411155320415.png)
+
+10. 重启电脑
+
+# DDC1初始化
+
+1. 在开始菜单里打开Citrix Studio
+
+![image-20230411161053355](assets/image-20230411161053355.png)
+
+2. 首台DDC需要配置一些基本信息
+
+![image-20230411161218164](assets/image-20230411161218164.png)
+
+![image-20230411162126034](assets/image-20230411162126034.png)
+
+3. 数据库栏填写SQL的侦听地址,如果是跨网段的环境建议填完事,例如NCSESQL1
+
+![image-20230411162952348](assets/image-20230411162952348.png)
+
+4. 指定许可服务地址,也可以写IP地址,点连接,如果许可服务器没有许可,默认会有30天的免费试用期
+
+![image-20230413110659366](assets/image-20230413110659366.png)
+
+5. 服务器资源池连接,我们这里暂时不配置,选择无计算机管理,后面再进行配置
+
+![image-20230413101206891](assets/image-20230413101206891.png)
+
+6. 下一步
+
+![image-20230413110959355](assets/image-20230413110959355.png)
+
+7. 点完成
+
+![image-20230413111031896](assets/image-20230413111031896.png)
+
+8. 配置完看到如下界面代表配置成功,如果没成功会报错,通常就是数据库或网络通讯方面的问题会报错。
+
+![image-20230413111446173](assets/image-20230413111446173.png)
+
+# storefront安装
+
+![image-20230425170846192](assets/image-20230425170846192.png)
+
+此安装较为简单,一直下一步就好,这里不再赘述

+ 158 - 0
孙浩博/linux/linux服务器运维/vmware exsi/8、PVS安装.md

@@ -0,0 +1,158 @@
+# PVS
+
+
+
+DDC安装完毕好后就可以安装PSV,这里新建两个服务器用来安装。分别为server-108, server-109
+
+**分别使用Citrix专用管理员帐号**(以后默认也都是使用这个帐号做为维护管理员)登陆两台PSV服务器,做基础处理,以后不在赘述
+
+* 加入AD域
+* 使用AD域账号CTX登录
+* 关闭防火墙
+* 如果是克隆机器请重新生成SIN
+* 配置静态IP
+
+# PVS1的安装
+
+1. 挂载上PVS安装镜像『Citrix_Provisioning_7_15.iso』后双击开始配置,先点控制台安装
+
+![image-20230414111119227](assets/image-20230414111119227.png)
+
+2. 一直下一步
+
+![image-20230414134840990](assets/image-20230414134840990.png)
+
+3. 上面的控制台安装完后点击服务器安装,安装
+
+![image-20230414134945338](assets/image-20230414134945338.png)
+
+4. 一直下一步安装完成
+
+![image-20230414135055518](assets/image-20230414135055518.png)
+
+# PVS1的初始化配置
+
+1. 完成以上的PVS组件安装后,系统会自动弹出『Provisioning Services配置向导』,点下一步
+
+![image-20230414135151963](assets/image-20230414135151963.png)
+
+2. DHCP不在这台上,选择『在其它……』,下一步
+
+![image-20230414135224399](assets/image-20230414135224399.png)
+
+3. 选择『在其它……』,下一步
+
+![image-20230414135253393](assets/image-20230414135253393.png)
+
+4. 创建一个场
+
+![image-20230414135400712](assets/image-20230414135400712.png)
+
+5. 输入数据库的侦听地址,其它 可以不用填写,下一步
+
+![image-20230414135433704](assets/image-20230414135433704.png)
+
+6. 默认数据库名称即可,下一步
+
+![image-20230414135532531](assets/image-20230414135532531.png)
+
+7. 在C盘新建一个『vDisk』(名字可以自己随意写也行),下一步
+
+![image-20230414135628948](assets/image-20230414135628948.png)
+
+8. 填写许可服务器地址
+
+![image-20230414135656922](assets/image-20230414135656922.png)
+
+9. 默认网络服务帐户,下一步
+
+![image-20230414135723308](assets/image-20230414135723308.png)
+
+10. 默认,下一步
+
+![image-20230414135739537](assets/image-20230414135739537.png)
+
+![image-20230414135803672](assets/image-20230414135803672.png)
+
+11. 勾一下,下一步
+
+![image-20230414135828009](assets/image-20230414135828009.png)
+
+12. 下一步
+
+![image-20230414135852489](assets/image-20230414135852489.png)
+
+![image-20230414135900338](assets/image-20230414135900338.png)
+
+13. 完成
+
+![image-20230414135936465](assets/image-20230414135936465.png)
+
+![image-20230414140153523](assets/image-20230414140153523.png)
+
+# PVS2的安装及冗余配置
+
+PVS2的安装与PVS1一般无二,请参考前面『PVS1安装』的章节,我们开始PVS2的冗余配置,也就是将PVS2加入到PVS1创建的场里
+
+1. 安装好也是会自动打开配置向导,如果没打开,可以在开始菜单里找到
+
+![image-20230414142700058](assets/image-20230414142700058.png)
+
+2. 选择『在其它……』,下一步
+
+![image-20230414142718424](assets/image-20230414142718424.png)
+
+3. 『在其它……』,下一步
+
+![image-20230414142741108](assets/image-20230414142741108.png)
+
+4. 加入现有场
+
+![image-20230414142802478](assets/image-20230414142802478.png)
+
+5. 同样填写一样的侦听地址
+
+![image-20230414142925970](assets/image-20230414142925970.png)
+
+6. 没得选下一步
+
+![image-20230414142945626](assets/image-20230414142945626.png)
+
+7. 只有一个默认站点,下一步
+
+![image-20230414143013737](assets/image-20230414143013737.png)
+
+![image-20230414143020034](assets/image-20230414143020034.png)
+
+![image-20230414143034619](assets/image-20230414143034619.png)
+
+![image-20230414143054092](assets/image-20230414143054092.png)
+
+8. 勾上,下一步
+
+![image-20230414143127556](assets/image-20230414143127556.png)
+
+9. 填上PVS2的地址,确定,下一步
+
+![image-20230414143219552](assets/image-20230414143219552.png)
+
+10. 下一步直到完成
+
+![image-20230414143444536](assets/image-20230414143444536.png)
+
+11. 在开始菜单打开控制台
+
+![image-20230414143521225](assets/image-20230414143521225.png)
+
+12. 右键-连接场
+
+![image-20230414143541572](assets/image-20230414143541572.png)
+
+13. 输入本地地址或名称,使用现在登陆的Citrix专用管理员帐号
+
+![image-20230414143626755](assets/image-20230414143626755.png)
+
+14. 这时在服务器的文件夹里可以看到PVS2的状态是绿色的,代表服务运行正常
+
+![image-20230414143705336](assets/image-20230414143705336.png)
+

+ 18 - 0
孙浩博/linux/linux服务器运维/vmware exsi/9、BDM制作.md

@@ -0,0 +1,18 @@
+# BDM制作(适用于不配置DHCP66/67选择,使用光驱启动)
+
+>  **BDM适用于不配置DHCP66/67选择,使用光驱或者本地硬盘启动,但还是需要有DHCP分配地址**
+
+1. 在PVS1的开始菜单,打开BDM向导
+
+![image-20230414145238930](assets/image-20230414145238930.png)
+
+2. 填写PVS1和PVS2的地址
+
+![image-20230414145334420](assets/image-20230414145334420.png)
+
+3. 默认,下一步
+
+![image-20230414145358098](assets/image-20230414145358098.png)
+
+4. 填写相关网络信息后,选择Citrix ISO项,点刻录
+

BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/640.jpeg


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125621659.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125716689.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330125802442.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330130555562.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330130630432.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330131015858.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330131102430.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134153184.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134154704.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134324506.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134325511.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134423778.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134608687.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134820533.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134849973.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230330134957405.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094754144.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094806868.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094823368.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094842228.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094858955.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094925022.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331094945355.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095002044.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095022649.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095046522.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095106749.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331095129212.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100303313.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100337248.png


BIN
孙浩博/linux/linux服务器运维/vmware exsi/assets/image-20230331100415625.png


Vissa filer visades inte eftersom för många filer har ändrats