Git系列笔记之四:分支管理

分支是什么呢?
html

团队开发的过程当中,每一个人都会有一个不一样于别人的分支,各自都在本身的分支上编写代码,等到须要的时候,再把各分支合并起来,这样既安全也不会相互影响。
git

1、建立与合并分支

在上一节中,咱们在本地建立了一个Git仓库,但只有一个分支,就是 master 分支,它是主分支,HEAD指向 mastermaster指向当前提交,因此,HEAD指向的就是当前分支。github

每次提交,master都会向前移动一步,随着不断的提交,这条分支线会愈来愈长
安全

当咱们建立了新的分支,好比叫 myBranch ,git就会新建一个指针叫 myBranch,指向 master 相同的提交,在把HEAD指向 myBranch,就表示当前分支在 myBranch 上。
app


从如今开始,对工做区的修改和提交都是针对 myBranch 分支了,若是咱们修改后再提交一次,myBranch指针就会向前移动一步,而master指针不变测试


当咱们在myBranch分支上的工做完成后,就能够把myBranch合并到master,也就是把master指针移动到myBranch的当前提交。spa

当合并完成后,咱们就能够删除掉myBranch分支,也就是把myBranch指针删除掉,而后咱们就只剩下master分支了.net

OK,咱们如今经过实际的例子来讲明上面分支的使用。咱们先看看当前分支:指针

$ git branch        //查看分支


能够看到,目前咱们只有一个master主分支,咱们来建立一个bra分支:code

$ git checkout -b bra


git checkout 命令加上-b参数,表示建立分支并切换,它至关于下面的两个命令:

$ git branch dev        //建立分支
$ git checkout dev      //切换到建立的分支

咱们再次查看下当前分支状况

咱们能够看到有两个分支,分别是master和bra,当前在bra分支上。

git branch命令会列出全部分支,当前分支前面会标注一个 * 号,如今咱们在bra分支上对index.html作一些修改

保存退出后,咱们进行提交

如今咱们在bra分支上的工做完成,切换到master分支:

$ git checkout master

咱们发现,刚才添加的第三个P标签不见了,这是由于刚才的提交时在bra分支上,而master分支此刻的提交点没有变化



如今咱们可使用 git merge 命令来将bra分支上的更改合并到master分支上:

$ git merge bra

而后咱们再次查看index.html的内容

OK,在bra分支上添加的第三个P标签回来了,而当前咱们是在master主分支上。你们可能注意到了在咱们合并时,出现了 'Fast-forward',它告诉咱们此次合并是'快进模式',也就是将master指针直接指向bra分支的提交,因此速度很快,固然除了这种模式,还有其余模式。

合并完成后,咱们就能够删除bra分支了

$ git branch -d bra

而后咱们再次查看分支状况:

如今只剩下master分支了。GIT鼓励咱们使用分支来进行开发,下面咱们来总结下上面使用过的命令:

查看分支: git branch

建立分支: git branch "branch name"

切换分支: git checkout "branch name"

建立并切换分支: git checkout -b "branch name"

合并某分支到当前分支: git merge "branch name"

删除分支: git branch -d "branch name"


2、 解决冲突

有时候咱们在进行分支合并时,会遇到各类各样的问题,下面咱们用实例来讲明下。

咱们先建立一个新的分支fea,在这个分支上对index.html再添加一个p标签,而后在这个分支上提交。

$ git checkout -b fea    //建立并切换到fea分支
//对index.html作出修改
$ git add index.html    //提交
$ git commit -m "modifyed and commit on fea branch"

切换到master分支上

$ git checkout master


上面的代码还提示咱们当前的master分支比远程的master还要多2个提交,可使用 git push 命令推送本地的提交

接下来,咱们在master分支上对index.html作出修改,并提交修改

如今,master分支和fea分支都有了各自的提交

这个时候,git是没法进行快速合并的,只能把各自的修改合并起来,但这种合并可能会形成冲突。下面咱们尝试着合并一下

