【Git】六、分支管理&冲突解决

上一节讲了如何和远端的仓库协同工作,这一节介绍一下分支
————————————————————————————

提要

//创建一个分支dev
$ git branch dev
//切换到dev分支
$ git checkout dev
//创建并切换到dev2分支
$ git checkout -b dev2
//查看当前的分支列表
$ git branch
//合并dev2分支到当前分支
$ git merge dev2
//删除dev2分支
$ git branch -d dev2
//查看gitlog,以图标形式,单行展示,版本号缩写
$ git log --graph --pretty=oneline --abbrev-commit

一、创建分支、合并、删除

之前的小节里,我们讲到的分支都只有master只一个默认分支,使用分支的场景如下:
你想做一个A功能,但还有一个B功能也需要你开发。这两个功能哪个先做完就要先提交不能相互影响;如果你在master分支上同时进行开发,AB功能之间会互相影响,只等你等到你把两个功能都开发完之后才能提交;这时就需要用到分支来解决这个问题,一个A分支用来开发A功能,一个B分支用来开发B功能,哪个先开发完把那个分支合并到master,这样不仅可以做到同时开发,还能不互相影响。
之前讲到版本回退的时候用到指令git reset --hard HEAD^,其中这个HEAD就是一个指向master分支的指针,其实master也是一个指针,它才真正指向当前的分支。
每次对master的commit都会有一个记录,这些记录会连成一条线;如果此时创建一个分支dev,则dev会指向当前的提交,并且HEAD指向了dev。


当我们在dev分支开发完成了一个提交,此时dev分支会指向新的提交,而HEAD依然指向dev。

加入dev的工作完成了,就可以把dev合并到master,然后销毁dev


以下上指令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

先创建一个分支,然后切换到新的分支,这里的checkout和之前撤销工作区修改的命令相同,只是少了--
可以用1条命令代替以上2条命令

$ git checkout -b dev2
Switched to a new branch 'dev2'

$ git branch
  dev
* dev2
  master

-b就代表创建并切换,使用git branch指令可以查看当前所有的分支,前面有*表示当前所在的分支

现在我们在新的dev2分支上做修改,add并commit一次修改后,再切换回master

$ git add .

$ git commit -m "dev2 commit"
[dev2 1c6205f] dev2 commit
 1 file changed, 2 insertions(+), 1 deletion(-)

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

你会发现你刚才的修改不见了~因为刚刚的修改提交在了dev2分支,master是没有的,现在把dev2合并到master

$ git merge dev2
Updating 175d6f5..1c6205f
Fast-forward
 testgit.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

git merge dev2 这句指令是在master分支时敲的,表示将dev2分支合并到当前分支,合并只会将新的提交合并到老的提交,将时间轴靠后的合并到时间轴靠前的;这里的Fast-forward表示合并是快进模式,直接将指针指向了最新的分支,现在master和dev2一致了,如果dev2不再使用,可以删除

$ git branch -d dev2
Deleted branch dev2 (was 1c6205f).

二、分支的冲突解决

刚刚提到的使用分支的场景,是同时修改两个功能,难免修改中我们修改了同一个文件,这时想把两个分支合并在一起,就会产生冲突
例如,我们先在master分支上修改testgit.txt文件,然后add、commit
再切换到dev分支,同样修改testgit.txt文件,然后add、commit
切回master分支,合并dev到master,这时会出现冲突

//修改master文件
$ git add .
$ git commit -m "master modify"
[master 7160ae0] master modify
 1 file changed, 3 insertions(+), 1 deletion(-)

//切换分支,修改dev文件
$ git checkout dev
Switched to branch 'dev'

$ git add .
$ git commit -m "dev modify"
[dev 217c01e] dev modify
 1 file changed, 3 insertions(+), 1 deletion(-)

//切回master,合并dev到master
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

$ git merge dev
Auto-merging testgit.txt
CONFLICT (content): Merge conflict in testgit.txt
Automatic merge failed; fix conflicts and then commit the result.

此时testgit.txt文件会变成这样,同时展示master的修改和dev的修改,然后待你解决冲突
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

解决冲突后要进行add、commit操作,解决冲突的代码才会被提交到master,此时dev分支还是只有dev的修改,而master已经是解决冲突后的状态了。如果dev不用了,可以将其删除;或将master同步到dev,这时不会再有冲突
我们可以通过log来查看分支的合并情况

$ git log --graph --pretty=oneline --abbrev-commit
*   ddfb691 (HEAD -> dev, master) conflict
|\
| * 217c01e dev modify
* | 7160ae0 master modify
* | 1c6205f (origin/master) dev2 commit
* | 175d6f5 init
|/
*   1f79d9c Merge branch 'master' of github.com:ls199242/DemoRepo
|\
| * 95a3e58 Initial commit
* a472776 commit testgit.txt
* e8c7ff0 delete test.txt
* 499094d test commit
* e6ded21 test commit2
* a50498c test commit,2 files is commited
* 81a320c readme file

这是从我创建版本库以来的所有log,指令里面graph表示用图形展示合并历史,pretty=oneline表示只展示一行,abbrev表示版本号展示缩写。95a3e58 这个版本是和远程仓库创建时候的记录;ddfb691这一次是冲突那一次的提交

posted @ 2017-07-03 08:23  l.shane  阅读(1427)  评论(0编辑  收藏  举报