一、集中式版本控制工具SVN
集中式版本控制工具,版本库是集中存放在中央服务器的,团队里每个人工作时从中央服务器下载代码(必须联网才能工作,局域网或互联网)。个人修改完后然后提交到中央版本库。
- 缺点:版本库集中在一个服务器,发生宕机或磁盘损坏,会造成版本丢失等问题,容灾性差
二、分布式版本控制工具Git
Git
是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git
是LinusTorvalds
为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。大神就是大神。
2.1 工作原理
Git
是分布式的,并不需要有中心服务器,因为我们每台电脑拥有的东西都是一样的。Git
之所以有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC
是一样的。我们可以把它当做一个开发者的PC
,是 为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。
Git工作流程图:
2.2 安装
安装完成后(windows),在任一目录下鼠标右键会多出如下选项:
2.3 基本配置
在安装完成后首先要做的事情就是设置用户名称
和email
地址,Git
提交需要使用这些信息。
- 打开Git Bash
- 设置用户信息
查看用户信息git config--global user.name "username" git config--global user.email "test@email.com"
git config--global user.name git config--global user.email
2.3.2为常用指令配置别名
有些常用指令参数非常多,每次都要输入很多参数,可以使用别名简化操作:
① 打开用户目录(C盘下的用户目录如C:\Users\lisa
),创建.bashrc
文件
touch .bashrc
② 在.bashrc
文件中输入别名配置内容,例如:
#用于输出g1t提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
a1ias ll='ls-al"
③ 使用这个配置文件
打开GitBash
(随便哪个目录),执行命令
source C:/Users/lisa/.bashrc
④ 解决GitBash乱码问题(其中一种方案)
打开GitBash
执行命令:
git config --global core.quotepath false
然后在${git home}/etc/bash.bashrc
文件最后加入下面两行
export LANG=zh_CN.UTF-8"
export LC_ALL=zh_CN.UTF-8"
2.4 获取本地仓库
要使用Git
对代码/目录进行版本控制,首先需要创建本地仓库:
- 在电脑的任意位置创建一个空目录(例如test)或者使用已目录作为我们的本地
Git
仓库 - 进入这个目录中,点击右键打开
GitBash
窗口 - 执行命令
git init
,把当前目录初始化为一个git
仓库 - 创建成功后可在文件夹下看到一个隐藏的.git目录
2.5 基础操作指令
2.5.1 add、commit、status
Git
工作目录下对于文件的增删改会存在几个状态,这些修改的状态会随着我们执行Git
的命令而发生变化。
git add
工作区 → 暂存区
通常用git add 文件名
git add .
一次性把所有文件加入缓存区(.
是通配符,表示当前目录所有文件)git commit
暂存区 → 本地仓库git commit -m "备注信息"
- git status 查看状态
2.5.2 log查看提交日志
命令格式:git log [option]
option:
–all 显示所有分支
–pretty=oneline 将提交信息显示为一行
–abbrev-commint 使输出的commitid更简短
–graph 以图形形式显示
2.5.3 版本回退
命令形式:
gir reset --hard 提交版本
当回退完成后,HEAD
指针(版本指针)就指向了回退版本。
注意,这个时候再用git log
指令查看日志他就只显示到你回退的版本:
例:
回退到上一个版本[当前版本(已经提交)的上一个版本],删除工作区和缓存区的修改
git reset --hard HEAD^
回退到当前版本(没提交前的版本) , 删除工作区和缓存区的修改
git reset --hard HEAD
拓展:reflog 回退日志
如果你又想回退到之前哪个版本,只要你记得版本号,是可以的:
如果刚好你忘了那个版本号,还可以通过查看回退日志找回来:
回退日志指令:git reflog
2.5.4 忽略文件
一般我们总会有些文件无需纳入Gt的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore
的文件(文件名称固定),列出要忽略的文件名或文件类型。
- 创建记录文件
touch .gitignore
- 在记录文件里列出想要忽略的文件
可以是文件名,也可以是通配符
其他的一些例子:
# 忽略.a结尾的文件
*.a
# lib.a 这个文件例外
!lib.a
# 忽略当前目录下的TODO文件,不包括 子目录下的TODO文件
/TODO
# 忽略 build 目录下的所有文件
build/
# 忽略 doc 目录下 .txt 后缀的文件,但不包括 doc/server目录下的 .txt 后缀的文件
doc/*.txt
# 忽略 doc 目录下所有.pdf后缀的文件
doc/**/*.pdf I
2.6 分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
2.6.1 分支操作
-
查看分支列表
git branch
-
创建分支
git branch 分支名
-
切换分支
git checkout 分支名
-
创建并切换分支
git checkout -b 新分支名
-
合并分支
git merge 分支名
例如把
dev01
分支合并到master
分支,首先切换到主分支git checkout master
然后执行合并指令,把
dev01
分支合并到当前分支(master
)git merge dev01
- 在命令行操作合并会出现vi编辑器,
Esc
+:
+wq
保存就行。 - 一般都是把其他分支合并到主分支。
- 在命令行操作合并会出现vi编辑器,
-
删除分支
删除分支,需要做各种检查git branch -d 分支名
不做任何检查,强制删除分支
git branch -D 分支名
- 不能删除当前分支,只能删除其他分支
- 基于
master
分支创建一个dev
分支,在dev
没有合并到master
分支的前提下,用git branch -d dev
去删除dev
分支,git
会认为你是误操作,提示错误。这个时候就需要用-D
来强制删除。
-
解决冲突
如果master
分支和dev
分支都修改了同一个文件的同一行,要把dev
分支合并到master
分支的时候,就会发生冲突:
这个时候如果打开冲突文件,就会发现里面的内容变了,git把两个分支的冲突内容都写到了冲突文件上让你做取舍:
然后根据需要手动修改,去掉git
自动给你添加的那些指示符,保留或改成你想要的,如:
保存,然后再次add
→commit
→merge
即可。<<<<<<<<HEAD
与========
之间的内容属于当前分支
========
与>>>>>>>>dev
之间的内容属于dev分支
2.6.2 分支使用原则
- master 分支:一般作为主分支、线上分支。中小规模项目作为线上运行的应用对应的分支。
- develop 分支:是从
master
创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。 - feature/xxx分支:从
develop
创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop
分支。 - hotfix/xxxx分支:从
master
派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master
、test
、develop
分支。 - 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。
三、Git远程仓库
常见远程仓库:
Github
:国外的公开的代码托管平台。Gitee
:国内的公开的代码托管平台。Gitlab
:基于git
的开源项目,用于搭建私服。
企业常用Gitlab
,因为Github
和Gitee
平台都部署在别人的服务器中,而Gitlab
是一个开源项目,可以在自己的服务器中搭建git
私服,保证安全。
3.1 创建远程仓库
在Gitee
中创建一个远程仓库,过程省略。
3.2 配置SSH公钥
-
在本地
GitBash
中生成SSH公钥ssh-keygen -t rsa
一路回车自动生成,如果公钥已经存在则自动覆盖,如下
-
获取生成的公钥(也是在
GitBash
中操作)cat ~/.ssh/id_rsa.pub
如下:
-
在
Gitee
上配置公钥
-
回到本地验证配置是否成功
ssh -T git@gitee.com
3.3 推送
- 复制仓库地址,这里用的
ssh
的地址
- 本地关联远程仓库
git remote add origin 远程仓库地址
仓库名默认是
origin
,也可以自定义。 - 查看远程仓库列表,看看是否关联成功
git remote
- 推送仓库
git push origin master
- 完整命令是:
git push [-f] [--set-upstream] [远端名称] [本地分支名][:远端分支名]
- -f: 表示强制覆盖远程分支的代码,一般危险
- –set-upstream: 推送的同时建立本地分支与远端分支的关联关系,建立了关联在下次推送时就不用写本地分支名和远端分支名,直接
git push
,一般不用。可以通过git branch -vv
命令可以查看分支的关联关系。 - 当远端分支名和本地分支名相同时可以忽略远端分支名
push origin master
表示把master
分支推送到远程的origin
仓库
- 完整命令是:
3.4 从远程仓库克隆
把远程仓库克隆到本地。
git clone <仓库路径> [本地目录]
本地目录可以省略,会自动根据仓库名生成一个同名目录
3.5 从远程仓库中抓取和拉取
远程分支和本地的分支一样,我们可以进行merge
操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
3.5.1 抓取fetch
抓取指令就是将远程仓库里指定分支的更新都抓取到本地,但不会自动进行合并。
git fetch [remote name][branch name]
如果不指定远端名称和分支名,则抓取所有分支。
3.5.1 拉取pull
拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch
+merge
。
git pull [remote name][branch name]
- 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
3.5.2 解决合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支,如下图所示。
养成习惯,在
push
推送之前先pull
一下
四、git 在 idea 中的使用
4.1 配置git安装位置
4.2 初始化git仓库
打开一个项目
4.3 添加、提交
提交过程可能会因为idea的代码检查比较慢,确认提交等待完成即可。
4.4 git log提交日志
4.5 推送
首次推送还没配置远程仓库地址会让你配置
配置完就可以推送了
4.6 从远程仓库克隆
如果本地没有项目代码,需要从远程仓库克隆
然后配置仓库地址和本地仓库目录
idea就自动把仓库克隆下来并打开。
4.7 解决代码冲突
记得每次推送代码前pull一下,默认选项就行。
如果代码有冲突,那么会弹出提示,提示那个文件冲突了
此时可以选择点击Merge
选项,他会自动打开冲突文件让你修改。或者关掉这个提示窗口,在旁边的项目目录中冲突文件会变成红色,直接打开修改也行。
修改完这个文件还是红色的,说明idea
把冲突文件移出了工作区,这时直接提交会提示错误,先手动add
一下这个文件再提交。
之后就是正常提交推送即可。
4.8 创建分支
方式一
方式二
推荐使用方式二,以为可以很直观的选择基于哪个提交版本创建分支
巧用git log 窗口很有用
4.9 分支合并
在分支栏直接操作:
首先把需要合并的本地分支提交到本地仓库,注意是commit
不是push
然后把需要合并到的分支拉到本地:
把需要合并到的分支 check out
到本地
然后切换到需要合并到的分支(如果是从远程 check out 的就已经切换了)
然后就可以合并了
合并完,推送前要 pull
一下,保证代码是最新的版本
然后就可以推送到远程仓库了
参考资料:哔哩哔哩-黑马程序员-黑马程序员Git全套教程,完整的git项目管理工具教程,一套精通git
https://www.bilibili.com/video/BV1MU4y1Y7h5?p=2&share_source=copy_web