我有分支主服务器,其中有文件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每次问我解决所有冲突?
答案 0 :(得分:1)
这听起来像是您有一个分支的未修改代码区域(master
)和一个已经被修改的分支(c++version
)。遇到这种情况并在修改后的分支中合并时,Git会将所有这些更改拉进去,因为合并的结果是双方所有更改的总和。
在这种情况下,要进行的部分更改是删除printf
行,并插入cout
行。添加和删除都是该更改的一部分。
仅当双方更改相同的代码时,才会导致冲突。如果仅更改了一侧,则合并将包括该更改。这就是合并的工作方式。 Git确实提供了只占一侧或另一侧的策略,但是在这种情况下,这对您无济于事,因为您想要的是不删除任何行,并且Git不提供这样做的策略。
此外,这样的策略不是很有用,因为不清楚您希望以什么顺序添加行(是在现有行之前还是之后?),因此每次这样的合并都必须产生发生冲突,以便您解决该问题。
这是合并在语法上成功但在语义上导致不希望的更改的情况之一。您可以使用git commit --amend
修改合并以更改合并的结果,但是除此之外,Git确实没有提供很多解决方案。