天天看点

Git学习笔记5 merge冲突时二选一

常常有这样一种情况,程序员甲在Git branch了一个项目,然后花了1个月在 branch 中开发了几个功能,解决了一些bug,最后一步必然是把这个branch merge回master,然后解决冲突,再进行交给QA前的最后调试。解决冲突是个很痛苦的过程,如果高效解决 merge conflict 是所有版本控制系统花大力气的地方之一,这里就不赘述,只介绍如何在merge 冲突时使用 Git 命令简单地在发生冲突的两个文件版本中进行二选一。

假设原来有文件A,程序员甲把A进行了完全的重写,而甲在自己的branch工作的同时,他的同事程序员乙则对A进行了一个优化。这样,当甲想要merge的时候,A文件就有很多的冲突,可能多达几百行。

$ git merge master

   Auto-merged xxx/A.java

   CONFLICT (content) : Merge conflict in xxx/A.java

   Automatic merge failed; fix conflicts and then commit the result.

这时候两个程序员达成一致,最后应该完全采用甲的版本,因为乙只是在原基础上优化,而甲进行了全方面的重写。在这种情况下,git checkout 命令的   - -theirs 和 - -ours 就派上用场了。前者表示保留甲 想要merge的版本,后者表示保留master branch中的版本,即乙的版本。

$ git checkout - -ours xxx/A.java // 抛弃甲的版本,保留乙的

$ git checkout - -theirs xxx/A.java // 抛弃乙的版本,完全采用甲的

这两个参数只适用于 Git 1.6.1及更新的版本。

在1.6.1 以前版本中,虽然没有这两个参数,但也有办法

1、实现 - - theirs

$ git reset - - xxx/A.java

$ git checkout MERGE_HEAD - - xxx/A.java

2、实现 - - ours

$ git reset - - xxx/A.java

$ git checkout ORIG_HEAD - - xxx/A.java