版本管理工具
版本管理工具
当我们多人协同开发,要面临同一个项目的维护,我们希望有 追溯历史版本(包括谁做了什么修改),分工协作(增删改,避免代码冲突和重复),版本管理(发布版本、测试版本等),分支开发 等功能,因此我们使用 版本管理工具,其中最常使用的为git 和 svn:
Git vs. SVN
Git:
- 分布式版本控制系统,每个开发者都可以在本地完整地复制整个代码仓库,并且可以独立地进行开发和版本控制,完整的项目历史和版本信息,进行提交、分支、合并等操作
- 树状结构模型,
- 数据保存在本地主机,
- Git的版本号是全局唯一hash标识
- 有多个远程仓库
- 快照机制保证完整数据(拍照片),备份
- 速度较快
- 轻松地进行分支管理和合并
- 操作命令比较复杂
- 适用于大规模,开源,团队分别在不同的地理位置
SVN:
- 集中式版本控制系统,需要通过中央服务器进行版本控制,每个开发者只能从中央服务器获取代码
- 扁平结构模型,
- 数据保存在中央服务器
- 递增的整数版本号
- 只有一个中央仓库
- 同步到中央服务器,保证完整数据
- 速度较慢
- 分支管理和合并较困难
- 操作命令简单
- 适用于项目较简单,团队成员集中在一个地理位置
svn
Serve
如果想作为管理员需要下载VisualSVN Serve 下载链接
创建repository仓库,右键repositories点create,填写仓库名,
添加用户,设置用户名和密码,其他人用此账户密码登录就可以访问仓库了
设置用户权限,右键repositories点properties属性,点add添加用户,下方选择permissions用户权限,点确定
Client
作为客户需要下载TortoiseSVN 下载链接
如果右键鼠标出现SVN菜单,即安装成功
想要Checkout检出仓库代码,需要获取到仓库URL,通过server上右键仓库,copy url
其余操作省略 ……
Git
前言
工作区->add->暂存区->commit->本地仓库->push->远程仓库
可以把每个版本构建成树型结构,每个提交记录相当于一个节点,有唯一的哈希名,每个新提交记录都作为上一次的子节点,每个分支相当于一个新的枝杈,当向指定分支提交时,会在指定分支新增子节点
初始
init初始化,在指定路径创建一个空的本地仓库
remote set-url <远程名称> <远程仓库URL> 更新本地仓库关联的远程仓库URL远程仓库URL>远程名称>
clone <远程仓库URL> 克隆,将远程仓库完整复制到工作区,包括所有分支和历史记录远程仓库URL>
- git init + git remote add ≈ git clone
常用命令
fetch获取,从远程仓库下载最新数据,但不自动合并到本地分支
- pull = fetch + merge
1
2
3
4
git add . // 添加所有修改
git add -u // 添加已跟踪文件的修改
git add -p // 交互式选择部分修改
git add src/ // 添加指定目录
展开
–version版本
add <文件/目录> 添加,将工作区的更改推送到暂存区
commit -m “提交信息” 提交,将暂存区的修改创建为一个新提交
push <远程名称> <分支名> 推送,将本地提交推送到远程仓库分支名>远程名称>
- push -f <远程名称> <分支名> 强制推送分支名>远程名称>
pull <远程名称> <分支名>拉,从远程仓库拉取分支名>远程名称>
cherry-pick <提交哈希,提交哈希 ……> 将某提交复制到当前的分支下
查看
log查看本地提交记录,以便获取哈希值,按Q退出
status查看暂存区状态
分支:
branch分支,在本地仓库创建一个分支,默认分支是main/master分支,分支指针会指向本分支的最新节点
- git branch -d 删除指定分支
- git branch -f 分支名 + 某个节点 :让分支指针指向另一个提交
撤销:
reset恢复/撤销,把分支指针回退几个提交记录来实现撤销改动
revert 是通过创建一个新的提交来撤销指定提交的更改,更适合团队协作
移动:
HEAD头指针,每次提交后总是指向当前分支上最近一次提交记录
checkout/switch检出,head切换到某分支上/某哈希节点上
^向上移动1 个提交记录
~< num > 向上移动num个提交记录
合并:
merge合并,将指定分支合并到当前分支,并创建一个新的提交记录,它不会破坏历史,但容易造成分支结构十分复杂和紊乱,适合团队协作
1
2
3
4
5
git checkout feature
git rebase main//将feature变基到main
git checkout main
git merge feature//将feature合并到main
git br -d feature//删除feature分支
展开
rebase变基,将当前分支变基到指定分支下,它会自动与指定分支修改整合,它会破坏历史,但分支结构线性清晰,适合一个人开发
- 通常会配合merger使用,因为变基后它只是在rebase上应用了修改,应该将整合的内容合并到目标分支(通常是main分支),从而它包含了最新的版本
- rebase -i +(从当前head结束到指定的节点开始)会展现一个交互对话框,我们可以对提交记录做个排序/删除,将修改后的
Git Extensions
Git Extensions是git的可视化工具,首先在GitHub官网下载安装
设置:
在每次开始运行前都会出现一个setting设置框
Git Extensions->设置源,这里是Git Extensions正常工作所必须的基本设置,红——不正确设置,黄——不推荐设置,绿——正确的设置
git基本设置(用户名,邮箱……)既可以通过Git Extensions中git->设置 可视化去修改,也可以通过git命令行直接更改,两边都可以看到相同的设置更改
此外还包括外观,通用,高级……设置
窗口
上方:
- 开始:
- 创建档案库
- ……
- 档案库:
- 管理远程仓库:可以手动关联远程,包括远程仓库名origin,和url
- 命令:
- 提交,拉取,推送,创建/删除/合并分支……
左侧:
- 查看本地仓库分支,在关联了远程后可以查看远程的分支
- 子模块,标签,暂存
右上:
- 最左侧版本树,根节点在最下方,每新增一个操作,都会向上方创建一个节点,
- 每个节点的右边分别是:操作的记录,用户,时间,哈希值
右下:
- 差异:
- 文件树:节点包含的所有文件
开始使用:(实例)
创建仓库:
- github上创建远程仓库,包括LICENSE,README
- 在GitHub上添加Personal access tokens 个人访问令牌,就可以在Git Extensions上使用GitHub
- 在主界面克隆github版本库:==clone,选择远程的仓库,https协议,选择本地目标文件夹开始拷贝
- 克隆的文件夹内的文件夹和文件都剪切到工作区,把总文件夹删除
- 使用Git Extensions创建本地仓库==init(由于上面已经clone,init就不用执行,并已经remote了),目录选择工作区
分支:
- 创建分支:==branch新建一个自定义名称的分支
- 我们会创建2个分支,名为v1(我们),v2(同事)
- 切换分支:==checkout,通过右键选择分支->切换分支
- 切换到v1
- 修改工作区,新增文件1(当我们切换分支时,工作区的内容也会跟随修改,即仅显示此分支的内容)
提交命令:==commit
- 会打开独立窗口
- 左上展示工作区的修改,选择文件后右上可以看见内容
- 右下在提交前输入提交信息,点击提交
- 提交:可以看到在当前分支上创建了一个新提交记录
推送:
- ==push,上方已经remote了,所以没有任何错误
- 在GitHub上可以看到新增了一个分支,里面包含新的修改,而默认的分支则没有修改
合并:
- 当我们切换到v2分支时,发现工作区并没有文件1
- 选择合并分行:选择要合并到当前分支的那个分支,如果选择单一分支线 == rebase,选择总是建立新的合并提交==merge
推送:
- 将v2推送到远程
- 这样远程中的v2也包含了文件1
合并到主分支:
- 当我们远程切换到master分支时发现不包含文件1
- 切换到master分支,将v1合并到当前分支,再推送
这样远程的3个分支都包含了所有的修改
- 还可以在GitHub上直接拉取合并pull requests可以将分支合并到当前分支上,首先点pull再点merge
用git命令复刻上述流程:
创建仓库:
1
2
……略
git clone < url >
展开
在v1分支修改并推送:
1
2
3
4
5
git branch v1
git checkout v1
git add *
git commit -m"在v1添加了文件1"
git push origin v1
展开
在v2分支合并并推送:
1
2
3
4
git branch v2
git checkout v2
git merge v1
git push origin v2
展开
在master分支合并:
1
……略
展开