我有分支主机,其中有文件Prova.c:
int main()
{
printf("Ciao mondo");
}
和一个名为c++版本的分支,在那里我修改了相同的文件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
}
我不喜欢这个结果。我想要印花和高级定制,但我只有高级定制。我可以采用什么合并策略(或其他解决方案)?或者在极端情况下,我怎么能每次都强制要求我解决所有冲突?
听起来,您有一个分支有一个未修改代码区域(master
),而一个分支已被修改(c++version
)。当您遇到这种情况并在修改后的分支中进行合并时,Git会拉入所有这些更改,因为合并的结果是双方所有更改的总和。
在这种情况下,正在进行的部分更改是删除printf
行并插入cout
行。添加和删除都是这一变化的一部分。
只有当双方都更改了相同的代码时,才会产生冲突。如果只更改了一侧,则合并包含该更改。合并就是这样运作的。Git确实提供了只采取一方或另一方的策略,但在这种情况下,这对你没有帮助,因为你想要的是不删除任何行,而Git没有提供这样的策略。
此外,这样的策略不会很有用,因为不清楚你希望以什么顺序添加行(是在现有行之前还是之后?),因此每次这样的合并都必须导致冲突,这样你才能解决这个问题。
在这种情况下,合并在语法上成功了,但在语义上却产生了不希望的变化。您可以使用git commit --amend
修改merge以更改合并的结果,但除此之外,Git确实没有为这种情况提供太多功能。