浏览代码

新增git操作说明和分支管理说明

xu_xin 2 年之前
父节点
当前提交
c00ece91e2
共有 20 个文件被更改,包括 353 次插入2 次删除
  1. 191 0
      Java应用诊断说明.md
  2. 8 2
      README.md
  3. 84 0
      git.md
  4. 二进制
      images/commitAndPush.gif
  5. 二进制
      images/createBranch.gif
  6. 二进制
      images/gitBranchManage.png
  7. 二进制
      images/gitCreateMerge.png
  8. 二进制
      images/gitCreateMergeDetail.png
  9. 二进制
      images/git_clone.png
  10. 二进制
      images/git分支管理-简易版.png
  11. 二进制
      images/idea_git_checkout.gif
  12. 二进制
      images/idea_git_commitPush.gif
  13. 二进制
      images/vsc_create.png
  14. 二进制
      images/vsc_create2.png
  15. 二进制
      images/vsc_create3.png
  16. 二进制
      images/vsc_git_confict.gif
  17. 二进制
      images/vsc_git_confict.png
  18. 二进制
      images/vsc_git_sync.png
  19. 39 0
      分支管理v1.md
  20. 31 0
      分支管理v2.md

+ 191 - 0
Java应用诊断说明.md

@@ -0,0 +1,191 @@
+# Java应用诊断说明
+
+Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 [官方文档](https://arthas.aliyun.com/doc/quick-start.html)
+
+## 准备工作
+
+查看服务器上是否已有`arthas-boot.jar`文件,如果不存在,通过以下命令将文件下载到当前目录
+
+```shell
+curl -O https://arthas.aliyun.com/arthas-boot.jar
+```
+
+> 如果应用运行在docker容器内,需要进入到docker中进行操作。
+
+### 进入docker
+
+1. 运行`docker ps`,查看容器
+  
+  ```
+  CONTAINER ID        IMAGE            COMMAND   CREATED             STATUS              PORTS   NAMES
+  0b3a8b5d66d0        nginx:latest     "/docker-entrypoint.…"   3 weeks ago         Up 17 minutes   nginx
+  0389efb8e1bd        java:8  "nohup java -jar jdg…"   3 weeks ago         Up 17 minutes   jdgk-taizhou
+  0dd0a4380685        redis   "docker-entrypoint.s…"   4 weeks ago         Up 4 weeks   0.0.0.0:6379->6379/tcp
+  ```
+
+2. 运行`docker exec -it 容器ID bash` 进入docker
+3. 运行`ls` 查看当前目录是否存在`arthas-boot.jar`文件,有的话,直接进入以下环节
+
+## 使用 Arthas 诊断工具
+
+1. 运行 `java -jar arthas-boot.jar`
+
+  ```
+  [INFO] arthas-boot version: 3.5.5
+  [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
+  * [1]: 1 jdgk.jar
+  ```
+
+2. 选择要诊断的java进行,输入 `1`(进程号) 回车,进入成功后如下显示
+
+  ```
+  [INFO] arthas home: /root/.arthas/lib/3.5.6/arthas
+  [INFO] Try to attach process 1
+  [INFO] Attach process 1 success.
+  [INFO] arthas-client connect 127.0.0.1 3658
+    ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
+  /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
+  |  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
+  |  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
+  `--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          
+
+  wiki       https://arthas.aliyun.com/doc                                        
+  tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
+  version    3.5.6                                                                
+  main_class                                                                      
+  pid        1                                                                    
+  time       2022-03-04 15:35:28  
+  ```
+
+3. 运行相关命令查看进行信息
+4. 退出arthas
+  
+  如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
+
+  如果想完全退出arthas,可以执行stop命令。
+
+### 生成火焰图
+
+火焰图可以用来观察当前项目的应用热点。观察哪些方法耗时过长,便于后期项目优化。
+
+```shell
+# 开始采集
+profiler start
+
+# 结束采集
+profiler stop
+
+#火焰图 执行300秒自动结束  -e 参数用于docker容器内部运行
+profiler start -d 300  -e itimer
+```
+
+通过浏览器查看arthas-output下面的profiler结果
+
+默认情况下,arthas使用3658端口,则可以打开: http://localhost:3658/arthas-output/ 查看到arthas-output目录下面的profiler结果
+
+docker环境下因为端口没有映射到外部,无法通过浏览器查看,需要通过命令将文件复制到主机,再下载到本地进行查看
+
+```shell
+docker cp 容器ID:文件路径 主机文件路径
+```
+
+### 输入 `dashboard` 查看当前程序的线程和内存占用情况
+
+  ```
+  ID NAME                GROUP     PRIORI STATE  %CPU  DELTA_ TIME   INTER DAEMON 
+  10 http-nio-8080-exec- main      5      TIMED_ 11.02 0.550  0:13.3 false true   
+  79 http-nio-8080-exec- main      5      TIMED_ 9.73  0.486  0:8.37 false true   
+  80 http-nio-8080-exec- main      5      RUNNAB 8.3   0.414  0:7.19 false true   
+  83 http-nio-8080-exec- main      5      TIMED_ 7.71  0.385  0:6.14 false true   
+  10 http-nio-8080-exec- main      5      RUNNAB 6.34  0.316  0:4.09 false true   
+  79 http-nio-8080-exec- main      5      RUNNAB 3.41  0.170  0:7.93 false true   
+  -1 GC task thread#1 (P -         -1     -      1.05  0.052  1:58.8 false true   
+  -1 GC task thread#3 (P -         -1     -      1.03  0.051  1:59.4 false true   
+  -1 GC task thread#0 (P -         -1     -      1.03  0.051  1:59.2 false true   
+  -1 GC task thread#2 (P -         -1     -      1.03  0.051  1:59.0 false true   
+  Memory           used  total max  usage GC                                      
+  heap             2007M 3778M                                984                 
+  ps_eden_space    517M  1056M            gc.ps_scavenge.time 104570              
+                  66M   118M  118M       (ms)                                    
+  ps_old_gen       1424M 2604M            gc.ps_marksweep.cou 53                  
+  nonheap          325M  349M  -1         nt                                      
+  code_cache       119M  120M  240M       gc.ps_marksweep.tim 35355               
+  metaspace        186M  206M  -1         e(ms)                                   
+  Runtime                                                                         
+  os.name                                 Linux                                   
+  os.version                              3.10.0-514.26.2.el7.x86_64              
+  java.version                            1.8.0_111                               
+  ```
+
+### 输入 `thread` 查看当前所有线程
+
+  ```
+  Threads Total: 402, NEW: 0, RUNNABLE: 29, BLOCKED: 0, WAITING: 50, TIMED_WAITING
+  : 313, TERMINATED: 0, Internal threads: 10                                      
+  ID NAME                GROUP     PRIORI STATE  %CPU  DELTA_ TIME   INTER DAEMON 
+  22 http-nio-8080-exec- main      5      RUNNAB 13.26 0.026  0:8.87 false true   
+  20 http-nio-8080-exec- main      5      RUNNAB 13.16 0.026  0:6.17 false true   
+  12 http-nio-8080-exec- main      5      RUNNAB 12.55 0.025  0:7.64 false true   
+  83 http-nio-8080-exec- main      5      RUNNAB 12.42 0.025  0:6.32 false true   
+  83 http-nio-8080-exec- main      5      RUNNAB 12.32 0.024  0:5.01 false true   
+  11 http-nio-8080-exec- main      5      RUNNAB 12.12 0.024  0:5.27 false true   
+  11 http-nio-8080-exec- main      5      RUNNAB 12.05 0.024  0:3.32 false true   
+  10 http-nio-8080-exec- main      5      RUNNAB 11.59 0.023  0:6.16 false true   
+  11 arthas-command-exec system    5      RUNNAB 0.99  0.002  0:29.3 false true   
+  -1 VM Thread           -         -1     -      0.69  0.001  0:20.2 false true   
+  -1 C2 CompilerThread1  -         -1     -      0.67  0.001  1:28.9 false true   
+  83 http-nio-8080-exec- main      5      TIMED_ 0.12  0.000  0:3.71 false true   
+  62 lettuce-nioEventLoo main      5      RUNNAB 0.06  0.000  0:2.13 false true   
+  35 lettuce-nioEventLoo main      5      RUNNAB 0.04  0.000  0:14.9 false true   
+  -1 VM Periodic Task Th -         -1     -      0.03  0.000  0:0.90 false true   
+  80 http-nio-8080-Clien main      5      RUNNAB 0.01  0.000  0:3.26 false true   
+  37 lettuce-eventExecut main      5      WAITIN 0.01  0.000  0:1.46 false true   
+  18 Druid-ConnectionPoo main      5      WAITIN 0.01  0.000  0:0.97 false true   
+  65 Spring session redi main      5      WAITIN 0.01  0.000  0:0.37 false false  
+  47 org.springframework main      5      TIMED_ 0.01  0.000  0:0.64 false false  
+  42 org.springframework main      5      TIMED_ 0.01  0.000  0:0.64 false false 
+  ```
+
+### 记录指定方法的每次调用环境现场
+
+```shell
+# 指定类 指定方法
+tt -t cn.zjyjx.web.controller.buz.InfoController getRemind
+
+# 模糊类名
+tt -t *LoginController newLoginIn
+```
+
+### 反编译查看在线源码
+
+```shell
+# jad 类名
+jad cn.zjyjx.web.controller.buz.InfoController
+
+# jad 类名 方法名
+jad cn.zjyjx.web.controller.buz.InfoController getRemind
+```
+
+### 函数执行数据观测
+
+```shell
+# watch 类名 方法名
+watch demo.MathGame primeFactors -x 2
+```
+返回内容
+
+> 观察表达式,默认值是{params, target, returnObj},对应下发内容 result
+
+```
+method=demo.MathGame.primeFactors location=AtExceptionExit
+ts=2021-08-31 15:22:57; [cost=0.220625ms] result=@ArrayList[
+    @Object[][
+        @Integer[-179173],
+    ],
+    @MathGame[
+        random=@Random[java.util.Random@31cefde0],
+        illegalArgumentCount=@Integer[44],
+    ],
+    null,
+]
+```

+ 8 - 2
README.md

@@ -1,5 +1,11 @@
 # 浙江正宏信息科技有限公司简介
 
+## 版本控制
 
-- [分支管理](./分支管理.md)
-- [Git 操作简介](./git.md)
+- [分支管理v1-简易版](./分支管理v1.md)
+- [分支管理v2-一个项目涉及开发人员超5人后](./分支管理v2.md)
+- [Git 操作简介](./git.md)
+
+## 后端操作说明
+
+- [Java应用诊断说明](./Java应用诊断说明.md)

+ 84 - 0
git.md

@@ -0,0 +1,84 @@
+# Git操作说明
+
+下载并安装 [Git](https://git-scm.com/)
+
+
+**git 常用操作名称**
+
+1. pull 从服务器上面拉取代码
+2. checkout 签出分支
+3. add 将修改的文件添加到暂存区,等待commit
+4. commit 提交代码到本地仓库
+5. push 推送本地commit记录到服务器
+6. stash 将当前修改未提交的文件存放到缓存区
+
+## 项目初始化
+
+```shell
+# 创建readme文件
+touch README.md
+# git初始化
+git init
+# 添加文件到git版本控制
+git add README.md
+# 提交版本控制到本地,并添加注释信息
+git commit -m "first commit"
+# 添加远程服务器地址
+git remote add origin http://121.40.122.81:3000/wukon/git-test.git
+# 推送本地版本到服务器
+git push -u origin master
+```
+
+**下载项目到本地**
+
+在本地磁盘中找到一个文件夹(用于存放项目代码的,例如:Workspace),打开命令行窗口,输入 `git clone 远程仓库地址`,回车后等待文件下载完成即可
+
+> 每次开发新功能时,需要创建新的分支,如果该功能和另一个新功能相关,则在同一分支进行开发
+
+## vs code 版
+
+1. 创建新分支
+
+    从origin/master分支上创建新分支`dev_姓名缩写_日期`
+
+    ![创建分支](./images/createBranch.gif)
+
+1. 新建文件
+
+   ![新建文件](./images/vsc_create.png)
+
+1. 提交文件
+
+    左侧切换到版本控制面板,在消息框内输入本次开发的内容,点击 Commit 即可提交本次开发的内容。
+    ![提交文件1](./images/vsc_create2.png)
+    如果本地改了多个文件,有些文件不需要提交,则通过更改文件后面的+号,选择性的添加文件到暂存区
+    ![提交文件2](./images/vsc_create3.png)
+
+1. 提交到远程服务器
+
+本地开发完成后,填写提交消息,并提交到远程服务器
+
+![提交并推送](./images/commitAndPush.gif)
+
+1. 同步分支
+
+    如果远程服务器已经存在该分支,则会出现同步按钮,点击后,编辑器会将远程分支先同步到本地再进行合并然后再推送到远程服务器
+
+    ![同步分支](./images/vsc_git_sync.png)
+
+    如果存在文件修改重复,则会出现文件冲突,需要选择要保留的修改内容,保存修改,然后在commit提交,再点击同步更改按钮,将合并后的结果推送到服务器
+
+    ![vsc解决冲突文件](./images/vsc_git_confict.gif)
+
+## IDEA 版
+
+1. 创建新分支
+
+    从origin/master分支上创建新分支`dev_姓名缩写_日期`
+
+    ![创建分支](./images/idea_git_checkout.gif)
+
+1. 提交并推送文件
+
+    点击左上角的箭头,打开提交窗口,选择要提交的文件,填写本次修改内容,点击`commit`提交到本地版本库,点击 `commit and push` 提交到本地版本库并推送到服务器
+    ![idea提交并推送](./images/idea_git_commitPush.gif)

二进制
images/commitAndPush.gif


二进制
images/createBranch.gif


二进制
images/gitBranchManage.png


二进制
images/gitCreateMerge.png


二进制
images/gitCreateMergeDetail.png


二进制
images/git_clone.png


二进制
images/git分支管理-简易版.png


二进制
images/idea_git_checkout.gif


二进制
images/idea_git_commitPush.gif


二进制
images/vsc_create.png


二进制
images/vsc_create2.png


二进制
images/vsc_create3.png


二进制
images/vsc_git_confict.gif


二进制
images/vsc_git_confict.png


二进制
images/vsc_git_sync.png


+ 39 - 0
分支管理v1.md

@@ -0,0 +1,39 @@
+为保证功能未完成时,不会上线到生产环境产生问题。开发过程中需要进行规范。
+
+![git分支管理](./images/git%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86-%E7%AE%80%E6%98%93%E7%89%88.png)
+
+## bug修复
+
+根据实际情况采用以下两种方式之一
+
+简单性的bug
+
+1. 切换到master分支,直接修改,测试,成功后提交并推送到远程服务器
+
+复杂性的bug(修改过程可能影响到其他功能使用)
+
+1. 从master分支创建新分支`fix_姓名缩写_日期`
+3. 修改,测试
+4. 测试通过后,将分支合并到`master`分支,并创建Tag,标识发布新版本,系统更新日志里面补充更新内容
+5. 合并到`master`分支后,该分支使命已完成,则删除该分支,后续如果有新bug出现,则重新创建分支进行修复。
+
+## 新功能开发
+
+1. 从master分支创建新分支`dev_姓名缩写_日期或功能名称`
+2. 开发完成或者部分完成需要测试时,合并到`test`分支
+3. 如果功能还有bug,则继续在当前分支进行开发,开发完成后再合并到`test`分支进行测试
+4. `test`分支测试通过后,再将该分支合并到`develop`分支
+5. 合并后,在`develop`分支进行上线前测试
+6. 测试通过后,将`develop`分支合并到master分支,并创建Tag,标识发布新版本,系统更新日志里面补充更新内容
+7. 合并到`master`分支后,该分支使命已完成,则删除该分支,后续如果有新bug出现,则重新创建分支进行修复。
+
+> 如果新功能开发时间比较漫长,则需要每天将`master`分支合并到当前分支里,保证自己分支的代码不落后主分支
+
+> 如果新功能基于另一个开发人员的功能,则可以选择在对方的分支上进行开发,无需另外创建分支
+
+
+### 分支合并操作,通过git仓库发起合并请求
+
+![创建合并请求1](images/gitCreateMerge.png)
+
+![创建合并请求2](images/gitCreateMergeDetail.png)

+ 31 - 0
分支管理v2.md

@@ -0,0 +1,31 @@
+为保证功能未完成时,不会上线到生产环境产生问题。开发过程中需要进行规范。
+
+![git分支管理](./images/gitBranchManage.png)
+
+**bug修复**
+
+1. 从master分支创建新分支`fix_姓名缩写_日期`
+2. 开发完成后,合并到`develop`分支进行上线前测试
+3. 测试通过后,将`develop`分支合并到`master`分支,并创建Tag,标识发布新版本,系统更新日志里面补充更新内容
+4. 合并到`master`分支后,该分支使命已完成,则删除该分支,后续如果有新bug出现,则重新创建分支进行修复。
+
+**新功能开发**
+
+1. 从master分支创建新分支`dev_姓名缩写_日期或功能名称`
+2. 开发完成或者部分完成需要测试时,合并到`test`分支
+3. 如果功能还有bug,则继续在当前分支进行开发,开发完成后再合并到`test`分支进行测试
+4. `test`分支测试通过后,再将该分支合并到`develop`分支
+5. 合并后,在`develop`分支进行上线前测试
+6. 测试通过后,将`develop`分支合并到master分支,并创建Tag,标识发布新版本,系统更新日志里面补充更新内容
+7. 合并到`master`分支后,该分支使命已完成,则删除该分支,后续如果有新bug出现,则重新创建分支进行修复。
+
+> 如果新功能开发时间比较漫长,则需要每天将`master`分支合并到当前分支里,保证自己分支的代码不落后主分支
+
+> 如果新功能基于另一个开发人员的功能,则可以选择在对方的分支上进行开发,无需另外创建分支
+
+
+### 分支合并操作,通过git仓库发起合并请求
+
+![创建合并请求1](images/gitCreateMerge.png)
+
+![创建合并请求2](images/gitCreateMergeDetail.png)