zoukankan      html  css  js  c++  java
  • 【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这一次是冲突那一次的提交

  • 相关阅读:
    大数据培训:分享大数据行业就业趋势
    大数据培训:Zookeeper集群管理与选举
    【编码】UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position XXX
    MVC 登录后重定向回最初请求的 URL FormsAuthentication.RedirectFromLoginPage
    EasyUI 下载与引用
    EntityFrameWork Parameter '@columnType' must be defined.
    Hello World
    protobuf windows java 环境搭建
    android XML转义字符
    shiro Remember 1.2.4反序列化漏洞
  • 原文地址:https://www.cnblogs.com/shanelau/p/7109394.html
Copyright © 2011-2022 走看看