看到了吗? Automatic merge failed,合并失败了。git告诉咱们文件有冲突,必须手动解决,咱们用 git status 来看下,也提示有问题

查看文件内容,也有提示

咱们进入index.html进行修改,保存退出后,提交。

最后,咱们删除fea分支

当git没法自动合并分支时,就必须手动去解决问题,再进行合并。咱们还可使用 git log --graph 来查看分支合并图


3、分支管理

上面咱们了解了合并分支,git会使用 Fast forward 模式,在这种模式下合并,删除分支后,会丢失分支信息,因此咱们强制禁用 Fast forward模式,在合并分支的时候使用 --on--ff

如今咱们新建并切换到dev分支上

修改index.html文件并提交

切换到master分支

OK,关键在这里,咱们合并dev分支, 使用--no--ff参数,表示禁用 Fast forward

$ git merge --no-ff -m "merge with no-ff" dev

合并后,咱们使用git log 查看分支历史

在实际的开发中,master分支是主分支,是很是稳定的,仅仅只能用来发布新的版本,平时不能在它上面工做。

在一个项目开始的时候,咱们能够在git上新建一个dev分支,那么若是团队有3我的,分别是A,B,C,那么他们都分别会有本身的分支,你们都在本身的分支上干活,完成以后都提交到dev分支上,但这是不稳定的,通过屡次的测试,发现bug,修改,再次合并到dev分支,通过不少次的迭代,版本稳定了,OK,如今能够把dev分支合并到master上进行发布了。


4、BUG分支

咱们在工做时会遇到各类各样的BUG,有时候,有些bug须要马上修复,可是你手上的任务尚未完成,怎么办?这时,Git为咱们提供了 stash 功能,它能够将咱们当前分支上的任务存储起来,放在另一个地方,咱们就能够放心的切换到有bug的分支去进行修复。

当前有以下的情景,我在dev分支上工做,写了一些代码,但并无提交

这时,有任务来了,须要去Fix一个编号为88的bug,咱们能够在master分支上建立一个临时的分支来修复这个bug,OK,咱们利用 stash 功能将当前的工做保存起来。

咱们在利用 status 来查看下当前工做区状态

咱们看到当前在dev分支上,并且工做区是干净的,而刚刚咱们在dev分支上作的工做并无提交。

好了,咱们如今须要去master分支上建立一个fix88分支来修复bug,先切换到master分支

建立fix88分支来修复bug

咱们进入index.html修复bug,并提交

切换到master分支,合并修改,并删除fix88分支

修复bug后的index.html内容以下,咱们在最后一个p标签里,把原来的内容加上了一个span标签,并添加了另一个span标签,插入了一些说明的内容。

而后咱们再来看看当前的分支状态和工做区状态

切换到咱们原来的工做分支dev上,并查看工做区状态

工做区是干净的,下面咱们使用 git stash list 命令来查看下刚刚咱们隐藏的工做场景

OK,咱们来恢复咱们在dev分支上的工做场景 ,这里有两个方法能够来恢复

一是使用 git stash apply,这个方法恢复以后,并不会删除stash里的内容,还须要使用 git stash drop来删除 stash里的内容

二是使用 git stash pop ,这个方法恢复以后,会直接删除stash里的内容

能够看到工做场景恢复了,咱们再来看看stash里的内容,git stash list

没有了。

咱们还能够屡次使用stash,最后须要恢复的时候,使用下面的命令:

git stash apply stash@{0}

修复bug多是咱们会长期作的事,它会随时出现,而bug须要马上解决,这时,咱们就须要把现有的手上的工做stash下,而后建立一个新的分支去修复bug,提交合并后删除这个分支,最后再使用 git stash pop 来恢复咱们的工做场景。


5、Feature分支

咱们在开发的过程当中,可能随时会接到新的任务,为整个工程添加新的功能,这时,咱们最好的作法就是新建一个feature分支,在这个分支上开发,合并,最后删除该分支

假设有这样一个场景,咱们接到了Boss的一个任务,要在当前工程上开发一个新的功能,命名为feature-new01,ok, let's go work...

