1 Maven
1.1 基本介绍

1.2 主要功能

1.3 环境配置

1.4 统一JDK版本

1.5 常用命令

1.6 生命周期

1.7 版本依赖

1.8 继承与聚合

1.9 Maven工程

1.10 Maven开发Web项目

2 Gradle
2.1 环境配置
00.官方文档
https://akhikhl.github.io/gretty-doc/index.html
01.cmd开发
1.GRADLE_HOME:D:\software\Java\Gradle\gradle-6.2.2
2.GRADLE_USER_HOME:D:\software\Java\Gradle\Repository
3.PATH:%GRADLE_HOME%\bin
02.idea开发(本地仓库)
settings -> Build Tools -> Gradle
2.2 Gretty

2.3 remote

2.4 Git托管(版本控制)
2.4.1 bash

2.4.2 Clone

2.4.3 Git命令

3 SVN
3.1 SVN常见操作

3.2 SVN安装
https://sourceforge.net/projects/win32svn/?source=typ_redirect

3.3 中央仓库
svnadmin create D:\\software\\Java\svn

3.4 启动svn服务
3.4.1 命令行方式
svnserve -d -r D:\\software\\Java\svn

3.4.2 注册系统方式(推荐)
01.管理员方式运行
sc create mysvn binpath="D:\document\SVN\bin\svnserve.exe --service -r D:\\software\\Java\svn" start=auto depend=Tcpip
02.说明
启动: sc start 服务名
关闭: sc stop 服务名
删除: sc delete 服务名

3.5 访问项目
3.5.1 匿名访问

3.5.2 授权访问

4 Eclipse中使用SVN
4.1 在eclipse中安装SVN插件

4.2 使用SVN插件
4.2.1 准备发布

4.2.2 真正发布(组长)

4.2.3 下载项目(组员)

4.2.4 更新/提交/查看项目状态

4.2.5 修改svn用户名密码

4.3 恢复/查看历史版本

4.4 发布项目

5 Git基础篇
5.1 SVN与Git

5.2 Git
5.2.1 本地与远程关联

5.2.2 本地项目与远程项目关联

5.2.3 使用Git
01.第一次发布项目(本地-远程)
git add . //文件-暂存区 .代表当前目录的所有文件
git commit -m "注释内容" //暂存区-本地分支(默认master)
git push -u origin master //第一次push到远程仓库
02.第一次提交(本地-远程)
git add .
git commit -m "注释内容"
git push origin master //后期提交,直接git push
03.克隆项目(远程-本地)
git clone git@github.com:wohenguaii/MyGit.git
04.更新(远程-本地)
git pull
5.3 Eclipse中操作Git
5.3.1 配置Git

5.3.2 使用Git

5.3.3 Egit冲突解决

5.4 Git团队协作

6 Git高级篇
6.1 Git发展史

6.2 Git优势

6.3 Git使用
6.3.1 将某个目录纳入Git管理
01.命令1
git init 将某个目录纳入Git管理
02.命令2
rm -rf .git 删除版本库(暂存区、对象区)
rm -rf * 当前目录中的文件、子文件目录全部删除(但不会删除隐藏文件、不过回收站)
rm -rf / 不要执行,会删除整个计算机中的全部文件

6.3.2 工作区/暂存区/对象区
6.3.2.1 创建/添加/提交
01.创建
touch hello.txt
git add . 全部文件(符合git语法, .gitignore忽略文件不上传)
git add * 全部文件(不符合git语法, .gitignore忽略文件也会上传)
git add hello.txt 单个文件
02.提交
git commit 提交,暂不写注释
git commit -m "xx" 提交,少量注释
git commit -am 'xx' add同时commit,第一次创建文件,不能使用

6.3.2.2 本地工作区状态
01.命令
git status 本地工作区状态

6.3.2.3 删除暂存区,“暂存区”退回“工作区”
01.方法一
git rm --cached hello.txt
02.方法二
git reset head world.txt
03.方法三
git restore --staged hello.txt

6.3.2.4 修改文件后,“对象区”退回”工作区”,重新提交
01.操作
vi hello.txt
git add .
git commit

