一 版本控制
1 基本概念
- 版本控制是管理修改的艺术
- 指对软件开发过程中各种程序代码、配置文件及说明文档等文件的变更管理
- 是软件管理配置的核心思想之一
2 版本控制的好处
- 优雅的备份。本地和服务器均保存备份文件,当文件出现问题时可以通过服务器修复
- 多人并行开发。每个人通过创建属于自己的分支,不影响其他人的操作
- 了解变化内容。提交版本信息时需要加上简单的备注信息,标记本次修改的内容
二 版本控制系统
1 概念
- 是一个记录文件内容变化以便将来查询特定版本修改情况的系统
- 不仅可以应用于软件源代码文件,而且可以对任意类型文件进行版本控制
- 版本库是版本控制系统的核心
2 版本库
- 版本库是版本控制的核心
- 任意数量客户端
- 客户端通过写数据库分享代码
- 典型的客户/服务器系统
![](https://img-blog.csdnimg.cn/505e99a2cf1a45f49a1e5d3fe15e677b.png)
3 分类
集中式版本控制系统
- 开发者之间共用一个仓库(repository)
- 所有操作需要联网
- 软件:CVS 、SVN(Subversion)
分布式吧版本控制系统
- 每个开发者都是一个仓库的完整克隆,每个人都是服务器
- 支持断网操作
- 软件:Git、BitKeeper
三 分布式版本控制 Git
1 简介
- Linux Torvalds 编写
- 是一个开源的分布式版本控制软件
- the stupid content tracker 傻瓜内容跟踪器
- 可以有效、高速的处理从很小到非常大的项目版本控制
2 Linux安装
#安装中文支持(选做)
[root@Programer ~]# echo $LANG #查看当前系统语言及编码
en_US.UTF-8
[root@Programer ~]# yum -y install langpacks-zh_CN.noarch #安装中文支持
[root@Programer ~]# vim /etc/locale.conf #配置系统使用中文及编码
[root@Programer ~]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
[root@Programer ~]# reboot #重启使语言配置生效
[root@Programer ~]# echo $LANG #确认使用中文编码
zh_CN.UTF-8
[root@Programer ~]#
#yum源中集成了Git软件包,使用yum安装Git
[root@Programer ~]# yum clean all; yum repolist -v #插件yum源是否可用
...
Total packages: 8,265
[root@Programer ~]# yum -y install git #使用yum安装Git
...
Complete!
[root@Programer ~]# git --version #查看Git版本
git version 2.31.1
[root@Programer ~]# git --help #查看Git命令帮助信息
3 Git 基础概念
- 工作区(Workspace):存放从仓库提取出来的文件的地方,放在磁盘上供你使用或修改。
- 暂存区(Index/Stage):就是一个文件,索引文件,保存了下次将提交的文件列表信息
- 仓库(Local Repository):保存所有数据的地方,这里面有提交的所有版本的数据
- 远程仓库(Remote Repository):托管代码的地方,可供其他人浏览、下载代码的服务器
4 Git工作流程
![](https://img-blog.csdnimg.cn/59f088d726614a2facbb13a1ae754e2d.png)
5 Git 常用子命令
- config |
修改Git配置 |
- init |
初始化本地仓库 |
- add |
添加修改到暂存区 |
- commit |
提交修改到本地仓库 |
- status |
查看当前状态 |
- clone |
将远程服务器的仓库克隆到本地 |
- push |
提交修改带远程服务器 |
6 Git基础配置
#Git基础配置
# --local: 仓库级
# --global: 全局级
# --system: 系统级
[root@Programer ~]# git config --global user.name mark #设置用户名
[root@Programer ~]# git config --global user.email mark@tedu.cn #设置用户邮箱
[root@Programer ~]# git config --global init.defaultBranch master #设置版本库默认分支
[root@Programer ~]# git config --list #查看已有Git配置
user.name=mark
user.email=mark@tedu.cn
init.defaultbranch=master
[root@Programer ~]# cat ~/.gitconfig #查看Git配置持久化文件
[user]
name = mark
email = mark@tedu.cn
[init]
defaultBranch = master
[root@Programer ~]#
7 Git创建版本库
#使用Git命令初始化空版本库
[root@Programer ~]# ls
[root@Programer ~]# git init myproject #初始化空版本库
已初始化空的 Git 仓库于 /root/myproject/.git/
[root@Programer ~]# ls #确认版本库已创建
myproject
[root@Programer ~]# ls -a myproject/
. .. .git
[root@Programer ~]# ls -a myproject/.git/
. .. branches config description HEAD hooks info objects refs
[root@Programer ~]#
#将已有目录制作成Git版本库
[root@Programer ~]# mkdir mytest #创建空目录
[root@Programer ~]# ls -a mytest/
. ..
[root@Programer ~]# cd mytest/
[root@Programer mytest]# git init #将已有目录制作成Git版本库
已初始化空的 Git 仓库于 /root/mytest/.git/
[root@Programer mytest]# ls -a
. .. .git
[root@Programer mytest]# ls -a .git/
. .. branches config description HEAD hooks info objects refs
[root@Programer mytest]# cd
[root@Programer ~]#
8 Git版本库操作
#熟悉Git基础命令使用
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git status #查看Git本地仓库状态
位于分支 master
尚无提交
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
[root@Programer myproject]# echo "Learning Git" >> readme.md #创建readme文件
[root@Programer myproject]# git status #查看Git本地仓库状态
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
readme.md
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@Programer myproject]# git add readme.md #将文件信息添加到暂存区
[root@Programer myproject]# git status #查看Git本地仓库状态
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: readme.md
[root@Programer myproject]# git commit -m "add readme" #将暂存区文件提交到本地仓库
[master(根提交) 09d8603] add readme
1 file changed, 1 insertion(+)
create mode 100644 readme.md
[root@Programer myproject]# git status
位于分支 master
无文件要提交,干净的工作区
[root@Programer myproject]#
9 Git版本库查询
#查看本地Git版本库信息
[root@Programer myproject]# git log #本地版本库提交记录(详细)
commit 09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master)
Author: mark <mark@tedu.cn>
Date: Wed Feb 22 15:00:46 2023 +0800
add readme
[root@Programer myproject]# git log --pretty=oneline #本地版本库提交记录(简略)
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master) add readme
[root@Programer myproject]# git log --oneline #本地版本库提交记录(极简)
09d8603 (HEAD -> master) add readme
[root@Programer myproject]#
10 Git练习(生成多个版本)
#数量掌握Git本地版本库操作
[root@Programer ~]# cd myproject/
[root@Programer myproject]# echo 123 > test.txt #新建test.txt文件
[root@Programer myproject]# git add test.txt #将test.txt添加到暂存区
[root@Programer myproject]# git commit -m "add test.txt" #生成新版本
[master 27466f7] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
[root@Programer myproject]# echo 456 > test.txt #修改test.txt文件
[root@Programer myproject]# git add . #将修改文件添加到暂存区
[root@Programer myproject]# git commit -m "modify test.txt" #生成新版本
[master 58cdf79] modify test.txt
1 file changed, 1 insertion(+), 1 deletion(-)
[root@Programer myproject]# echo 789 > test.txt #修改test.txt文件
[root@Programer myproject]# git add ./ #将修改文件添加到暂存区
[root@Programer myproject]# git commit -m "done test.txt" #生成新版本
[master 0f44bf0] done test.txt
1 file changed, 1 insertion(+), 1 deletion(-)
[root@Programer myproject]# git log --pretty=oneline #查看本地提交记录(简略)
0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt
58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt
27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme
[root@Programer myproject]# git log --oneline #查看本地提交记录(极简)
0f44bf0 (HEAD -> master) done test.txt
58cdf79 modify test.txt
27466f7 add test.txt
09d8603 add readme
[root@Programer myproject]#
四 Git指针
1 HEAD指针概念
- HEAD 指针是一个可以在任何分支和版本移动的指针
- 通过移动指针我们可以将数据还原至任何版本
2 Git指针操作
#使用git log命令查看HEAD指针
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git log --pretty=oneline #查看Git指针
0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt
58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt
27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme
[root@Programer myproject]# cat test.txt #查看文件内容
789
[root@Programer myproject]#
#reset子命令用于版本还原
#--soft:缓存区和工作目录不受影响。reset后分支和HEAD指针移动到指定的commit,代码文件内容和reset之前一样,修改部分已加入到暂存区。通常用于重新提交。
#--mixed:(默认)工作目录不受影响。reset后分支和HEAD指针移动到指定位置,代码文件内容和reset之前一样,修改部分未加入到暂存区。(需要重新执行git add)
#--hard:工作目录,缓存区均受影响。reset后分支和HEAD指针移动到指定commit,代码文件内容回退到指定commit,工作空间为clean状态。通常用于获取指定版本的代码文件
[root@Programer myproject]# git reset --hard 58cdf7905a #还原到指定版本
HEAD 现在位于 58cdf79 modify test.txt
[root@Programer myproject]# git log --oneline #确认HEAD指针移动
58cdf79 (HEAD -> master) modify test.txt
27466f7 add test.txt
09d8603 add readme
[root@Programer myproject]# cat test.txt #查看文件内容
456
[root@Programer myproject]#
五 Git 分支
1 分支的基本概念
- 分支可以让开发分多条主线同时进行,每条主线互不影响
- 按功能模块分支,按版本分支
- 分支也可以合并
![](https://img-blog.csdnimg.cn/7e66a80233a845bda6c46252bb845a50.png)
2 常见的分支规范
MASTER分支(MASTER是主分支,是代码的核心)
DEVELOP分支(DEVELOP分支最新开发成果的分支)
RELEASE分支(为发布新产品设置的分支)
HOTFIX分支(为了修复软件BU缺陷的分支)
FEATURE分支(为开发新功能设置的分支)
3 Git分支操作
#查看当前分支信息,branch子命令
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git status #查看本地Git仓库信息
位于分支 master
无文件要提交,干净的工作区
[root@Programer myproject]# git branch -v #查看分支信息
* master 0f44bf0 done test.txt
[root@Programer myproject]#
#创建分支
[root@Programer myproject]# git branch hotfix #创建hotfix分支
[root@Programer myproject]# git branch feature #创建feature分支
[root@Programer myproject]# git branch -v #查看分支信息
feature 0f44bf0 done test.txt
hotfix 0f44bf0 done test.txt
* master 0f44bf0 done test.txt
[root@Programer myproject]#
#切换分支,checkout子命令
[root@Programer myproject]# git branch -v #查看分支信息
feature 0f44bf0 done test.txt
hotfix 0f44bf0 done test.txt
* master 0f44bf0 done test.txt
[root@Programer myproject]# git checkout hotfix #切换分支
切换到分支 'hotfix'
[root@Programer myproject]# git branch -v #查看分支信息
feature 0f44bf0 done test.txt
* hotfix 0f44bf0 done test.txt
master 0f44bf0 done test.txt
[root@Programer myproject]# git checkout feature #切换分支
切换到分支 'feature'
[root@Programer myproject]# git branch -v #查看分支信息
* feature 0f44bf0 done test.txt
hotfix 0f44bf0 done test.txt
master 0f44bf0 done test.txt
[root@Programer myproject]#
#删除分支
[root@Programer myproject]# git branch develop #创建develop分支
[root@Programer myproject]# git branch -v
develop 0f44bf0 done test.txt
* feature 0f44bf0 done test.txt
hotfix 0f44bf0 done test.txt
master 0f44bf0 done test.txt
[root@Programer myproject]# git branch -d develop #删除develop分支
已删除分支 develop(曾为 0f44bf0)。
[root@Programer myproject]#
#无冲突分支合并
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git checkout hotfix #切换到hotfix分支
切换到分支 'hotfix'
[root@Programer myproject]# echo haha > haha.txt #创建haha文件
[root@Programer myproject]# git add ./ #添加haha到暂存区
[root@Programer myproject]# git commit -m "add haha.txt" #生成新版本
[hotfix 108cf46] add haha.txt
1 file changed, 1 insertion(+)
create mode 100644 haha.txt
[root@Programer myproject]# ls
haha.txt readme.md test.txt
[root@Programer myproject]# cat haha.txt
haha
[root@Programer myproject]# git checkout master #切换到master分支
切换到分支 'master'
[root@Programer myproject]# echo xixi > xixi.txt #创建xixi文件
[root@Programer myproject]# git add ./ #添加xixi到暂存区
[root@Programer myproject]# git commit -m "add xixi.txt" #生成新版本
[master 32f0842] add xixi.txt
1 file changed, 1 insertion(+)
create mode 100644 xixi.txt
[root@Programer myproject]# ls
readme.md test.txt xixi.txt
[root@Programer myproject]# git branch -v #切换到master分支
feature 0f44bf0 done test.txt
hotfix 108cf46 add haha.txt
* master 32f0842 add xixi.txt
[root@Programer myproject]# git merge hotfix #合并hotfix分支到master分支
Merge made by the 'recursive' strategy.
haha.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 haha.txt
[root@Programer myproject]# ls #确认文件
haha.txt readme.md test.txt xixi.txt
[root@Programer myproject]# cat haha.txt
haha
[root@Programer myproject]# cat xixi.txt
xixi
[root@Programer myproject]#
#有冲突分支合并(修改不同分支中相同文件的相同行)
[root@Programer myproject]# git branch -v #查看分支
feature 0f44bf0 done test.txt
hotfix 108cf46 add haha.txt
* master b4bea28 Merge branch 'hotfix' 合并hotfix分支
[root@Programer myproject]# git checkout hotfix #切换到hotfix分支
切换到分支 'hotfix'
[root@Programer myproject]# echo "hahaha" > a.txt #创建a.txt文件
[root@Programer myproject]# git add . #添加到暂存区
[root@Programer myproject]# git commit -m "hotfix" #生成新版本
[hotfix af8a04b] hotfix
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@Programer myproject]# git checkout master #切换到master分支
切换到分支 'master'
[root@Programer myproject]# echo "xixixi" > a.txt #创建a.txt
[root@Programer myproject]# git add . #添加到暂存区
[root@Programer myproject]# git commit -m "master" #生成新版本
[master f556200] master
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@Programer myproject]# git merge hotfix #合并hotfix分支到master分支
冲突(add/add):合并冲突于 a.txt
自动合并 a.txt
自动合并失败,修正冲突然后提交修正的结果。 #文件冲突,合并失败,手工解决
[root@Programer myproject]# cat a.txt
<<<<<<< HEAD
xixixi
=======
hahaha
>>>>>>> hotfix
[root@Programer myproject]# vim a.txt #手工解决冲突
[root@Programer myproject]# cat a.txt
xixixi
hahaha
[root@Programer myproject]# git add ./ #添加到暂存区
[root@Programer myproject]# git commit -m "resolv conflict" #生成新版本,解决冲突
[master 2a6f272] resolv conflict
[root@Programer myproject]#
4 分支与HEAD指针的关系
- 创建分支的本质是在当前提交上创建一个可以移动的指针
- 根据HEAD这个特殊指针来判断当前分支
![](https://img-blog.csdnimg.cn/883ce1a4f5b04fae8239072394722ac6.png)
5 多分指提交的流程
![](https://img-blog.csdnimg.cn/5b7919f909cd43cab02aacdaf28c0950.png)
![](https://img-blog.csdnimg.cn/58dca27312d5482bbd668fd492f68cfd.png)
![](https://img-blog.csdnimg.cn/e9d59896d7eb4744b612e609f4708cec.png)
![](https://img-blog.csdnimg.cn/20bb6156cbb44ca299fa57957b1d54ae.png)
六 TAG标签
1 概念
- 标签用于标记某一提交点,唯一绑定一个固定的commitld
- 相当于为这次提交记录指定一个别名,方便提取文件
- 可以为重要的版本打上标签,标签可以是一个对象,也可以是一个简单的指针,但是指针不会移动
2 Git标签操作
#使用tag子命令管理标签
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git tag #查看已有标签
[root@Programer myproject]# git tag v1 #创建v1标签
[root@Programer myproject]# git tag #查看已有标签
v1
[root@Programer myproject]# git tag v2 #创建v2标签
[root@Programer myproject]# git tag #查看已有标签
v1
v2
[root@Programer myproject]# git tag -d v2 #删除v2标签
已删除标签 'v2'(曾为 2a6f272)
[root@Programer myproject]#