你系统学习Git了吗?
学习圣思园张龙老师的Git课程。
使用Mac编程的好处,不是因为Mac长得好看
Git内容学习准备
如果你还没有用Git,就不要写代码了。
GitHub仓库的使用。
新员工入职的时候,会让他先用一周的时间去学习Git。
Mac(优雅的开发环境,Terminal)
不要使用GUI入门Git。要使用命令行。
安装Git
- 使用Xcode自带的Git环境。
- 去官网自行下载安装。
- Terminal的增强。
bash
每一个Linux和Mac自带的解释器。(但是功能不是很强大)
强大的叫:zsh.
加强版本: oh my zsh (自行安装)
清屏命令:clear
or ctrl+L
创建命令:touch xxx.txt :=增删改等。
查看命令:man cp
vi的基本使用。
必须要掌握的:Terminal操作
作为一个JAVA程序员,应该大部分都是在Windows使用JAVA开发,但是希望不要仅仅局限于JAVA。不然对成长很不友好。
内容大纲
- Git官网
- 常见Linux命令介绍
- Git在各种平台下的安装与配置
- 分布式与集中式版本控制系统的差别
- 缓存区、工作区与Git提交
- 版本回退
- 修改与撤销修改,文件的添加与删除
- Git对象类型与索引
- Git分支
- 如何创建,切换与删除分支
- Git分支在项目中开发的使用
- Git分子在工程化项目的最佳实践
- 分支常见重要命令详解
- Git merge
- Git冲突解决策略
- HEAD详解
- Git Commit修改详解
- 远程版本库介绍
- 如何使用远程版本库
- Git Push、Pull、fetch使用与注意事项
- Git合并的基本原则
- Git别名、config文件详解
- Git tag详解
- 如何创建与推送tag
- Git feature分支详解
- 何时使用submodule
- Git subtree详解
- Git subtree的使用方式详解
- .gitignore的正确使用方式
- Git私服GitLab的搭建方法
- 在公司内部使用gitlab作为版本控制服务器
- GitLab使用详解
- GitHub的使用方式
- 搭建基于Intellij IDEA的Java开发环境
- 搭建基于Gradle的JAVA开发环
- Git与Intellij IDEA 的整合方式详解
- Gradle初步使用
- .gitignore最佳实践
学习方法:知道一,更知道二,更知道三。
了解Git
Git简史
开发Git来管理Git
CVS、SVN与Git
不会Git,就别开发代码了。
Git、GitHub与GitLab
Git设计目标
为什么要使用Git
- 本地建立版本库
- 本地版本控制
- 多主机异地协同工作
- 重写提交说明
- 有后悔药可以吃
- 更好用的提交列表
- 更好的差异比较
- 更完善的分支系统
- 速度极快
Git基础
- 直接记录快照,而非差异比较
- 近乎所有操作都在本地执行
- 时刻保持数据完整性
- 多数操作仅添加数据
- 文件的三种状态
- 已修改
- 已暂存
- 已提交
Git文件状态
Git文件:已经被版本库管理的文件
已修改:在工作目录修改Git文件
已暂存:(indea-staged)对已经修改的文件执行Git暂存操作,将文件存入暂存区
已提交:将已经暂存的文件执行Git提交操作将文件存放版本库
pic1
Git的文件状态如下
Pic2
本地版本库与服务器版本库
pic3
Git 安装
Linux
Mac
Windows
需要自行了解 SSH
GUI:source tree & GitHub Desktop
获取本地SSH
ssh-keygen -t rsa ## 三次回车,跳过密码
开始使用Git
Git常用命令
获得版本库
git init
git clone
查看信息
git help
git log
git diff
版本管理
git add
git commit
git rm
远程协作
git pull
git push
其他常用指令
git status ##查看状态
git log ##查看commit记录
git checked -- xxx.txt ##丢弃已经修改的
git reset HEAD xxx.txt ##回到修改前的状态
git commit -m 'commit message' ##简要信息显示并commit
echo 'welcome' > xxx.txt ##重定向welcome 到这个文件的输出
git add . ##当前目录所有文件都add
git log -3 ## 最近三条的log
git help config ## 获取配置
git config --help ## 帮助文档
man git-confgi ##帮助文档
常见功能
配置username && email**
-
/etc/gitconfig (几乎不会使用,针对于整个操作系统的)
git config --system
-
~/.gitconfig (很常用,针对于当前用户的所有配置)
git config --global
-
.git/config (针对于特性项目)
git config --local
Git的提交ID(commit id)是一个摘要值,这个摘要值实际上是个sha1计算出来的
删除(两种方式)
git rm 和 rm的区别
git rm :
1.删除文件
2.并且将删除的文件纳入到暂存区当中(stage,index)
若想恢复删除的文件需要执行两个动作
1. git reset HEAD test2.txt ,将待删除的文件从暂存区恢复到工作区
2. git checkout -- test2.txt ,将工作区中的修改丢弃掉
rm:
将文件删除文件,这时候被删除的文件没有纳入暂存区当中
注意:
这时候如果直接commit,是提示没有修改记录的。
想要纳入暂存区的话,需要使用 git add xxx.txt 把这个文件的删除再加入暂存区。
重命名文件(两种方式)
git mv name1.txt name2.txt (纳入暂存区的修改名字操作)
回退:
git reset HEAD name1.txt
git checked -- name1.txt
也可以使用操作系统的mv指令,关系和删除是相同的
日志修改
git commit --amend -m 'new message' ##把上次保存的commit消息替换掉
熟练使用命令行,是提升开发效率的第一步。
.gitignore文件
操作的时候自动过滤制定的文件。放置在项目的根目录下
支持全文件名/正则表达式/后缀名/通配符
setting.properties ##删除指定文件
*.b ##后缀名
!a.b ## !除了什么
/TODO ##仅仅忽略项目根目录下的TODO文件, stu/TODO 这种是不忽略的
/*/TODO ##仅仅删除二级目录下的TODO文件
/**/TODO ##删除所有目录下的TODO文件
doc/*.txt ##忽略doc目录下的.txt文件,但是 doc/a/a.txt 是不会被忽略的
doc/**/*.txt ##忽略doc目录下的所有*.txt
build/ ## 忽略build目录下的所有文件
#xxxx ## 代表注释
分支 branch
分支的基本使用
查看分支
git branch ## 查看分支
创建分支
git branch new_branch ##创建分支
切换分支
git checkout new_branch ##切换分支
删除分支
git branch -d new_branch ## 删除分支,
## 但是不能删除当前所处的分支。
## 删除 未被合并的 - 使用大写的 D
## 删除 已经被合并的 - 使用小写的 d
## 是为了保护你的误操作。
创建分支的同时,切换到新分支
git checkout -b new_branch
合并分支(先修改,再合并)
git merge new_branch ##合并指定分支合并到当前分支
显示分支的操作
git branch -v ##显示当前分支最后一次提交的信息(commitId 和 message)
git log
git log -3
分支的本质是什么?
分支:一个commit对象链:一条工作记路线。
每一个分支,会记录上一次的commitID。(工作记路线,时间线)。
再谈分支
-
HEAD指向的是当前分支
HEAD信息存放在:
.git
目录下的HEAD
文件中git reset HEAD filename ##之前使用过的恢复指令
master指向提交
合并分支
-
Fast-Forward 快进 (没有冲突文件的合并)
如果可能,合并分支时Git会使用fast-forward模式
在这种模式下,删除分支时会丢掉分支信息
-
合并时加上
--no-ff
参数会禁用fast-forward,这样会多出来一个commit idgit merge --no-ff dev
-
查看日志
git log - -graph
-
出现冲突:conflict. 两个分支修改同一个文件的同一行
- merge出现冲突
- 手动解决冲突
- 使用
git add file
. 告诉git,你已经解决冲突 - 使用
git commit
再次保存. (master上面会出现一个merge的commit记录) - ::这时候使用反向合并,还会冲突吗?并不会。因为master分支上面相对于Dev分支多了一个commit记录,Git认为你这个是一个快进操作。
- 上述理解:用你自己的话就是:再次合并的时候,他们两个的基础是不一样的。意味着:不是同时对同一个文件进行修改的。
创建分支,无非是创建了一个指针。
问题:为什么修改文件之后需要add
一下,然后才能commit。(已明白,添加修改到暂存区。)
git commit -am 'commit message' ##添加所有修改文件到暂存区。然后commit。 合二为一
版本回退
git reset --hard HEAD^ ##返回到上次提交
git reset --hard HEAD^^ ##返回到上两次提交
git reset --hard HEAD~1 ##回到第一个提交
git reset --hard HEAD~n ##回到第第n个提交
git reset --hard commitID ##回退到指定commit
git reflg ##查看操作日志
进阶操作
git checkout && git reset 进阶
git checkout -- <file> ## 丢弃指定文件在该空间下的改变
## 丢弃的是未被放在缓存区的改变
## 修改的是工作区,修改的是最后一次的修改
git reset HEAD <file> ## 将之前添加到暂存区(stage、index)的内容,从暂存区移除到工作区
git checkout 最常见的是用在分支的切换上
git checkout -b test ## 创建并切换到新分支
git checkout master ## 切换到master分支
git checkout commitid ## 检出到指定commitID
分支的改名
git branch -m master master2 ##修改分支master为master2
问题:有修改完的代码:如何切换分支。
如何完成临时保存?
##保存现场
git stash ## 保存当前工作区的所有修改。
git stash save 'message' ##保存到临时保存去。并且加注释
git stash list ## 查看保存区的临时修改
##恢复现场
git stash pop ##将上次的临时保存的工作区取出来,并且将临时保存的分支给删除掉
git stash apply ##将临时工作区的内容取出来,但是不删除临时保存的分支
git stash drop stash@{0} ## 删除指定的保存区的存储内容
标签与diff
标签的基本使用
标签不依赖于分支
轻量级标签
git tag v1.0.1 ## 创建轻量级标签
创建一个带有标注性的标签
git tag -a v1.0.2 -m 'desc message' ##创建带有注释的标签
查看版本库中的所有标签
git tag
git tag -l 'v1,0'
git tag -l '*2'
git tag -1 'v*'
删除标签
git tag -d v1.0.1
git blame 标签的使用
显示上一次对文件修改的作者信息和时间等
git blame <file>
diff标签的使用 (差异性查询)
1.先介绍 Mac自带的diff 比对命令
diff ## 系统自带的命令
diff a b ## 比较文件a 和 b的区别
diff -u a b ## 详细的介绍a和b的区别
diff 属性介绍
--- 原始文件
+++ 目标文件
@@-1,3 +1,3 @@
` ` Hello world ## 没有符号表示两个文件都有的
`-` 表示第一个文件需要删除这一行 就可以生成a
`+`表示第一个文件需要添加的这一行 就可以生成b
所以:- 代表第一行,+ 代表第二行
git diff 命令详解
git diff ## 默认比较:暂存区和工作区的差别
git diff commit_id ## 工作区和特定的commit_id的差别
git diff HEAD ## 工作区与当前分支的最新提交的代码的比较
git diff --cached ## 暂存区和版本库中的比较
git diff --cached commit_id ## 暂存区和版本库中指定版本的比较
也许你现在用觉得学这些没有用,但是是不是了解了这些多的东西,是不是更能扩大你的思维呢?
你觉得没用,可能是因为你没有见过实际的服务器环境
远程与GitHub
push 推送
-
pull 拉取,同时会执行合并merge
- pull ==fetch + merge :先拉取,再合并
远程版本库:GitHub
内网远程版本库:GitLab
GitHub
介绍:开源的社交平台。免费无偿使用,代码需要开源。
推荐:学习好使用GitHub之后,就会发现新的世界
git remote add origin ip.... ## 添加远程地址
git push -u orgin master ## 将本地的master提到远端, 并且 -u 是master与仓库里的关联
远程分支:origin
git branch -a ## 查看分支(包括远端分支)
git branch -av ## 查看分支并显示最后一次commitID
分支,指针,指向commit地址
git status 可以查看当前分支和远端分支的版本对比
本地不能直接对远端分支进行操作,如果切换到远端分支,就是对远端分支所指向的commit点来显示给你。
拉取远程仓库地址:
git clone ...地址
git clone ...地址 新项目名
fast forward : 快进
快进是没有冲突的时候的一种状态
git add的三个功能:
- 将未追踪的文件纳入缓存区
- 将已经被追踪的,修改后的文件,纳入缓存区当中
- 冲突修改完毕之后,使用add 来标记你的冲突已经被解决掉了
冲突解决步骤:
- 拉取代码的时候出现冲突
- 去修改冲突文件
- 使用add指令,标记已经修改冲突完毕
- 使用commit指令,推送你之前的提交和此次commit时候的合并冲突(所以commit完毕之后比master分支要ahead 2个分支)
vi命令:
dd ## 删除一行
:2,4d ## 删除2-4行
vi操作
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
3.跳到第一行的第一个字符:先按两次“g”,
4.跳转到当前行的第一个字符:在当前行按“0”。
GUI(在熟悉Git命令和参数之前,尽量不要使用GUI)
GUI(图形工具)
Gitk(图形工具)
GItHub Desktop (图形工具)
Git合并原则:Git遵循着一个三方合并的原则
CommitID的生成策略是:SHA1
Git别名:
本质:字符串的替代
git config --global alias.br branch ## 使用br代替 branch
存在 ~/.gitconfig 文件里面
常用的:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD'
git config --global alias.ui '!gitk' ## 调用外部命令
git refspec
refspec 本质:本地的分支和远程分支上的对应关系
创建远端分支
新版本
git push --set-upstream origin develop ## 将本地的分支推送到远程,并且建立对应关系
旧版本:
git push -u origin test ## 将本地的推送到远程,并且建立对应关系
创建本地分支和远端分支名字不同的分支
git push --set-upstream origin develop:develop2 ## 源分支:远端分支
上述分支创完远端分支之后,本地分支不能直接push到远端分*个上面
(建议同名)。
git push origin HEAD:develop2
关联远端分支
新版本
git checkout -b develop origin/develop ## 创建一个develop分支追踪远端的develop分支
旧版本:
git checkout --track origin/develop ## 创建一个develop分支追踪远端的develop分支
删除远端分支
旧版本:
git push origin :develop ## 推送一个空的分支到远端分支。
新版本:
git push origin --delete develop ## 删除远端分支
几个重要的点:
git push 的完整写法:git push origin srcBranch:destBranch
pull 操作的完整命令:git pull origin srcBranch:destBranch
HEAD标记:HEAD文件是一个指向你当前所在分支的引用标识符,该文件内部并不包含SHA1值,而是一个指向另外一个引用的指针
当执行git commit 命令时,Git会创建一个commit对象,并且将这个commit对象的parent指针设置为HEAD所指向的引用的SHA-1值
我们对于HEAD修改的任何操作,都会被reflog给记录下来
查看远程HEAD
vi .git/ORIG_HEAD ##查看远程HEAD
vi .git/FETCH_HEAD ##查看拉取的HEAD
远端分支重命名:只能先删除远端分支,然后重新推送远端分支
本地分支:本地远程分支:远程仓库的分支
Git的高级命令(我们常用的所有命令都是高级命令)和底层命令(Git的基础)
底层命令
git symbolic-ref HEAD ## 读取文件的底层命令
git symbolic-ref HEAD refs/heads/develop ##
标签和远程标签
在远端仓库中: released就是代表的标签
git tag ## 查看所有的标签
git tag v1.0 ##创建轻量级标签
git tag -a v2.0 -m 'v2.0 released' ## 创建嗲注释的标签
git show v1.0 ##查看指定标签的信息
git tag -l '?2*' ##模糊查询标签
将标签推到远程仓库
git push ## 默认不会推送标签,只会推送分支
git push origin v1.0 ##推送指定标签到远程
git push origin v1.0 v2.0 v3.0 ##批量推送指定标签
git push origin --tags ## 一次性推送所有的标签
推送标签的完整语法
git push origin refs/tags/v7.0:refs/tags/v7.0
获取远程标签
git pull ##拉取的时候会获取所有的标签
拉取指定标签
git fetch origin tag v7.0 ## 拉取指定的标签
删除远端标签
1. 在远端仓库直接点击删除按钮。
2. 推送一个空的源标签推送到远程,就删除了。(方法和分支类似)
git push origin :refs/tags/v6.0 ##通过本地命令删除远端标签
git push origin --delete tag v5.0 ## 方法2:通过本地命令删除远端标签
git tag -d v5.0 ##删除本地tag标签
-
在缺省情况下,refspec会被git remote add 命令所自动生成。Git会获取远端上refs/heads下的所有引用,并且将他们写到本地的refs/remotes/origin目录下,所以如果远端上有一个master分支。可以通过以下方式去查询远端分支的历史记录。
- git log
- git log origin/master
- git log remotes/origin/master
- git log refs/remotes/origin/master (最全面的写法)
.config文件里面的信息
git fetch = +refs/ ## 这个加号,如果加上是 就算不能快进也可以拉取代码
refs文件 (refspec的缩写),存放的是所有远端分支
关于已经被删除的分支
A 在本地删除远端分支,B 在本地的远端分支还在
B这个时候拉取是不行的,会提示 无法拉取原单分支。
git remote prune ## (裁剪:删除本地多余的 远端分支)
Git gc
git gc
会用的很少,大部分会在底层自动执行
作用:打包,压缩 ,对对象进行压缩
手动执行之后的效果:目录下的refs文件就会都不见了(被压缩到 packed refs文件里面了)
Objects/ 目录:就是每次压缩的时候所存放的目录
关于Git的所有操作和文件,都存放在.git的目录里面
复盘已经学习的
关于删除
使用 git rm
删除文件,包括本地和Git跟踪
使用git rm --cached
删除缓存区的文件,不删除本地文件
删除远端仓库
git remote rm origin ##
git remote show origin ##展示远端仓库信息
关于重命名
关于重命名文件
使用 git mv hello.txt hello2.txt
相当于:
1. mv hello.txt hello.txt
2. git rm hello.txt
3. git add hello2.txt
关于重命名远程仓库
git remote rename origin origin2
Git裸库与submodule
Git裸库
Git 裸库: 没有工作区的仓库(一般在服务器端使用Git裸库)
创建裸库:git init --bare
Submodule 子模块
出现的缘由:开发项目的时候,这个项目依赖于其他项目。需要把子项目的源码也依赖到当前开发的项目当中
添加子模块
git submodule add 子模块的地址 mymodule ## 拉取子模块的代码到 mymodule文件中
添加完之后会自动生成两个文件: .gitmodules 和 mymodule文件夹
此时两个文件就已经相互包含了。在GitHub仓库里面也能够识别。
父项目获取子模块的最新代码
- 进入子模块的目录,执行
git pull
- 直接在父目录,执行
git submodule foreach git pull
子模块修改之后,需要在父模块进行提交子模块的修改
其他人如何克隆
方法一:
- 在使用
git clone
直接克隆父模块的时候,子模块是空的 - 使用
git submodule init
进行初始化 - 递归更新
git submodule update --recursive
- 就OK了。子模块的内容就拉取下来了。
方法二:
使用 git clone 仓库地址 存放地址 --recursive
一步完成
删除子模块
- 没有提供直接的命令去删除。自己使用基本命令去完成。
- 删除暂存区的内容
git rm --cached mymodule
- 删除存在的文件
rm -rf mymodule
- 执行commit~
- 删除没用的
.gitmodule 文件
(步骤同上) - 删除没用的配置文件(步骤同上)
Git subtree
使用git subtree
查询subtree的使用帮助文档
功能和之前介绍的git submodule
一样,但是submodule存在着很致命的弊端。在主工程中修改子工程的代码。可能会造成很多很多的问题。submodule也没有提供删除操作。所以在后续版本中添加了git subtree
git subtree
的使用也比较简单,也很容易的实现父模块和子模块的双向修改。官方推荐使用subtree替换submodule.
如何使用
准备两个仓库,父模块和子模块
添加一个新的远程库。(subtree-origin)
-
添加子模块到父模块:
git subtree add --prefix=subtree subtree-origin master --squash
#功能描述:添加远端仓库`subtree-origin` 的`master分支`到本项目的 `subtree`目录下
#PS:`--squash `合并压缩之前的所有commit为一个。
subtree和submodule的区别
submodule是使用指针指向子模块的目录
subtree是将代码真真正正的放在父模块中
修改子模块之后如何更新
git subtree pull --prefix=subtree subtree-origin master --squash
在父模块修改完子模块之后,如何同时提交两个仓库
- 如果使用
git push
默认只是推送父模块一个项目 - 使用
git subtree psh --prefix=subtree subtree-origin master
推送子模块
遇到问题:最好深入底层的去了解为什么会发生这样的问题,然后解决。
备注:git push --set-upstream origin master
推送当前分支到远端分支
或者:git push -u origin master
推送当前分支到远端分支
vi操作
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
3.跳到第一行的第一个字符:先按两次“g”,
4.跳转到当前行的第一个字符:在当前行按“0”。
深入Git subtree的底层
添加subtree
git subtree add -P subtree subtree-origin master --squash
git subtree add --prefix subtree subtree-origin master --squash
git subttee add --prefix=subtree subtree-origin master --squash
#上述三种方式等价 使用 git subtree查看帮助能够看的到
在子模块修改subtree之后,在父模块获取
(注意:squash 要使用的全局都使用)
git subtree pull -P subtree subtree-origin master --squash
在父模块修改subtree之后,在父模块提交substree
git subtree push -P subtree subtree-origin master
直接push所有的内容到父模块
git push
父模块提交过之后,在子模块修改,再在父模块拉取代码,就会出现冲突
从理解上,应该不会冲突。但是产生冲突了
使用 git status
查看冲突位置
解决冲突,上传。但是会提示什么都没有修改
这时候再去修改subtree项目的文件,push
然后再去父模块拉取代码,这次就会成功了。
问题:为什么有时候会出现冲突?有时候不会出现冲突?
根本原因还在:squash这个参数。
因为使用了squash,导致三方合并的commit记录寻找不到。所以就会出现冲突
但是:squash 不论用不用,在子模块修改完第二次之后,在父模块修改的第一pull就会出现问题。
所以:要么全程都使用squash,要么全程都不使用squash
**substree spilt **
拆分子模块 git substree spilt
之前里面携带的commit记录,也会携带出来
用的不多,也有很多不方便的地方。比如:同时修改了子模块和父模块,是没办法区分子模块的
squash 参数详解
--squash
合并压缩之前的所有commit为一个。
合并压缩之前的所有commit为一个提交。(之前的每个commit记录都会消失)
主仓库中是看不到squash
之前的commit的,所以容易导致出现修改子模块的时候出现问题。
作用:防止subtree的commit记录污染了父模块的记录
引起的问题: 合并commit记录之后,导致三方合并不能够正常进行
为什么使用和不用squash都可能会冲突?(使用图形化界面可以合理的看出来原因)
-
找到冲突的根本原因(合并的时候没有共同的祖先)
三方合并的时候,虽然A B 有一个共同祖先,但是A的上面还有一个祖先。
往上追溯的时候,会发现他们的根本根源是没有交集的。所以在合并的时候不满足三方合并,所以就可能出现冲突。
总结:如果一开始就是用了squash
的话,请一直使用,如果不使用的话,就都不要使用。
学习重要且常见的命令和参数
对于技术的理解越深入,你对其他技术的了解学习的也就越快
张龙老师应该是全网目前将的最系统,最深入,最完整的课程
Git会伴随你的开发生涯。
Git cherry-pick
功能描述:将这个分支上的commit记录,应用到另外一个分支上。很简单但是很有用。
如:develop改了c1,c2, 但是c1 c2 应该上master的。最笨的办法就是手动拷贝出来,然后删除本地的提交,提交在其他地方。
cherry-pick
就是为了解决这种问题而存在的。
主要应用在本地分支上。
语法:
git cherry-pick commitid ## 将指定的commitID的记录,放入到当前分支上。
如果有两个commitid,是否能够直接只截取最后一条,而不是按照之前commit的顺序去提交?
可以,但是会冲突。正常解决冲突就好了。
如果按照顺序,就不会用冲突。
在源分支上的 commit,还是存在的。 使用 checkout去恢复。
充分利用Git提供的解决方案去解决我们的问题
Git rebase原理深度剖析
rebase:变基 (衍合):改变分支的根基
要完成的功能类似于merge的功能,从某种程度上结果相同,但是执行原理完全不同。
在A分支上,执行git rebase B
效果图如上
注意:
- rebase过程中也会出现冲突
- 解决冲突之后,使用
git add
添加,然后执行git rebase --continue
- 接下来Git会继续应用余下的补丁。
- 任何时候都可以通过
git rebase -- abort
命令终止rebase,分支会恢复到rebase到开始前的状态
rebase的最佳实践
不要对master分支执行rebase,否则会引起很多问题
-
一般来说,执行rebase的分支都是自己的本地分支,没有推送到远程版本库
因为如果你已经上传,绝对不要使用git rebase,别人可能已经拉取了你的分支。历史应该是快照,不应该被修改。
rebase是会修改历史记录的。
如果已经合并到远程,请老老实实的使用git merge合并就行。
rebase是先将要变基的内容,以补丁的形式打包。然后添加到指定基础的分支的后面。
在执行git gc的时候,会清理掉补丁。 补丁存放在rebase-apply 目录下
在出现冲突的时候
- 使用 git rebase --skip : 丢弃到当前的补丁:是以 目标分支为准。跳过冲突的部分
- 使用 git rebase --abort: 是取消掉所有的rebase操作。恢复最开始的分支
Git merge:历史发生,就不能修改
Git rebase:历史可以被修改,只显示最好的
所以:视情况而定,因人而异
Intellij IDEA使用详解
- 收费,不要去推广盗版和破解版
- 官网 还有很多其他好用的工具
- 自己使用,熟能生巧
构建基于Gradle的工程
基于groove的脚本语言来编写和配置的
优势:兼容Maven
1.下载 2.配置
文档:很好,涉及了方方面面 点击跳转
DSL:领域特定语言。需要对groove语言有所了解
应用:
- 新建项目
- 配置文件的语法
- 如何使用私服仓库
- 如何添加依赖jar包
- jar包存放位置: ~/gradle
- gradle命令
- groove语法
- Gretty插件(自带Tomcat插件,jetty,热部署等)
Gradle Web工程与Gretty详解
- 自行研究一下 gretty (github )
- 基本使用
- gretty的配置
- 远程调试的概念和使用 (Java调试架构,Tomcat的底层也是Java调试架构)idea-remote
- Java的调试架构 (也可以支持远程调试) 代码和运行环境不在同一台机器上的情况下使用
不要将自己的目光放在你当前的项目组,放眼去望。不要闭门造车
Git、Intellij IDEA与Gradle的整合
- 现成的工程(gradle工程)
- 明确哪些需要放入git,哪些不需要放入git
- build.gradle / setting.gradle / src目录 ,只有这三个需要放进去
- 建议
.gitignore
阿里云ECS详解
ESC(弹性计算服务)
github 服务器在国外,相对慢
gitlab 安装在Linux上面。 阿里云ECS(弹性计算服务)云服务
很多很多的创业型公司,都在使用云服务器,都不会去购买自己的服务器。因为便宜。
官网:www.aliyun.com
购买云服务器
SSH - 连接购买的 Linux系统,(centOS 7 )
Linux服务器的使用
命令操作
Linux学,不要怕,去积累,慢慢学。没别的办法。
GitLab安装与部署以及疑难问题解析
国内大部分公司都在使用GitLab来托管代码
GitLabCE 社区版 (大部分使用这个)
GitLabEE 企业版
- 下载安装 ()
-
安装和配置必要的依赖
- 反向代理
- Redis
- 邮件系统(Postfix, Sendmail)
- curl
- openssh
开启防火墙 HTTP/SSH (在ESC上可能会出现防火墙的问题)
执行脚本的时候,下载GitLab源的时候就会出问题。(需要手动下载rpm文件-对应centos7)
-
然后通过 scp 的方式,将本地下载的GItLab包上传到阿里云的ECS上
- 通过命令,再进行安装
- 配置重启 GitLab
- 修改必要的配置:默认的HTTP的地址,不是IP地址也不是域名地址。
因为中国GMW禁用。
GitLab是Ruby语言写的
访问IP登录。 设置登录限制,是否允许注册等等。
一般内网是不允许自己注册的。
GitLab的功能是非常非常强大的。(项目,用户,组的管理)
GitLab使用详解
- 项目放在Group当中,方便管理
- 其他操作和GitHub相同
- 需要自己搭建一个仓库
- 然后去操作。
- wiki
- 持续集成 Jenkins组件搭配
- Graphs等
Git 回顾总结
30多讲和周边内容的介绍和学习,成为了一个能使用Git进行日常开发和托管-合格的使用人员
本地操作 - 命令行
add mv rm 基本操作
.gitignore 忽略文件
git branch :检出,合并,切换,推拉
git stash:暂存
git remote操作
github
远程协作模型、分支最佳实践
别名,alias设定
GUI工具,git gui, gitk
git refspec : push pull 分支映射的一些操作
.git目录下的文件和作用
git gc
git裸库,submodule ,subtree
git cherry-pick
git rebase
idea
greadle/getty
git/idea/gradle
ECS
gitlab
markdown
gitbook.com (电子书出版领域的标准) Word是最low的方式
自我Git命令汇总
记录自己能够用到的功能的命令
git init ## 初始化仓库
git remote add origin address ##创建远端地址
git remote remove name ## 删除远端地址
git commit -m 'message' ## 提交一次commit
git rm test.txt #删除一个已经存到缓存区的文件
git add . ## 提交一次修改
git reset HEAD test.txt ## 将已经保存到暂存区的内容撤回到工作空间
git branch develop ##创建分支
git checkout develop ##切换分支
git checkout -b new_dev ##创建并切换到Dev
git checkout - ##切换到上一次所在的分支
git config alias.co 'checkout' ## 定义别名
git merge branchname ## 合并指定分支到当前分支
git stash ##将暂时修改未提交的内容,暂存到一个分支
git stash pop ##返回上次暂存的一些内容
git checkout -- test.txt ##将指定文件返回到最初始未修改的状态
git tag ##查看标签
git tag v1.0 ##创建标签
git tag -d v1.0 ##删除指定标签
git checkout v1.0 ##切换到指定标签
git blame <file> ##查看指定文件的修改人员信息详情
.gitignore 文件的配置规则
gitbook的使用