美文网首页
处理合并分支时的冲突

处理合并分支时的冲突

作者: 醉看红尘这场梦 | 来源:发表于2020-03-15 17:50 被阅读0次

    我们来看如何在合并分支的时候处理冲突。为了演示这个过程,我们重新创建了git-learning项目。

    冲突是如何发生的?

    现在,为了开发新功能,我们创建了一个叫做feature/do-something的分支:

    git checkout -b feature/do-something
    
    

    在这里,我们把hello这条路由的代码成了这样:

    public func routes(_ router: Router) throws {
        // Basic "Hello, world!" example
        router.get("hello") { req in
            return "Welcome to Vapor 3."
        }
    }
    
    

    完成之后,创建快照并且提交:

    git add .
    git commit -m "Finish do-something."
    
    

    现在,我们执行git checkout master回到master分支,这时,它还没有包含我们刚才的修改。但是出于某些原因,我们也得修改hello的路由,这次,我们改成这样:

    public func routes(_ router: Router) throws {
        // Basic "Hello, world!" example
        router.get("hello") { req in
            return "Hello everyone."
        }
    }
    
    

    同样,在master分支上,我们提交这个改动:

    git add .
    git commit -m "Welcome everyone."
    
    

    现在,我们得到通知要上线do-something了。于是,在master分支上,我们执行了合并的命令:

    git merge feature/do-something
    
    

    这时,git就会提示我们这两个分支上,有对同一处代码的修改,这就是我们在一开始说的冲突。合并分支之前,我们得明确告诉git究竟哪边的代码才是真正需要的:

    image

    并且,如果我们执行git status,就会看到下面的结果:

    image

    git提示我们合并的路径上有冲突,要么自己解决冲突之后再提交,要么执行git merge --abort取消合并。那么,该如何解决冲突呢?

    在合并分支的时候解决冲突

    这时,我们看一下Sources/App/routes.swift,会发现它变成了这样:

    import Vapor
    
    /// Register your application's routes here.
    public func routes(_ router: Router) throws {
        // Basic "Hello, world!" example
        router.get("hello") { req in
    <<<<<<< HEAD
            return "Hello everyone."
    =======
            return "Welcome to Vapor 3."
    >>>>>>> feature/do-something
        }
    }
    
    

    如果这是你第一次见到这个结果,心里多半会想:OMG,git怎么把我的代码变成这样了。这些<<<===>>>都是什么乱七八糟的东西。实际上,当你理解了它们的用途之后,就会发现这是git在帮助我们对冲突作出选择。其中:

    • <<<<<<< HEAD=======之间的部分,表示当前分支上routes.swift中的内容;
    • =======>>>>>>> feature/do-something之间的部分,表示feature/do-something分支上routes.swift中的内容;

    有了这些信息之后,解决冲突很简单。留下想要的部分,把其余的删掉就好了。例如,为了保留feature/do-something的内容,我们删掉这些版本提示信息,以及master的修改就好了:

    public func routes(_ router: Router) throws {
        // Basic "Hello, world!" example
        router.get("hello") { req in
            return "Welcome to Vapor 3."
        }
    }
    
    

    完成后,保存退出,执行git add .创建快照。然后,重新执行git status,就会看到下面的结果:

    image

    现在,所有冲突都解决了,我们执行git commit提交。git就会打开编辑器让我们编写一个备注:

    image

    通常我们也不会修改git提供的默认说明,直接保存退出。这样,feature/do-something就合并到master了。执行git log,我们可以看到之前对route.swift进行的所有操作:

    image

    相关文章

      网友评论

          本文标题:处理合并分支时的冲突

          本文链接:https://www.haomeiwen.com/subject/zilyjhtx.html