这一节,我们来看如何在合并分支的时候处理冲突。为了演示这个过程,我们重新创建了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究竟哪边的代码才是真正需要的:

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

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,就会看到下面的结果:

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

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

What's next?

以上,就是在合并分支的时候处理冲突的方法。至此,我们就应该可以使用git进行基本的版本管理工作了。实际上,我们工作中80%的时间,都是在和这些命令打交道。因此,下一节,我们来看如何给这些最常用的git命令设置别名,

所有订阅均支持 12 期免息分期

¥ 59

按月订阅

一个月,观看并下载所有视频内容。初来泊学,这可能是个最好的开始。

开始订阅

¥ 512

按年订阅

一年的时间,让我们一起疯狂地狩猎知识吧。比按月订阅优惠 28%

开始订阅

¥ 1280

泊学终身会员

永久观看和下载所有泊学网站视频,并赠送 100 元商店优惠券。

我要加入
如需帮助,欢迎通过以下方式联系我们