它是否存在附加的合并策略?

时间:2019-01-17 22:15:21

标签: git version-control

我有分支主服务器,其中有文件Prova.c:

int main()
{
     printf("Ciao mondo");
}

和一个名为c ++ version的分支,我在其中修改了相同的文件Prova.c,如下所示:

#include <iostream>

using namespace std;
int main()
{
     cout<<"Ciao mondo"<<endl;
}

在主服务器上,我执行命令(在两个分支中都进行了添加和提交操作):

git merge c++version

然后我进入主文件Prova.c:

#include <iostream>

using namespace std;
int main()
{
    cout<<"Ciao mondo"<<endl; \\I don't like this
}

我不喜欢这个结果。我既需要printf也要cout,但是我只有cout。我可以采用哪种合并策略(或其他解决方案)? 或者在极端情况下,我该如何强制git每次问我解决所有冲突?

1 个答案:

答案 0 :(得分:1)

这听起来像是您有一个分支的未修改代码区域(master)和一个已经被修改的分支(c++version)。遇到这种情况并在修改后的分支中合并时,Git会将所有这些更改拉进去,因为合并的结果是双方所有更改的总和。

在这种情况下,要进行的部分更改是删除printf行,并插入cout行。添加和删​​除都是该更改的一部分。

仅当双方更改相同的代码时,才会导致冲突。如果仅更改了一侧,则合并将包括该更改。这就是合并的工作方式。 Git确实提供了只占一侧或另一侧的策略,但是在这种情况下,这对您无济于事,因为您想要的是不删除任何行,并且Git不提供这样做的策略。

此外,这样的策略不是很有用,因为不清楚您希望以什么顺序添加行(是在现有行之前还是之后?),因此每次这样的合并都必须产生发生冲突,以便您解决该问题。

这是合并在语法上成功但在语义上导致不希望的更改的情况之一。您可以使用git commit --amend修改合并以更改合并的结果,但是除此之外,Git确实没有提供很多解决方案。