• git分支管理的策略和冲突问题


    备注:

    本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。

    知识点

    • git log --graph --pretty=oneline --abbrev-commit查看分支合并情况

    • git log --graph查看分支合并图

    • 当两个分支修改同一个文件时,可能发生两个分支不能自动合并的问题,需要手动解决冲突(合并时,Git将冲突标识了出来),然后再次提交,即可完成合并。

    • 使用参数--no-ff禁用快合并模式,git merge --no-ff -m"merge with no-ff" dev,合并

    关于分支中的冲突

    如下,新建一个分支dev2,并且在新分支上开发:

    $ git checkout -b dev2
    切换到一个新分支 'dev2'
    

    修改readme.txt,添加一行。

    Creating a new branch is quick AND simple.
    
    • 在dev2分支进行提交,
    $ git add readme.txt
    $ git commit -m"add new line at readme on dev2"
    [dev2 4a097db] add new line at readme on dev2
     1 file changed, 1 insertion(+)
    
    • 切换到master分支,同时在master上修改readme文件(添加域dev2分支上文件不同的内容,Creating a new branch is quick & simple.),并且提交
    git checkout master
    切换到分支 'master'
    您的分支领先 'origin/master' 共 1 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    $ git add readme.txt
    $ git commit -m"add new line at readme on master"
    [master d562bf7] add new line at readme on master
     1 file changed, 1 insertion(+)
    

    如上,Git会自动提示当前master分支比远程origin/master分支领先一个提交

    现在master分支和dev2 分支都有了各自新的提交,在这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,由于同时都修改了同一行内容,此时会有冲突。

    $ git merge dev2
    自动合并 readme.txt
    冲突(内容):合并冲突于 readme.txt
    自动合并失败,修正冲突然后提交修正的结果。
    

    Git提示自动合并存在冲突,冲突文件是readme,需要修正冲突然后提交修正后的结果

    如果用git status查看看当前状态

    $ git status
    位于分支 master
    您的分支领先 'origin/master' 共 2 个提交。
      (使用 "git push" 来发布您的本地提交)
    您有尚未合并的路径。
      (解决冲突并运行 "git commit")
    
    未合并的路径:
      (使用 "git add <文件>..." 标记解决方案)
    
    	双方修改:   readme.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    

    如上,提示双方修改

    • 查看readme.txt的内容
    $ cat readme.txt
    
    `this is a test that I learn and use git version control system
    this is a beginning
    wofaidognyixie dognxi
    create two new branch
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> dev2
    
    • Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存
    Creating a new branch is quick and simple.
    
    • 修改冲突后提交
    $ git add readme.txt
    $ git commit -m"conflict fixed"
    [master 8f69de8] conflict fixed
    

    Git提示冲突已经修复,现在masterdev2分支均指向了现在工作区的状态。

    • 使用git log --graph --pretty=oneline --abbrev-commit可以查看分支的合并情况
    $ git log --graph --pretty=oneline --abbrev-commit
    *   8f69de8 conflict fixed
    |
    | * 4a097db add new line at readme on dev2
    * | d562bf7 add new line at readme on master
    |/
    * 03d07d2 modify readme.txt at branch
    * 036ced2 a push test
    * 6a0f133 remove test.txt
    * b5c87d4 add a test file
    * d5b84bf modifya readme file
    * 3033dda add a readme file
    

    如上,分支合并和冲突记录

    • 此时可以删除dev2分支
    $ git branch -d dev2
    已删除分支 dev2(曾为 4a097db)。
    

    冲突解决完成

    分支管理的策略

    通常,合并分支时Git使用Fast forward模式快速合并。但是快速模式删除分支,会丢失分支信息。

    强制禁用Fast forward模式,Git会将merge记录为一个新的提交,同时分支历史会记录分支信息。

    • 切换到dev分支,并修改readme文件,同时提交commit
    $ git checkout -b dev
    切换到一个新分支 'dev'
    $ git add readme.txt
    $ git commit -m"a new branch"
    [dev 44dffc0] a new branch
     1 file changed, 1 insertion(+)
    
    • 切换到master分支
    $ git checkout master
    切换到分支 'master'
    您的分支领先 'origin/master' 共 4 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    • 使用--no-ff参数合并分支dev到当前master,本次合并要创建一个新的commit,所以加上-m参数描述
    $ git merge --no-ff -m"merge with no-ff" dev
    Merge made by the 'recursive' strategy.
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
    
    • 使用git log查看分支合并图
    $ git log --graph --pretty=oneline --abbrev-commit
    *   7c4d427 merge with no-ff
    |
    | * 44dffc0 a new branch
    |/
    *   8f69de8 conflict fixed
    |
    | * 4a097db add new line at readme on dev2
    * | d562bf7 add new line at readme on master
    |/
    * 03d07d2 modify readme.txt at branch
    * 036ced2 a push test
    * 6a0f133 remove test.txt
    * b5c87d4 add a test file
    * d5b84bf modifya readme file
    * 3033dda add a readme file
    

    分支策略

    实际开发中,分支管理应按照以下几点:

    1. master分支是稳定分支,用来发布最新稳定版本,开发中不需要修改它

    2. 开发中尽量在dev中开发,扩展新功能、修复bug等,等到正式版发布时,在将dev分支合并到master上。

    3. 开发人员在dev分支上开发,每个人都有自己的分支,并且往dev分支上合并。

    团队合作分支开发

    作者: 代码迷途
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意原创文章必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    非原创文章若有需要,建议直接联系原文作者或保留声明情况下转载原文
  • 相关阅读:
    用Sql添加删除字段,判断字段是否存在的方法
    [转]SQL Server中获得EXEC后面的sql语句或者存储过程的返回值的方法
    sql日记(相关子查询,动态交叉表篇)
    一种迅速从datatable生成excel文件的方法
    系统设计说明书(架构、概要、详细)目录结构
    针对Web系统常用的功能测试方法浅析
    单元测试(UnitTest)入门
    文件操作概览
    C#仿QQ面板的简单实现
    用MD5和SHA1加密字符串
  • 原文地址:https://www.cnblogs.com/codemissing/p/git_branch_manage_conflict.html
Copyright © 2020-2023  润新知