Разрешение конфликтов слияния над новым кодом - PullRequest
5 голосов
/ 26 января 2012

Допустим, у меня есть некоторый заказанный код, но заказ не является техническим требованием.

apple
kiwi
strawberry

И затем у меня есть две темы, которые я хочу объединить, чьи различия выглядят так:

TOPIC BRANCH: orange
  kiwi
+ orange
  strawberry

А также

TOPIC BRANCH: pear
  kiwi
+ pear
  strawberry

Есть ли способ автоматически разрешить эти два патча? Мне кажется, что это конфликт слияния, поскольку они борются за одну и ту же новую линию. Решение, которое я нашел, состоит в том, чтобы переупорядочить одно из изменений, поскольку порядок сортировки является лишь мягким требованием (где фрукты на самом деле являются определениями функций).

 TOPIC BRANCH: pear'
   apple
 + pear
   kiwi

Так что теперь мы можем объединить orange и pear' вместе, чтобы сформировать:

 _ apple
 p pear
 _ kiwi
 o orange
 _ strawberry

Существуют ли другие способы решения этой проблемы, позволяющие сохранить порядок? Я также подумал о том, что pear должен быть нисходящий от orange, так что orange всегда получает приоритет и больше не будет конфликта слияния. Но это ложная зависимость, поскольку orange и pear - две отдельные ветви функций.

Один может быть включен в магистраль раньше другого, но это не относится к ветвям интеграции.

Редактировать: Меня осенило два куска, которые можно сохранить (возможно, дополнения?), Может быть две стратегии слияния под названием «я первый» и «ты первый», так что неоднозначный порядок может быть решен без интерактивно между двумя ветвями.

Ответы [ 2 ]

7 голосов
/ 16 февраля 2012

Основной подход состоит в том, чтобы определить пользовательский инструмент слияния, а затем использовать функцию атрибутов git, чтобы указать git использовать этот пользовательский инструмент слияния для этих файлов.

Пример:

  1. создать тестовое хранилище:

    $ git init t
    $ cd t
    
  2. определить пользовательский инструмент слияния с именем mymerge:

    $ git config merge.mymerge.name "my custom merge tool"
    $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'"
    

    Вышеупомянутый инструмент объединения объединяет файлы, сортирует результирующие строки, а затем удаляет повторяющиеся строки. Если вы не хотите менять порядок, замените приведенную выше команду на собственный скрипт, который делает то, что вы хотите. См. git help attributes для получения дополнительной информации.

  3. скажите git, что вы хотите использовать mymerge при объединении любого файла с именем foo.txt в хранилище:

    $ echo "foo.txt merge=mymerge" >.gitattributes
    $ git add .gitattributes
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt"
    
  4. сделать несколько тестовых данных по трем веткам:

    $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt
    $ git add foo.txt
    $ git commit -m "common ancestor version of foo.txt"
    $ git checkout -b orange
    $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt
    $ git commit -a -m "add orange"
    $ git checkout -b pear master
    $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt
    $ git commit -a -m "add pear"
    
  5. объединить ветви (обратите внимание, нет конфликтов!):

    $ git checkout master
    $ git merge orange
    $ git merge pear
    
  6. выгода!

    $ cat foo.txt
    apple
    kiwi
    orange
    pear
    strawberry
    
0 голосов
/ 27 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...