建立新功能分支feature-new01

在当前新功能分支上,咱们对index.html添加一个新的东西

提交修改

切换回dev分支,并准备进行合并。(新功能合并到dev工做分支上)


这时,Boss说新能取消,再也不开发,因此咱们必须删除,若是咱们使用 git branch -d feature-new01 ,这时git会提示咱们,这个分支的内容尚未被合并,不能删除,因此,咱们须要使用 git branch -D feature-new01 来强行删除这个分支。

若是团队须要在现有工程上开发新的功能,请新建一个分支进行,完成后,提交,并切换回团队工做分支(不是master),进行合并,若是在合并以前须要删除,使用 git branch -D <branch name>来强行删除,若是已合并,请参考前面的版本回退。

6、多人协做

当咱们从远程仓库克隆项目时,其实是把本地master分支和远程master分支对应起来了,远程仓库的默认名称是 origin ,要查看远程仓库的信息,使用 git remote

或者咱们可使用 git remote -v 来显示更详细的信息

推送分支,就是把该分支上的全部本地提交都推送到远程仓库,推送时,须要指定本地分支,好比咱们须要推送master分支,使用 git push origin master

若是要推送其余分支,如dev,则可使用 git push origin dev 

但不是全部的本地分支都须要推送到远程仓库

master分支是主分支,它是须要推送到远程的。

dev分支做为开发分支,也是须要推送到远程分支的。

处理bug的某些分支,由于处理完成以后会被删除,因此就么有必要了,除非团队须要,好比能够查看那些人在何时处理了哪些bug

新功能的开发分支,如feature分支,视本身的团队状况而定。

因此,咱们本身在本地的分支,是否推送,彻底取决于咱们本身,某些分支彻底就能够放在本身的本地电脑上玩。

多人团队开发时,团队成员都会往master和dev分支上推送本身的修改,下面咱们来模拟一个2人的团队开发,我在本身的Mac上的虚拟机中装了一个Ubuntu,咱们在这里来模拟。

在Ubuntu上装好git,而后从github上克隆gitTest项目。(注意:在这以前必须把当前机器的SSH Key添加到github)。

建立用户

当前,咱们在远程仓库中有两个分支,分别是mastet主分支和dev开发分支,但其余开发成员从远程克隆项目下来以后,会发现只有master分支,看刚才咱们在Ubuntu上克隆的项目

咱们看到只有一个master分支,若是团队成员lz须要在dev分支上进行开发,那么必须建立远程的dev分支到本地,可使用 git checkout -b dev origin/dev 命令建立

如今,团队成员lz就能够在dev分支上进行开发,并提交,push到远程。咱们来试试

修改完成,最后一行的div是团队成员lz在本地dev分支上添加的。咱们保存退出并提交,最后push到远程仓库

OK,如今团队成员lz对index.html作了添加并推送到了远程,当另一个成员也对这个文件作了修改,并推送,是一个怎么样的状况呢?咱们来试试

呀,提示推送失败了,缘由是刚才lz已经对index.html文件作除了修改并推送到了dev分支,我再提交推送就会出现冲突,这时咱们须要先把最新的修改pull下来到个人本地,合并修改后再推送

pull也失败了,缘由是咱们须要将本地dev和远程的origin/dev创建连接

再次pull

成功了,咱们打开inex.html看看

看到了吗?刚才成员lz的代码和我刚才写入的代码都在里面了,并且git也给咱们作出了提示,若是如今合并会起冲突,咱们须要手动调整代码,而后再提交推送

一般状况下,在团队协做开发中,咱们能够先推送本身的修改,使用 git push origin <branch name>

若是推送失败,说明远程的分支比本地更新,咱们须要使用 git pull 来合并

若是 git pull 提示 “no tracking information”, 说明咱们本地的分支没有和远程进行关联,咱们须要使用 

git branch --set-upstream-to=origin/dev dev 来进行关联,以后再次使用 git pull

若是存在冲突,在本地解决冲突的代码,最后 git push origin <branch name>。

相关文章
相关标签/搜索