我是一名有用的助手,可以为您翻译文本。
我创建了一个名为
与此同时,其他人向
现在当我尝试合并
这个冲突的正确解决方案是:
我通过手动编辑文件创建了上述决议,复制了两个类共同的代码并删除了冲突标记。但是我认为git应该能够自动创建此解决方案,因为它只需要添加在一个分支中添加的所有行,然后是在另一个分支中添加的所有行,而不会去重复共同的行。如何让git为我执行此操作?
(额外加分的解决方案可以允许我自定义顺序 - 首先是“Dog”还是首先是“Cat”。)
我一直遇到以下问题,我想知道是否存在使用现有git命令的简单解决方案,或者是否需要编写自定义合并驱动程序。
这里有一个示例来说明我的问题:假设我的存储库的master
分支具有以下文件:
$ cat animal.hpp
#include <string>
class Animal
{
public:
virtual std::string say() const = 0;
};
我创建了一个名为
mybranch
的新分支,并进行了以下更改:diff --git a/animal.hpp b/animal.hpp
index e27c4bf..3bb691a 100644
--- a/animal.hpp
+++ b/animal.hpp
@@ -5,3 +5,13 @@ class Animal
public:
virtual std::string say() const = 0;
};
+
+class Dog : public Animal
+{
+public:
+ virtual std::string
+ say() const override
+ {
+ return "woof";
+ }
+};
与此同时,其他人向
master
分支添加了非常相似的更改:diff --git a/animal.hpp b/animal.hpp
index e27c4bf..310d5a7 100644
--- a/animal.hpp
+++ b/animal.hpp
@@ -5,3 +5,13 @@ class Animal
public:
virtual std::string say() const = 0;
};
+
+class Cat : public Animal
+{
+public:
+ virtual std::string
+ say() const override
+ {
+ return "meow";
+ }
+};
现在当我尝试合并
mybranch
和master
(或将mybranch
变基到master
),我遇到了冲突:$ cat animal.hpp
#include <string>
class Animal
{
public:
virtual std::string say() const = 0;
};
<<<<<<< HEAD
class Dog : public Animal
=======
class Cat : public Animal
>>>>>>> master
{
public:
virtual std::string
say() const override
{
<<<<<<< HEAD
return "woof";
=======
return "meow";
>>>>>>> master
}
};
这个冲突的正确解决方案是:
$ cat animal.hpp
#include <string>
class Animal
{
public:
virtual std::string say() const = 0;
};
class Dog : public Animal
{
public:
virtual std::string
say() const override
{
return "woof";
}
};
class Cat : public Animal
{
public:
virtual std::string
say() const override
{
return "meow";
}
};
我通过手动编辑文件创建了上述决议,复制了两个类共同的代码并删除了冲突标记。但是我认为git应该能够自动创建此解决方案,因为它只需要添加在一个分支中添加的所有行,然后是在另一个分支中添加的所有行,而不会去重复共同的行。如何让git为我执行此操作?
(额外加分的解决方案可以允许我自定义顺序 - 首先是“Dog”还是首先是“Cat”。)
merge.conflictstyle
设置为diff3
,但我怀疑它不会影响Git。最终问题在于联合合并基于逐行方式进行,并且您无法控制选定行的顺序,我本来以为它在这里也会出错,但它实际上起作用了,我很惊讶(中途改变答案!)。 - torek