6.3.2.5 修改文件后,不用退回“工作区”,可以放弃修改
01.方法一
git checkout -- hello.txt
02.方法二
git restore hello.txt

6.3.2.6 日志
01.命令1
git log 查看全部提交日志
git log -2 查看最近的两条日志
git log --graph 图像界面
02.命令2
git log --pretty=oneline 自定义日志
git log --pretty=format:"%h - %an ,%ar : %s" 自定义日志
git log --graph --pretty=oneline --abbrev-commit
02.命令3
git log origin/master 查看github分支的日志
git log remotes/origin/master
git log refs/remotes/origin/master

6.3.3 设置邮箱、用户名

6.3.3.1 给当前项目一次性设置
01.命令
git config --local user.name '汐炎'
git config --local user.email '1351494395@qq.com'
02.配置文件
~/Desktop/mygit/.git/config

6.3.3.2 给当前用户一次性设置,推荐:~/Desktop/mygit
01.命令
git config --global user.name '汐炎'
git config --global user.email '1351494395@qq.com'
02.配置文件
C:\Users\13514\.gitconfig

6.3.3.3 直接打开文件修改,简单粗暴

6.3.3.4 删除邮箱、用户名
01.命令
git config --local --unset user.name
git config --local --unset user.email

6.3.4 删除文件
6.3.4.1 Git删除“对象区文件”
01.彻底删除
git rm b.txt //删除至“暂存区”
git commit -m "彻底删除b" //commit删除指令至“对象区”
02.后悔删除操作
a.方法一
git rm world.txt //删除至“暂存区”
git restore --staged world.txt //恢复到“工作区”
git restore world.txt //撤销“delete”指令
b.方法二
git rm world.txt //删除至“暂存区”
git reset HEAD world.txt //恢复到“工作区”
git checkout -- world.txt //撤销“delete”指令

6.3.4.2 操作系统删除“对象区文件”
01.命令
rm a.txt //删除文件后,被放到“工作区”
git add . //add至“暂存区”
git commit -m "彻底删除" //commit至“对象区”

6.3.5 重命名文件
6.3.5.1 Git重命名“对象区文件”
01.命令
git mv hello.txt hello222.txt //重命名
git commit -m 'rename' //提交到"对象区"

6.3.5.2 操作系统重命名“对象区文件”
01.命令
mv hello2.txt hello22.txt //重命名
git add . //两个文件都添加到"暂存区"
git commit -m 'rename' //两个文件都提交到"对象区"

6.3.6 注释重写(重写提交说明)
01.命令
git commit --amend -m '修正' //默认,修改最近一次的注释

6.3.7 忽略文件:.gitignore
01.通配符
* 任意字符
! 非
02.命令
dir/ 忽略dir目录中的所有文件
dir/*.txt
dir/*/*.txt 能够忽略 dir/abc/a.txt dir/xyz/a.txt ,不能 dir/xyz/123/a.txt
dir/**/*.txt: 任意级别目录

6.4 本地分支的常见操作
6.4.1 查看/创建/切换/删除分支
01.命令
git branch 查看分支
git branch -a 查看分支
git branch -v 查看分支(sha1值)
git branch -av 查看分支(追踪分支)
git branch 分支名 创建分支
02.命令
git checkout 分支名 切换分支
git checkout -b 分支名 创建新分支并切换
git branch -d 分支名 删除分支(不能删除当前分支)
03.其他不能删除的情况
包含 “未合并”的内容,删除分支之前,建议先合并

6.4.2 删除分支的三种情况
6.4.2.1 删除分支前合并(建议):分支A进行写操作,仅在”对象区”
01.git branch -d new_branch
在master分支,删除new_branch,报错:new_branch还没有合并
02.git merge new_branch
将new_branch增加/删除的操作合并到master主分支,保护分支中修改的文件,短的分支点"合并"长的分支点
03.git branch -d new_branch
合并后,再次删除new_branch分支

6.4.2.2 强制删除分支
01.命令
git branch -D new_branch2

6.4.2.3 直接删除分支:分支A进行写操作,仅在”工作区”

