# 版本管理

# 版本管理的概念及发展

# 概念

  • 为满足不同需求,对同一产品或系统的变更情况进行记录、跟踪、维护和控制的过程.
  • 主要功能需满足:
    • 操作需授权
    • 版本向上升级
    • 加锁避免互斥
    • 不同源程序比较功能

# 发展

  • 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合并命令

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的仓库如何与原仓库的变动进行同步?

  1. 被fork的仓库称为上游仓库,称之为 upstream; 一般fork之后的仓库就是我们正在操作的远程仓库,称为origin; 同理,fork之后的仓库也可以称为downstream;这里的upstream,origin,downstream都是远程仓库的名称,每个远程仓库必须有一个名称,这与本地仓库不同。
  2. 在idea中,git->manage remotes可以添加远程仓库。这里添加的远程仓库,既可以为初始化的空仓库即下游仓库downstream,也可以为上游仓库upstream
  3. 如果添加的仓库有分支,则更新后,会在idea的右下角的git分支管理工具中,远程分支中,会包含所有的远程分支。如图: 版本管理 版本管理
  4. 之后既可以拉取,合并,提交等等,与单个仓库操作类似;