一、背景
目前常用的代码管理工具有Git,如果在开发使用者命令使用的不够熟练,可能会导致合并冲突等问题,要熟练的使用Git,就得知道Git的工作原理。
Git管理流程图
Git是分布式的版本控制系统
特点
好处
Git工作流程
Git 工作区、暂存区和版本库
**工作区:**就是你在电脑里能看到的目录。
**暂存区:**英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
**版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- "HEAD" 是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
二、常规使用
流程图
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
基础使用
三、分支管理
基础使用
四、进阶使用
git cherry-pick
背景
对于正常开发,git add 、git commit、git push 等命令行就足够了,但是如果在某些特殊情况下,比如在release包上修复了一个紧急bug,这次提交需要在master也提交合入,那么就可以用上git cherry-pick了。
git cherry-pick是将某一个commit包含的全部内容copy过来,对于上述情况,使用比较方便
操作
如下有两个分支master和dev,从C2开始两个分支开始有不同的commits。
需要把dev的C6合并到master,只需在master分支上执行git cherry-pick C6,就会把dev分支的C6应用到master分支上并产生一个新的commitC6'。
如果要合并多个commits,比如C7和C8两个commits,可以执行git cherry-pick C7 C8,则git提交记录就会变成下面这样。
需要注意的是,新的commit SHA-1 校验和会和原来的commit SHA-1 校验和不一样。
参考代码
git rebase
背景
操作
如下图所示,bugfix 分支是从 master 分支分叉出来的。
使用 rebase 之后:
现在我们来简单地讲解一下合并的流程吧。
-
首先,rebase bugfix 分支到 master 分支, bugfix 分支的历史记录会添加在 master 分支的后面。如图所示,历史记录成一条线,相当整洁。
-
这时移动提交 X 和 Y 有可能会发生冲突,所以需要修改各自的提交时发生冲突的部分。
rebase 之后,master 的 HEAD 位置不变。因此,要合并 master 分支和 bugfix 分支,即是将 master 的HEAD移动到 bugfix 的 HEAD 这里。
使用 merge 之后:
merge 会把两个分支合并在一起,形成一个新的 commit 提交
git merge 和 git rebase的区别
git merge 命令会保留所有commit的历史时间。每个人对代码的提交是各式各样的。尽管这些时间对于程序本身并没有任何意义。但是merge的命令初衷就是为了保留这些时间不被修改。这样也就形成了以merge时间为基准的网状历史结构。每个分支上都会继续保留各自的代码记录, 主分支上只保留merge的历史记录。子分支随时都有可能被删除。子分子删除以后,你能够看到的记录也就是,merge某branch到某branch上了。这个历史记录描述基本上是没有意义的。
git rebase 命令会始终把你最新的修改放到最前头。比如你对主branch进行rebase以后, 你的所有修改就会在主branch当前所有的修改之前。
参考代码
git rebase HEAD ~i
背景
如果你在某个分支连续提交了多次,这个时候想将这些提交的结点合并成一个,使提交记录看起来简洁一些,那么git rebase HEAD i就是一个很好的命令
操作
这里我们做通过git log可以看到我们的三次提交,通过使用git rebase命令将后两个提交合并成一个commit:
首先执行git rebase -i HEAD2,这里的HEAD2表明的合并最近两次提交,命令执行后会进入到一个vi编辑页面,以下所示:
p c953ae9 第二次提交
s 8d27ccf 第三次提交
参考代码
五、拓展
SVN
除了Git之外,有些公司使用的是SVN,Subversion属于集中式的版本控制系统,集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。