2017-03-03 16:24:44 +0000   |     tools git   |   Viewed times   |    

分支

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。Git 的默认分支名字是 master。在多次提交操作之 后,你其实已经有一个指向最后那个提交对象的 master 分支。它会在每次的提交操作中自动向前移动。HEAD在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。 branch

新建分支

branch命令新建一个分支,

git branch <branch_name>

切换分支

git checkout命令切换分支,

git checkout <branch_name>

请牢记:当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。Git 会 自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。

在你切换分支之前,保持好一个干净的状态

新建并同时切换到这个新分支

想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令:

git checkout -b <new_branch_name>

在某个历史提交上创建新分支

可以直接用branch命令,后面加上目标提交的id。

git branch <branch_name> <commit_id>

也可以用checkout命令。

git checkout -b <branch_name> <commit_id>

删除分支

-d参数,删除某个分支,

git branch -d <branch_name>

有些时候,不满足分支的删除条件(比如说某分支还没有merge),就需要用大写的-D强制删除,

git branch -D <branch_name>

查看分支信息

普通的branch命令就能查看分支信息,

git branch

加上-v参数,可以同时查看分支指向的提交版本。

git branch -v

--merged参数可以查看已经合并到当前分支的分支,

git branch --merged

反之,--no-merged参数查看还未合并到当前分支的分支,

git branch --no-merged

简单分支工作流演示

正常的master分支, 1 系统遇到#53号bug。所以 新建一个专门处理#53号bug的分支,取名iss53,并立即切换到这个分支

$ git branch iss53
$ git checkout iss53

或者把以上两条命令合并成一条命令,

$ git checkout -b iss53

2iss53分支上提交了一些修改,iss53分支向前推进,

$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'

3 系统另一个地方瘫痪,需要紧急处理,新建另一个专项分支,取名hotfix,并立即切换到这个分支。在hotfix分支上提交修改,hotfix分支向前推进,

$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)

4 hotfix系统瘫痪紧急处理好之后,切换回master分支,把hotfix合并回master分支线上。因为master分支当前提交c2hotfix分支c4提交的 直接祖先,所以这次是一个简单的 快进(fast-forward)合并

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward #注意这行
index.html | 2 ++
1 file changed, 2 insertions(+)

5 删除hotfix分支。并切换回iss53分支继续工作,

$ git branch -d hotfix
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)

6 #53号bug现在已经正确解决,切回master分支,准备将iss53分支合并回master分支。但因为c4提交和c5提交没有谁是谁的直接祖先。所以需要找到他们的共同祖先c2,做一次c2,c4,c5之间的 三方合并

$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)

7 合并完之后,master分支推进到c6提交。iss53分支这时也可以删除了。

git branch -d iss53

8

这是三方合并没有遇到冲突的情况。如果遇到冲突,需要人工解决冲突。这个话题以后再展开。

“渐进稳定分支”的流水线(silo)视图

“渐进稳定分支”的目的是:使你的分支具有不同级别的稳定性**。 silo 比如,

  1. 只在master分支上保留完全稳定的代码。
  2. 还有一些名为develop或者next的平行分支,被用来做后续开发或者稳定性测试–这些分支不必保持绝对稳定,但是一旦达到稳定状态,他们就可以被合并入master分支。
  3. 一些特性分支(短期分支,比如之前的iss53分支)能够通过所有测试,并且不会引入更多bug之后,就可以合并进主干分支。
  4. 有些大型项目还有一个proposed分支,可能因为包含一些不成熟的内容而不能进入develop或者master

总之,“渐进稳定性分支”模型的核心思想就是:“维护不同层次的稳定性”。

“特性分支”模式

刚才简单工作流程中演示的就是一个 拥有多个”特性分支”的工作流程

“特性分支”是一种短期分支,它被用来实现单一特性或相关工作。因此除了master主干分支,工作被分散到不同的流水线中,不同的流水线中的每个分支仅与目标特性相关。 feature1 完成之后再合并入主干分支。比如上图中的3个特性分支,在我抛弃iss91分支,然后再把iss91v2dumbidea合并进master分支以后,最终提交历史看起来像下面这个样子, feature2