6.4.3 重命名分支
01.命令
git branch -m master master2
6.5 本地分支的冲突问题
6.5.1 一条工作记录线

6.5.2 存放HEAD位置:.git/HEAD

6.5.3 合并不冲突
6.5.3.1 merge时,默认fast-forward,丢失分支信息(短追长,查看短master的分支信息)
01.说明
master短,dev长,短追长,
则在master中,使用git merge dev

6.5.3.2 merge时,禁止git merge —no-ff dev,分支信息完整(短追长,查看短master的分支信息)
01.说明
master短,dev长,短追长,禁长
则在master中,使用禁止git merge --no-ff dev

6.5.3.3 不禁止/禁止—no-ff,对比图
01.说明
merge时,git merge dev,丢失分支信息(短追长,查看短master的分支信息)
merge时,禁止git merge --no-ff dev,分支信息完整(短追长,查看短master的分支信息)

6.5.4 合并冲突

6.5.4.1 合并时,发生冲突

6.5.4.2 修改冲突:修改文件、add、commit
01.说明
1.vi修改文件
2.git add . //告知git,冲突已解决,此时add不代表在工作区,是标志
3.git commit -m 'xx'

6.5.4.3 修改冲突后,再次进行合并,不会发生冲突

6.6 版本穿梭
01.说明
git reset --hard HEAD^
git reset --hard sha1值的前几位

6.7 checkout
6.7.1 checkout:切换分支

6.7.2 checkout:放弃工作区中的修改
01.说明
git checkout -- a.txt
6.7.2.1 checkout放弃工作区中的修改,相对于暂存区

6.7.2.2 checkout放弃工作区中的修改,相对于对象区

6.7.3 checkout:版本穿梭(游离状态)
01.命令
git checkout sha1值
02.版本穿梭(游离状态)
1.修改后、必须提交
2.创建分支的好时机 git branch mybranch 2735603

6.8 reset:将增加到暂存区中的内容回退到工作区
01.命令
git reset HEAD a.txt

6.9 stash:保存现场
6.9.1 切换分支(前提:不在同一个commit阶段)
01.保存现场
git stash
git stash save 'mystash'
02.还原现场(栈的设计,默认还原最近一次):
①git stash pop (还原内容,同时将原来保存的现场删除)
②git stash apply(还原内容,但不删除原保存的现场),可以指定某一次现场git stash apply stash@{1}
虽然不会删除现场,但可以手工删除现场:git stash drop stash@{0}
03.查看现场:git stash list(了解即可)
如果不同的分支在同一个commit阶段,则在commit之前,可以chekcout切换分支
6.9.1.1 前提:不在同一个commit阶段

6.9.1.2 git stash pop (还原内容,同时将原来保存的现场删除)

6.9.1.3 git stash apply(还原内容,但不删除原保存的现场)

6.9.2 切换分支(前提:同一个commit阶段)
6.9.2.1 前提:同一个commit阶段

6.9.2.2 如果不同的分支在同一个commit阶段,则在commit之前,可以chekcout切换分支

6.9.3 修改同一行,还原冲突
00.场景
1.修改A文件第四行,未commit,此时保存现场
2.再次修改A文件第四行,同时commit,此时还原现场会造成"修改同一行,冲突"

6.10 blame
01.命令
git blame a.txt 查看a.txt的所有提交commit的sha1值,以及每一行的作者

6.11 差异性diff
6.11.1 操作系统:diff
01.命令
diff:比较的是文件本身
diff a.txt b.txt A为参照,对比B
diff -u a.txt b.txt
02.说明
@@ -4,4 +4,6 @@
4:从第4行开始
6:比较6行
-:原文件
+:对比的文件
6.11.1.1 比较文件本身,A为参照,对比B

6.11.2 Git命令:git diff
01.命令
git diff:暂存区为参照,对比工作区
git diff commit的sha1值:对象区为参照,对比工作区
git diff commit的sha1值:"最新"对象区为参照,对比工作区
git diff head:"最新"对象区为参照,对比工作区
02.命令
git diff --cached commit的sha1值:对象区为参照,对比暂存区
git diff --cached commit的sha1值:"最新"对象区为参照,对比暂存区
git diff --cached HEAD:"最新"对象区为参照,对比暂存区
6.11.2.1 比较区中文件,暂存区为参照,对比工作区
01.命令
git diff:暂存区为参照,对比工作区

