接上篇(http://my.oschina.net/woshixiaomayi/blog/521519)继续。
六、创建与合并分支。
在版本回退中,每次提交,Git都把他们串成一条时间线,这条时间线就是一个分支。在Git中,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,so,HEAD指向的就是当前分支。
创建新的分支dev,并且切换到dev分支上,命令:
git checkout -b dev 创建新的分支,并且切换到该分支上,这相当于两条命令:
git branch dev 创建分支dev
git checkout dev 切换到分支dev
git branch 查看分支,会列出所有分支,并且会在当前的分支上添加一个星号。
场景:在dev分支上,在readme.txt中做出一点修改。然后在master分支上查看。
可以发现在master分支上是看不到dev分支新修改的内容的,这时候我们需要把dev分支上的内容合并到master上,切换到master分支,使用命令:
git merge dev 将目标分支合并到当前分支上。现在再来查看master分支中的readme.txt,就能够看到
在dev分支上修改的内容了。值得注意的是,在合并中下方出现的提示文字,有一个Fast-forward,Git告诉我们,这次合并是“快进模式”,也就是直接把master分支指向dev的当前提交,所以合并速度非常快。
合并之后删除dev分支,命令:
git branch -d dev 加上一个-d,即为删除该分支。
那么如何解决冲突呢?
场景:创建一个新的分支,fenzhi1,修改了readme.txt文件。然后在master分支上也同样修改了readme.txt,这时候在master分支上进行合并。可以看到提示信息说:Automatic merge failed;冲突诞生了。这时候,可以使用 git status ,查看一个状态,会告诉你:both modified:readme.txt。有两条修改信息。
cat readme.txt 查看一下内容,
<<<<<<<<<<<<<<<HEAD
aaaaaaaaaaaaaaaaaaaaaaaaaa
==================
bbbbbbbbbbbbbbbbbbbbbb
>>>>>>>>>>>>>>>fenzhi1
<<<HEAD是指主分支修改的内容,>>>>>>>fenzhi1 是指fenzhi1上修改的内容,现在可以修改这个文件的内容,然后add,commit提交即可。这样合并时冲突的问题就解决了。
分支管理策略
通常合并分支时,git一般使用“Fast forward”模式,上面也有提到。在这种模式下,删除分支后,会丢掉分支信息,可以使用参数 --no-ff 来禁用“Fast forward”模式,命令:
git merge --no-ff -m "使用no-ff合并分支" dev 使用--no-ff合并分支dev
git branch -d dev 删除dev分支
git log --graph --pretty=oneline --abbrev-commit 可以看到被删除的版本号还在。
分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本的,一般情况下不允许在上面干活,干活一般情况下在新建的其他分支上,干完活,可以把dev分支代码合并到主分支master上来。
七、bug分支
在开发中,会经常碰到bug问题,那么就需要修复,每个bug都可以创建一个临时分支来修复,修复完成后,在合并分支,然后将临时分支删除即可。
场景:在工作中突然接到了一个404bug,我们可以创建一个404分支来修复它,但是现在当前的dev分支上还有一些工作没有提交,无法创建和切换分支,这个怎么办呢?Git还提供了stash功能,可以把当前工作现场隐藏起来,等以后恢复了现场继续工作,命令:
git stash 将当前的工作隐藏起来,这时候使用git status,来查看状态,就会发现nothing to commit,working directory clean.工作区很干净。现在就可以创建分支,修复bug了。修改完成一切都搞定之后,还是要回到dev分支继续干活的。
git checkout dev 回到dev分支
git stash list 查看隐藏起来的工作现场
将工作现场恢复有两个命令:1,git stash apply 恢复,恢复之后,stash内容不会删除,如果要删除,需要使用命令git stash drop来删除。2,使用git stash pop,删除的同时把stash内容也删除了。