Я продолжаю сталкиваться со следующей проблемой, и я хотел бы знать, есть ли простое решение с помощью существующих команд 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
первым.)