6.11.2.2 比较区中文件,对象区为参照,对比工作区
01.命令
git diff commit的sha1值:对象区为参照,对比工作区

6.11.2.3 比较区中文件,“最新”对象区为参照,对比工作区
01.命令
git diff commit的sha1值:"最新"对象区为参照,对比工作区
git diff head:"最新"对象区为参照,对比工作区

6.11.2.4 比较区中文件,对象区为参照,对比暂存区
01.命令
git diff --cached commit的sha1值:对象区为参照,对比暂存区

6.11.2.5 对比区中文件,“最新”对象区为参照,对比暂存区
01.命令
git diff --cached commit的sha1值:"最新"对象区为参照,对比暂存区
git diff --cached HEAD:"最新"对象区为参照,对比暂存区

7 GitHub
7.1 Push/Pull

7.1.1 ssh-keygen

7.1.2 Push
7.1.2.1 Push
01.需要账号密码登录https://github.com/wohenguaii/git2020.git
a.首次
关联本地仓库与远程仓库地址
git remote add origin https://github.com/wohenguaii/git2020.git
关联本地分支与远程分支地址
git push -u origin master
b.后续推送
git push
02.SSH免密登录git@github.com:wohenguaii/git2020.git
a.首次
关联本地仓库与远程仓库地址
git remote add origin git@github.com:wohenguaii/git2020.git
关联本地分支与远程分支地址
git push -u origin master
b.后续推送
git push
03.显示远程信息
git remote show origin

7.1.2.2 开发分支顺序
01.说明
dev:开发分支,频繁改变
test:基本开发完毕后,交给测试实施人员的分支
master:生产阶段,很少变化
bugfix:临时修复bug分支
02.说明
dev -> test (merge dev) -> master (merge test ) -> ....
7.1.2.3 orgin/master新分支
01.连接成功会,git会产生一个新分支origin/master
1.git会在本地维护origin/master分支,通过该分支会感知远程github的内容
2.origin/master一般建议不要修改,是一个只读分支

7.1.2.4 orgin/master新分支会感知远程github的内容

7.1.3 Pull
7.1.3.1 clone
01.命令
git clone git@github.com:wohenguaii/git2020.git mygit2

7.1.3.2 pull
01.命令
pull/push:推送、改变origin/master指针
Fast-forward:更新,如果发现更新的内容比自己先一步(commit的sh1值在自己之前),则会自动合并

7.1.4 本地分支与远程分支的冲突问题
7.1.4.1 发生冲突

7.1.4.2 解决冲突

7.1.4.3 当前分支领先2 commits

7.1.4.4 验证pull=fetch+merge

7.2 图形化工具
7.2.1 gitk

7.2.2 GUI

7.2.3 GitHub desktop

7.3 远程分支的常见操作
7.3.1 查看远程服务器的信息
01.本地工作区状态
git status
02.远程服务器的信息
git remote show //查看有哪些远程服务器
git remote show origin //查看origin

7.3.2 查看远程分支的日志
01.本地日志
git log
02.远程日志
git log origin/master
git log remotes/origin/master
git log refs/remotes/origin/master

7.3.3 查看远程分支的状态
01.命令
git branch 查看分支
git branch -a 查看分支
git branch -v 查看分支(sha1值)
git branch -av 查看分支(追踪分支)
7.3.4 删除远程分支
01.删除本地分支
git branch -D new_branch2
02.删除远程分支
方法一:git push origin :test
方法二:git push origin --delete dev

7.3.5 本地分支与远程分支的手动关联操作
7.3.5.1 本地分支→追踪分支→远程分支
01.创建新分支
git checkout -b dev
02.远程分支->追踪分支->本地分支
方法一:
git push -u origin dev Push推送,同时dev分支手动关联origin分支
方法二:
git push --set-upstream origin dev

