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这一次是冲突那一次的提交

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/shanelau/p/7109394.html
Copyright © 2011-2022 走看看