Git
工作区域
使用流程
- 一般流程:开始开发之前,需要先git fetch,把最新的内容拉取到本地;然后git merge,把内容合并到当前修改;然后进行开发,完成后执行git add .,将修改添加到暂存区;然后git commit 将修改提交到版本管理;最后git push推送给远程仓库,供其他人拉取使用。
基本命令
创建本地仓库
# 在当前目录新建一个Git代码库
$ git init
克隆远程仓库
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]
文件状态
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
提交文件
- 已提交的文件也存在于暂存区中
# 暂存区操作
git add . # 添加工作区中所有untracked或updated文件到暂存区,“.”代表全部
git rm --cached -r . # 递归移除所有暂存区的文件
git rm -f -r . # 递归删除所有暂存区的文件(连同工作区中文件的一块删除)
git restore . # 根据暂存区中的数据恢复工作区中被删除或被修改的tracked文件
git restore --staged . # 首先保证工作区数据不变,然后使暂存区中的数据和本地仓库中的数据一致。
# 版本库操作
git pull # 拉取远程仓库代码到工作区(pull = fetch + merge)
git fetch # 拉取远程仓库代码到本地仓库
git diff # 比较代码
git commit -m "消息内容" # 提交暂存区中的内容到本地仓库 -m 提交信息
git revert [branch] # 撤销上一个commit的内容,但不会删除之前的commit记录,反而是生成新的记录
git revert [commitId] # 指定commitId撤销commit,同样不会删除以前的commit记录
git stash # 将工作区和暂存区的内容 隐藏到堆栈缓存(stash 只会操作被git追踪的文件)
git stash save "xxx" # 将工作区和暂存区的内容 隐藏到堆栈缓存,并添加注释
git stash pop # 将堆栈中最后隐藏的记录pop出来,并在堆中删除该记录
git stash pop stash@{0} # 指定要pop的记录,pop后删除
git stash apply # 将堆栈中最后隐藏的记录拿出来,但不会在堆中删除该记录
git stash apply stash@{0} # 指定要取出的记录,取出后不删除
git stash drop stash@{0} # 删除某个缓存
git stash clear # 缓存全清
git stash show stash@{0} -p # 显示与缓存的差异,-p 表示查看详情
git stash list # 查看隐藏内容列表
git log [branchName] # 查看分支的提交记录
git reflog # 查看从clone仓库开始,用户所有在本地库中的操作
git reset --hard HEAD~1 # 回退到上一个版本,工作区、暂存区、本地仓库一起回退
git reset --hard HEAD~n # 回退到上n个版本
git reset --hard commitId # 回退到某个reflogId 版本,可用来恢复reset
git reset --soft HEAD^ # 回退到上一个版本,工作区和暂存区不变,本地仓库回退
git reset --mixed HEAD^ # 回退到上一个版本,工作区不变,暂存区和本地仓库回退
git reset --merge head^
git reset --keep head~1
提交忽略
- 使用.gitignore文件配置
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/**/*.p #**表示嵌套路径,即doc下的多层路径。
免密码登录
- 绑定用户名和邮箱
git config --global user.name 'xxx' //设置用户名
git config --global user.email 'xxx@gmail.com' //设置邮箱
- 生成公钥
# 进入 C:\Users\Administrator\.ssh 目录
# 生成公钥
ssh-keygen # 普通版
ssh-keygen -t rsa # 加密版
ssh-keygen -t rsa -b 2048 -C "<comment>" # 2048-bit RSA版
分支操作
分支命令
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 在过去的某个版本切出一个分支
git checkout commitID
# 合并指定分支到当前分支,将指定分支的提交揉成一个然后放在当前分支最新提交之后
git merge [branch]
# 放弃当前合并操作
git merge --abort
# 以指定分支为基础,将当前分支新加的commit加在指定分支上,和merge一样是用来合并的
git rebase [branch]
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
# 提交新分支到远程仓库
git push --set-upstream origin [branch-name]
分支合并
- git最强大的功能就是分支。git在提交时,提交的其实是个提交对象,而这个对象包含着指向父提交对象的指针。而实际分支的原理,就是个可变指针,指向某个提交对象,在操作分支时,其实就是操作的指针。
- 分支合并后,会形成一个新的提交,指向之前的两个合并分支。有时候合并并不能由git自动完成,会存在冲突
解决:合并分支的时候,如果两个分支修改了同一部分内容,那可能就会有冲突。需要我们自己手动解决冲突
后,再提交。
分支切换
- 对于所有分支而言,工作区和暂存区是每个分支共用的。
- 只有将工作区和暂存区的修改在某一分支上提交到版本库中,这些修改的归属分支才会确定。
- 当前分支上的修改和将要切换分支的最新commit 冲突 时,git会拒绝切换分支命令,此时的解决方法有 commit修改 和 stash 修改两种。
规范要求
分支命名规范
- master:主分支,可用稳定的发布版本
- develop:开发主分支,最新的代码
- feature-xxx:功能开发分支
- bugfix-xxx:未发布版本的bug修复分支
- release-xxx:预发布分支
- hotfix-xxx:已发布版本的bug修复分支
提交规范
-
[IMP] 提升改善正在开发或者已经实现的功能
-
[FIX] 修正BUG
-
[REF] 重构一个功能,对功能重写
-
[ADD] 添加实现新功能
-
[REM] 删除不需要的文件
.gitignore
- 忽略git commit 的文件,但是不能忽略 git pull 的文件
DDD
- Domain Driven Design 领域驱动设计
分层结构
- 分层架构图
- 项目结构图
API层
- 用户接口层(api):用户接口层,向外提供服务
- controller:提供资源服务,XxxController.java
- dto:数据传输对象,XxxDTO.java,对于一些复杂页面需要多个实体组合时,可使用DTO对象来传输数据。
APP层
- 应用层(app):应用层,定义系统的业务功能,并指挥领域层中的领域对象实现这些功能,负责用例流程调度,事务控制。
- service:应用服务,XxxService.java,应用服务里进行事务控制,流程调度
- service.impl:应用服务实现,XxxServiceImpl.java
- assembler:DTO组装器,XxxAssembler.java,复杂DTO的组装,简单的直接使用Entity即可
Domain层
- 领域层(domain):领域层,包含领域对象和领域服务,专注核心业务。
- entity:实体对象,与表做映射,具备一些简单的自治的业务方法
- repository:资源库接口,XxxRepository.java,提供数据资源的操作方法,如数据库增删改查、Redis增删改查等,查询操作建议写到 repository 内。
- service:领域服务,命名一般按提供的业务功能命名,通常用于封装一个领域内的复杂业务逻辑,简单的业务逻辑在app 层完成即可,不需要领域层。
- vo:值对象,XxxVO.java,领域内用到的数据封装,对于一些没有实体对象的数据对象但又在领域中用到,使用值对象封装
Infra层
- 基础设施层(infra):基础设施层,提供数据持久化、防腐层实现、第三方库、消息等,为整个业务系统提供基础的服务。
- constant:常量
- mapper:Mapper接口,XxxMapper.java
- repository.impl:资源库实现,XxxRepositoryImpl.java,业务一定不要侵入到这里
- util:工具