7.3.5.2 远程分支→追踪分支→本地分支
01.远程分支->追踪分支
git pull,可以将远端分支更新到本地origin/xxxx,但是不会再创建本地分支
02.追踪分支->本地分支
方法一:
git checkout -b dev origin/dev 创建并切换dev新分支,同时dev分支手动关联origin分支
方法二:
git checkout -b test --track origin/test
方法三:
git checkout --track origin/test

7.3.6 本地分支与远程分支的自动关联操作
7.3.6.1 Push推送 + 创建本地新分支 + 分支自动关联
01.创建本地新分支
git checkout -b ccc
02.Push推送 + 分支自动关联
git push origin ccc:ccc2
git push origin HEAD:ccc2

7.3.6.2 Pull拉取 + 创建本地新分支+ 分支自动关联
01.命令
git pull origin ccc2:ccc3

7.3.7 删除无效的追踪分支
00.场景
本地没有a分支,但本地却感知远端的a分支
01.检测
git remote prune origin --dry-run
02.清理无效的追踪分支(本地中感知的远程分支)
git remote prune origin

7.3.8 感知远程分支的配置文件
00.手动配置
git fetch origin master:refs/remotes/origin/helloworld

7.3.9 给checkout命令起别名
00.用户配置
git config --global alias.ch checkout

7.4 标签release:使用于整个项目,跟具体的分支没有关系
7.4.1 创建标签
01.简单标签,只存储当前的commit的sha1值
git tag v1.0 v1.0 : 8c3512547
02.(创建一个新对象,会产生一个新的commit/sha1)存储信息,其中包含了当前的commit的sha1值
git tag -a v1.0 -m 'release Tag' v2.0 : 61fb09fd(8c3512547)

7.4.2 查看标签
01.命令
git tag -d v1.0 删除标签
02.命令
git tag 查看所有标签
git tag -l 'v*' 查看标签,模糊查询
git show v1.0 查看标签v1.0

7.4.3 推送标签
01.命令
git push origin v1.0 推送标签
git push origin v1.0 v2.0 推送多个标签
git push origin --tags 推送全部标签
git push origin refs/tags/v1.0:refs/tags/v1.0 推送标签,完整写法

7.4.4 拉取标签
01.如果远端新增标签,则pull可以将新增的标签拉取到本地;如果远程是删除标签,则pull无法感知
git pull 拉取全部,包括全部标签,
02.只拉取标签
git fetch orgin tag v4.0
03.删除标签,注意:如果将远程标签删除,其他用户无法直接感知
git push origin v1.0
git push origin :refs/tags/v1.0

7.5 压缩
7.5.1 git gc
01.命令
git gc:压缩
02.说明
objects、refs中记录了很多commit的sha1值,
如果执行gc,则会将这么多sha1值存放到一个压缩文件中packed-refs


7.5.3 objects:对象(git每一次version的全量内容)

8 GitHub
8.1 裸库
00.没有“工作区”的工作仓库 ,存在于服务端
git init --bare

8.2 submodule单向操作
8.2.1 准备本地仓库A和B,远程仓库A和B
00.submodule:子模块
应用场景 :在一个仓库中引用另一个仓库的代码。
01.仓库A的连接
a.第一次:关联本地仓库与远程仓库地址
git remote add origin git@github.com:wohenguaii/A.git
b.第二次:关联本地分支与远程分支地址
git push -u origin master
c.给当前仓库A配置邮箱、地址:
git config --local user.name '我很怪i'
git config --local user.email '1351494395@qq.com'
02.仓库B的连接
a.第一次:关联本地仓库与远程仓库地址
git remote add origin git@github.com:wohenguaii/B.git
b.第二次:关联本地分支与远程分支地址
git push -u origin master
c.给当前仓库B配置邮箱、地址:
git config --local user.name '我很萌i'
git config --local user.email '384415765@qq.com'

8.2.2 submodule:在A仓库中引用B仓库
01.本地仓库:在A仓库中引用B仓库
git submodule add git@github.com:wohenguaii/B.git
02.推送给远程仓库
git add .
git commit -m '加入B库'
git push

8.2.3 A中有B,但B库修改并Push之后,A库无法直接感知,A库需要主动Pull

