# 版本管理
# 版本管理的概念及发展
# 概念
- 为满足不同需求,对同一产品或系统的变更情况进行记录、跟踪、维护和控制的过程.
- 主要功能需满足:
- 操作需授权
- 版本向上升级
- 加锁避免互斥
- 不同源程序比较功能
# 发展
- 1972,SCCS,第一款版本管理工具,只用于Unix系统
- 1982,RCS,第一款本地版本管理工具,引入了“锁”概念
- 1986,CVS,第一款集中式版本管理工具
- 2000,SVN,至今最强大的集中式版本管理工具,首创使用“分支”
- 2002,BitKeeper,第一款分布式版本管理工具,对Git的诞生有关键性作用
- 2005,Git,最强大的版本管理工具,作者是Linux之父
# 主流的版本管理模型
- 线性版本管理模型
- 树形版本管理模型
- 有向无环图版本管理模型
# svn版本管理
- 集中式版本管理工具,比较拉跨
- 使用体验,便捷度,开源社区各方面赶不上git
# git版本管理
# 唯一缺陷
- 由于其诞生于开源社区,存在权限管理的薄弱
# 常见的git仓库
- github
- gitee
- gitlab(自建)
# git工作模式

# git合并命令
git branch
git checkout develop
git checkout master
git merge origin/develop
#解决时的冲突:
git status
#再根据提示操作
git rm -f dist/assets/js/* #(较少时可以这样处理)
git add -u dist/assets/js/. #(较多时直接add)
# git合并命令的说明
git merge <branch>
,这里的branch
是要合并的分支名- 合并分支前,通常需要先切换到要合并的分支,如要将dev合并到master分支,需要先切换到master分支,再执行
git merge dev
操作; git merge <remote>/<branch>
可将远程分支,合并至当前分支中; 对于idea来说,不论是rebase操作,还是merge操作,都需要切换到相应的目标分支上进行操作
# git rebase命令
- 用于将一个分支的修改内容,应用到另一个分支上,作用类似于merge,但合并策略不同,它是将一些列提交记录移动到另一个分支的顶端;
- 将当前分支的基础版本,更新为目标分支的最新版本,并将当前分支的修改内容,依次拷贝到目标分支顶部; 对于idea来说,不论是rebase操作,还是merge操作,都需要切换到相应的目标分支上进行操作 对于rebase操作需要注意,多次rebase可能会导致已经处理过的冲突再次进行处理,此时策略应该是rebase一次+merge多次
# git rebase的执行过程
- 找到当前分支和目标分支的最近共同祖先
- 找到当前分支的所有提交记录,将它们复制到临时文件夹中
- 将当前分支指向目标分支
- 将复制的提交记录,一次应用到目标分支上
- 如果应用过程出现冲突,需要手动解决冲突
- 应用完成后,当前分支指向最新的提交记录
# pull request介绍
- 简称为PR,是一种通知机制,最开始由
github
提出,并不是git本身的命令; - 你修改了他人的代码,将你的修改通知原来的作者,并希望他合并你的修改;
# pull request的实现方式
# 通过 git am命令
- 用于将一个
patch文件
,合并进入当前代码.Github对每个PR都会自动生成一个patch文件
; git am
命令一次可以合并一个问卷,或者一个目录下的所有patch文件- 如果某些冲突无法解决,可以通过
git am -abort
来撤销 - 通过
git format-patch + commit ID
的方式,可以自行达成patch文件;如果要打最新的代码,此处的commitID
为最新的提交之前的一个commitID;
# 通过远程仓库
- 为PR创建一个远程分支,如:
git remote add zhangsan git://github.com/zhangsan/test.git
- 从该远程仓库拉取:
git fetch zhangsan
- 合并该分支:
git merge zhangsan
- 推送到远程仓库:
git push origin master
# cherry-pick合并部分commit
git cherry-pick commit1
只合并感兴趣的commit
# idea中,如何将本地仓库推送至远程(新的仓库)
本质上,是将两个完全不同(也可能相同)的分支,合并;
- 首先在创建本地仓库,代码发生变动后,并commit到本地仓库
- 使用Push功能,此时可以指定远程仓库地址
- 创建远程仓库后,会提示 push失败,这是正常的流程
- 从右下角的git分支管理工具中,可以发现已经有远程仓库的分支,使用new branch 创建远程分支的本地分支,如果与本地仓库同名,则会提示rebase,点击统一rebase即可,如果有冲突就处理下冲突
- 最后再次push,即可成功;
# idea中,如何将不同的仓库进行合并?
同 idea中, git fork的仓库如何与原仓库的变动进行同步?
# idea中, git fork的仓库如何与原仓库的变动进行同步?
- 被fork的仓库称为上游仓库,称之为 upstream; 一般fork之后的仓库就是我们正在操作的远程仓库,称为origin; 同理,fork之后的仓库也可以称为downstream;这里的upstream,origin,downstream都是远程仓库的名称,每个远程仓库必须有一个名称,这与本地仓库不同。
- 在idea中,git->manage remotes可以添加远程仓库。这里添加的远程仓库,既可以为初始化的空仓库即下游仓库downstream,也可以为上游仓库upstream
- 如果添加的仓库有分支,则更新后,会在idea的右下角的git分支管理工具中,远程分支中,会包含所有的远程分支。如图:
- 之后既可以拉取,合并,提交等等,与单个仓库操作类似;