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.2 refs:heads、remotes、tags

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