1、版本库
典型的客户/服务器系统 - 版本库是版本控制的核心 - 任意数量客户端 - 客户端通过写数据库分享代码
2、分布式版本控制
二、常用软件 1、版本控制软件
1. 集中式版本控制系统 - 开发者之间共用一个仓库(repository) - 所有操作需要联网 2. 分布式版本控制系统 - 每个开发者都是一个仓库的完整克隆,每个人都是服务器 - 支持断网操作 3. Git基本概念 - Git仓库: 保存所有数据的地方 - 工作区: 从仓库提取出来的文件,放在磁盘上供你使用或修改 - 暂存区: 就是一个文件,索引文件,保存了下次将提交的文件列表信息 4. 工作流
三、Git软件 1、安装Git软件
1. 集中式版本控制软件 - CVS - SVN(Subversion) 2. 分布式版本控制软件 - Git - BitKeeper(收费)
[root@git ~]# yum -y install git #安装Git [root@git ~]# git --version #查看版本2、创建服务器版本仓库
[root@git ~]# mkdir -p /var/lib/git/ [root@git ~]# git init /var/lib/git/project --bare #初始化空仓库 Initialized empty Git repository in /var/lib/git/project/ [root@git ~]# ls /var/lib/git/project/ branches config description HEAD hooks info objects refs3、客户端命令行工具及案例 1. 客户端的子命令
2. clone克隆服务器仓库到本地
git 支持的子命令操作 clone 将远程服务器的仓库克隆到本地 config 修改git配置 add 添加修改到缓存区 commit 提交修改到本地仓库 push 提交修改到远程服务器 pull 将服务器上的数据更新到本地
[root@develop ~]# yum -y install git #客户端安装git [root@develop ~]# git clone root@192.168.5.111:/var/lib/git/project #克隆仓库到本地 Cloning into 'project'... root@192.168.5.111's password: #输入密码' warning: You appear to have cloned an empty repository. [root@develop ~]# ls #查询仓库是否克隆 anaconda-ks.cfg project [root@develop ~]# cd project/ [root@develop project]# ls [root@develop project]# git remote -v #查看服务器信息 origin root@192.168.5.109:/var/lib/git/project (fetch) origin root@192.168.5.109:/var/lib/git/project (push)3. config修改git配置(客户端用户标记信息(与Git账户和密码无关))
[root@develop project]# git config --global user.email "you@example.com" [root@develop project# git config --global user.name "caixm" [root@develop project]# cat ~/.gitconfig [user] email = you@example.com name = caixm4. 导入数据,add提交本地暂存区(必须进入p工作目录project操作)
[root@develop project]# echo "hello world" > test.txt #编写新文件 [root@develop project]# mkdir demo #创建目录 [root@develop project]# cp /etc/hosts demo/ #拷贝文件至目录 [root@develop project]# git status #查看本地仓库中数据的状态 # On branch master # # Initial commit # # Untracked files: # (use "git add5. commit提交本地仓库..." to include in what will be committed) # # demo/ # test.txt nothing added to commit but untracked files present (use "git add" to track) [root@client project]# git add . #将工作区的修改提交到暂存区
[root@client project]# git commit -m "new files and directories" #提交本地仓库,并添加注释 [master (root-commit) ba6fc2b] new files and directories # 2 files changed, 3 insertions(+) create mode 100644 demo/hosts create mode 100644 test.txt [root@develop project]# git status # On branch master nothing to commit, working directory clean6. push将本地修改提交到远程服务器仓库
push.default 定义如何推送(更安全地推送) [root@develop project]# git config --global push.default simple #定义推送方式 [root@develop project]# git remote -v #查看远程服务器信息 origin root@192.168.5.109:/var/lib/git/project (fetch) origin root@192.168.5.109:/var/lib/git/project (push) [root@develop project]# git push origin #将数据推送至origin服务器 [root@develop project]# git push #推送 root@192.168.5.111's password: #输入服务器root密码' Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (5/5), 361 bytes | 0 bytes/s, done. Total 5 (delta 0), reused 0 (delta 0) To root@192.168.5.111:/var/lib/git/project * [new branch] master -> master [root@develop project]# git status #查询是否有新增内容 # On branch master nothing to commit, working directory clean7.pull 从远程下载
[root@develop project]# git pull #将服务器上的数据更新到本地8. log 查看历史日志
[root@client project]# git log #查看日志 commit ba6fc2bb96b89c9daced11a1933043aeea77ed6d Author: caixm4、HEAD指针 1. HEAD指针概述Date: Tue May 31 19:14:40 2022 +0800 new files and directories [root@client project]# git log --pretty=oneline ba6fc2bb96b89c9daced11a1933043aeea77ed6d new files and directories [root@client project]# git reflog #方便后期回滚数据 ba6fc2b HEAD@{0}: commit (initial): new files and directories
2. 移动HEAD指针①. HEAD指针是一个可以在任何分支和版本移动的指针
②. 通过移动指针可以将数据还原至任何版本
5、Git分支 1. 分支的基本概念①.使用log指令查看版本信息
[root@develop project]# git log --pretty=oneline d098a04602b1ea928af9c6b5619e31346eed9fa8 new files and directories②. 回滚到d098a这个版本
[root@develop project]# rm -rf demo/ init.txt #删除数据 [root@develop project]# ls [root@develop project]# git reset --hard d098a #回滚到指定版本 HEAD is now at d098a04 new files and directories [root@develop project]# ls #资料已还原 demo init.txt
2. 管理多分支
①. 分支可以让开发分多条主线同时进行,每条主线互不影响 - 按功能模块分支、按版本分支 - 分支也可以合并 ②. 常见的分支规范 - MASTER分支(MASTER是主分支,是代码的核心) - DEVELOP分支(DEVELOP最新开发成果的分支) - RELEASE分支(为发布新产品设置的分支) - HOTFIX分支(为了修复软件BUG缺陷的分支) - FEATURE分支(为开发新功能设置的分支)
3. 分支与HEAD指针的关系①. 查看当前分支
[root@develop project]# git branch -v * master d098a04 new files and directories②. 创建分支
[root@develop project]# git branch hotfix #创建hotfix分支 [root@develop project]# git branch feature #创建feature分支 [root@develop project]# git branch -v feature d098a04 new files and directories hotfix d098a04 new files and directories * master d098a04 new files and directories #当前所处分支③. 切换分支
[root@develop project]# git checkout hotfix #切换到hotfix分支 Switched to branch 'hotfix' [root@develop project]# git branch -v feature d098a04 new files and directories * hotfix d098a04 new files and directories #*号代表当前所处分支 master d098a04 new files and directories 在新的分支上就可以继续修改代码 - 修改文件、创建文件等操作 - 正常add,commit提交版本库④. 合并分支(合并前一定要切换至主分支)
[root@develop project]# git checkout master #切换至主分支 Switched to branch 'master' [root@develop project]# git merge hotfix #合并分支 Already up-to-date.⑤. 解决分支冲突
[root@develop project]# git checkout hotfix #切换至hotfix分支 Switched to branch 'hotfix' [root@develop project]# vim a.txt #内容aaa [root@develop project]# git add a.txt #修改文件并提取 [root@develop project]# git commit -m "hotfix" [hotfix bf7d1ec] hotfix 1 file changed, 1 insertion(+) create mode 100644 a.txt [root@develop project]# git checkout master #切换至主分支 Switched to branch 'master' [root@develop project]# vim a.txt #内容bbb [root@develop project]# git add a.txt [root@develop project]# git commit -m "hotfix" [master e342f4c] hotfix 1 file changed, 1 insertion(+) create mode 100644 a.txt [root@develop project]# git merge hotfix #合并时冲突 Auto-merging a.txt #自动合并a.txt CONFLICT (add/add): Merge conflict in a.txt #合并冲突于a.txt Automatic merge failed; fix conflicts and then commit the result. #自动合并失败,修正冲突然后提交修正的结果 [root@develop project]# cat a.txt <<<<<<< HEAD bbb ======= aaa >>>>>>> hotfix [root@develop project]# vim a.txt #修改冲突文件:改为aaa或者bbb [root@develop project]# git add . [root@develop project]# git commit -m "resolve" [master 482b72d] resolve
创建分支的本质是在当前提交上,创建一个可以移动的指针 - 根据HEAD这个特殊的指针判断当前分支 - 切换分支,只是移动HEAD指针 - 其它分支的提交,不会影响master;master分支提交也不影响其它分支



