我们来看如何在合并分支的时候处理冲突。为了演示这个过程,我们重新创建了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进行的所有操作:
网友评论