Как предотвратить автоматическое объединение отдельных строк в Git с одинаковыми изменениями

Если у вас есть файл с номером версии, который увеличен в двух ветвях, как предотвратить автоматическое слияние Git двух строк, изменяющих строки, определяющие версию?

*   Git automatically merges here, but shouldn't
|\
| * change same line to the same new text
* | change some line here
 \|
  * prior history/root commit

В нашем случае у нас есть схема базы данных с поддержкой миграции. Наш основной файл схемы определяет текущую версию схемы. Если два человека изменят схему, например, добавят столбец базы данных, в разных таблицах и оба увеличат версию схемы на +1, Git будет молча объединять все, но результат будет нарушен.

Я бы посоветовал добавить специальный маркер на любую строку, которая не позволяет Git автоматически объединять эту строку. Есть ли какая-то особенность, подобная этой, которую я не знаю, или как ее достичь?

Вот список команд оболочки для создания примера истории Git, который иллюстрирует проблему:

$ git init test
Initialized empty Git repository in $PWD/test/.git/
$ cd test/
$ echo "version 1" > file
$ git add file
$ git commit -m "add file v1"
[master (root-commit) 4ef6950] add file v1
 1 file changed, 1 insertion(+)
 create mode 100644 file
$ git checkout -b a
Switched to a new branch 'a'
$ echo "version 2" > file
$ git commit -a -m "bump to v2"
[a 85dba39] bump to v2
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git checkout -b b master
Switched to a new branch 'b'
$ echo "version 2" > file
$ git commit -a -m "bump to v2 in b"
[b b0fcf46] bump to v2 in b
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git merge a
Merge made by the 'recursive' strategy.          
$ git status                                # shouldn't be clean
On branch b
nothing to commit, working directory clean

2 ответа

Я не думаю, что вы просите, возможно.
Идентичное изменение - идентичное изменение - идентичное изменение.

Есть две вещи, которые приходят на ум, как вы можете обойти вашу проблему:

  1. Заставьте разработчиков оставить комментарий к той же строке, которая содержит что-то уникальное, например, текущее время до секунды, время unix... Что-то, что вряд ли будет одинаковым в обеих ветвях при изменении файла (не используйте что-то конкретное для пользователя, один пользователь может сделать оба изменения и забыть о них)

  2. Используйте хук перед фиксацией. В хуке проверьте, является ли фиксация коммитом слияния, а затем попытайтесь определить, существует ли описанная вами ситуация, когда обе ветви изменили эту строку и в этом случае прервать слияние.

Это звучит больше как проблема процесса, чем проблема с git. Вы должны сделать все возможное, чтобы избежать внесения одинаковых текстовых изменений в несколько коммитов. Это поможет избежать путаницы в истории коммитов во время последующих археологических экспедиций. Вы должны найти способы внести изменения в вашу схему базы данных без такого повторения в вашей истории версий.

Другие вопросы по тегам