8.2.3.1 进入A/B中pull到本地,并在A中同步push到远程
01.进入A/B中pull到本地
git pull
02.在A中同步push到远程
git add .
git commit -m 'xx'
git push

8.2.3.2 直接在A中迭代pull到本地,并在A中同步push到远程
01.直接在A中迭代pull到本地,一次性搞定多个
git submodule foreach git pull
02.在A中同步push到远程
git add .
git commit -m 'xx'
git push

8.2.4 clone(A库含B库)
00.如果clone的项目包含submodule,则clone方法:
git clone git@github.com:wohenguaii/A.git --recursive

8.2.5 删除B库,并同步到远程
01.删除暂存区,“暂存区”退回"工作区"
git rm --cached B
02.删除对象区(操作系统删除)
rm -rf B
rm -rf .gitmodules
删除对象区,退回工作区,需要重新提交
git add .
git commit -m '删除'
03.同步到远程
git push

8.3 subtree双向操作
8.3.1 准备本地仓库parent和subtree,远程仓库parent和subtree
01.仓库parent的连接
a.第一次:关联本地仓库与远程仓库地址
git remote add origin git@github.com:wohenguaii/parent.git
b.第二次:关联本地分支与远程分支地址
git push -u origin master
02.仓库subtree的连接
a.第一次:关联本地仓库与远程仓库地址
git remote add origin git@github.com:wohenguaii/subtree.git
b.第二次:关联本地分支与远程分支地址
git push -u origin master

8.3.2 父子工程建立联系
00.父工程(parent)
a.给远程仓库起名字
git remote add subtree-origin git@github.com:wohenguaii/subtree.git
b.第一种方式:父工程添加子工程subtree1
git subtree add -P subtree subtree-origin master
等价于
git subtree add --prefix subtree subtree-origin master
c.第二种方式:父工程添加子工程subtree2
git subtree add -P subtree2 subtree-origin master --squash

8.3.3 修改子工程 → 父工程
8.3.3.1 subtree pull,修改子工程中的内容,GitHub同步子工程内容更新成功
01.修改子工程并推送
vi -> add -> commit -> push
02(本地)将GitHub中的子工程 更新到 父中子模块
git subtree pull -P subtree subtree-origin master
03.父中子模块的更新情况 推送到 对应GitHub的父工程上
git push

8.3.4 修改父工程中子模块→子工程
8.3.4.1 常规push,修改本地父工程中子模块,会使GitHub对应父工程中子模块更新成功,但真正的子工程未更新
01.命令
git push

8.3.4.2 subtree push,修改本地父工程中子模块,不经过GitHub对应父工程中子模块,直接推送到真正的子模块
01.命令
git subtree push -P subtree subtree-origin master

8.3.5 squash的使用

8.3.6 冲突原理解析
8.3.6.1 是否修改同一行、是否同一祖先

8.3.6.2 squash要么都加,要么都不加

8.3.6.3 squash只加一边,容易造成冲突

8.4 cherry-pick:如果B转到A,则在A中操作
8.4.1 思路
01.思路
a.cherry-pick复制到应该编写的分支上
git cherry-pick sha1值
b.把写错分支删除(git checkout 旧节点的sha1值,然后删除分支)
git checkout sha1值 git branch -D dev
c.如果仍需dev分支,则再新建分支git
git checkout -b dev

8.4.2 cherry-pick在复制的时候,不要跨commit节点复制

8.5 rebase:如果B转到A,则在B中操作
8.5.1 思路
01.rebase:变基(衍合),改变分支的根基
rebase会改变提交历史
rebase之后的提交线路是一条直线

8.5.2 冲突问题
8.5.2.1 发现冲突
01.命令
git rebase 转移的分支名

8.5.2.2 解决冲突
01.命令
git vi
git add .
git rebase --continue

8.5.2.3 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支)
01.命令
git rebase --skip

8.5.3 还原rebase之前的场景
01.命令
git rebase --abort
8.5.4 两点建议
01.一般建议
1.reabase分支在本机操作,不要推送GitHub
2.不要在master上直接rebse
9 GitLab
