自动合并冲突解决

时间:2019-04-04 14:39:23

标签: git merge conflict

运行此命令时,我在index.js中遇到合并冲突:

$ git checkout feature
$ git merge master

feature分支index.js

const a = 1;
const b = 1;

master分支index.js(这是feature分支的诞生地)

 const a = 1;

master分支index.js(当前状态)

 const a = 2;

我想要以某种方式自动解决冲突,以便将index.js分支上的feature更新为此:

const a = 2;
const b = 1;

2 个答案:

答案 0 :(得分:2)

就像提到的评论一样,Git仅擅长决定如何将代码组合在一起。您可能对合并策略选项感兴趣。您可以运行

git merge --strategy-option theirsgit merge --strategy-option ours

在发生冲突时偏向源或目的地。在此处阅读有关此内容的更多信息:

Resolve Git merge conflicts in favor of their changes during a pull

https://git-scm.com/docs/merge-strategies

答案 1 :(得分:1)

我建议您不要在此处使用-X ours-X theirs(或更长的拼写等效项--strategy-option ours等)。

Git看到的冲突(请记住,Git逐行运行)是Git在合并基础提交中看到的冲突:

const a = 1;

在两个分支提示提交之一(我们称其为左侧或ours一个)中,Git看到:

const a = 1;
const b = 1;

对于Git,这看起来像:

  • 在a = 1行上(与之匹配) add const b = 1;

与此同时,在另一个分支提示落实theirs或右侧,Git看到:

const a = 2;

对于Git,这看起来像:

  • 在a = 1行上删除行,然后插入const a = 2;

两条指令都“触摸” a=1行,因此Git声明了冲突。

如果您告诉Git支持“我们的” /左侧,Git将保留添加b = 1指令,并扔掉 < em>删除a = 1并插入替换行指令。如果您告诉Git偏爱“他们的” /右侧,Git会保留将a=1替换为a=2的指令,但会丢弃另一条指令。< / p>

无论哪种方式,您最终都会遇到错误分辨率。正确的解决方案实际上是接受两个更改,即使它们看起来有冲突。 Git无法自动执行此操作。

在这种情况下,我想将merge.conflictStyle设置为diff3。这样,当Git在我的工作树中留下混乱的合并冲突结果时,文件将读取:

<<<<<<< HEAD
const int a = 1;
const int b = 1;
||||||| merged common ancestor
const int a = 1;
=======
const int a = 2;
>>>>>>> master

默认情况下,七根竖线和const int a = 1;基线丢失了(emem )(有时剩余的线被挤压得更多)。很难读。使用diff3样式,基线是: :您可以看到每个人的起点,并自行决定是进行两项更改,还是进行一项更改,还是进行第三项更改比任何一个都好。

(另请参见http://psung.blogspot.com/2011/02/reducing-merge-headaches-git-meets.html