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

Недавно мы мигрировали с SVN -> Git (используя Stash). После миграции мы начали замечать проблемы во время слияния, когда некоторые разработчики портят слияние в своей функциональной ветке.

**Our workflow model:-**

master    1---2----3------------4----5
            | |        |   |    |    | 
            | |        M   |    |    |  
feature1    | a--------b---     |    | 
            |                   M    |
feature2    c-----------------d-------

На приведенном выше рисунке допустим, что у developer1 есть функциональная ветвь feature1 , он внес свои изменения и снова объединился для разработки.

У Developer2 есть ветка, которая была создана до ветки developer1, но будет существовать дольше. Как только изменения внесены, он загружает изменения из master в свою ветку, разрешает любые конфликты, а затем снова объединяется.

Проблема в том, что когда developer2 объединяет изменения в свою локальную ветку, он разрешает конфликты слияния, отдавая предпочтение своим собственным файлам. Однако на самом деле это переопределяет некоторые файлы, которые он не изменил. Когда он создает запрос на вытягивание и сливается обратно с мастером, он эффективно откатывает изменения developer1 к предыдущей версии. Мы можем запустить это, потому что файл фактически откатывается к предыдущему идентификатору фиксации (SHA).

Вопрос в том,

  1. есть ли способ избежать этого систематически, т.е. попросить git отклонить любые изменения в мастере, где идентификатор изменения SHA на самом деле является откатом.
  2. Есть ли способ при слиянии, когда разработчики получают конфликты только на те файлы, которые они изменили

Мой гуглинг привел меня к статьям, в которых предлагалось выполнить git pull с параметром --rebase или изменить разрешение на основную ветку, чтобы они разрешали только быстрые слияния. Поможет ли любой из вариантов.


person Biswajit_86    schedule 17.08.2014    source источник
comment
Скажите разработчикам, чтобы они прекратили использовать --ours или подобные флаги и действительно объединяли изменения, а не просто сбрасывали их. Чтобы требовать быстрого слияния, необходимо, чтобы ветки функций были перебазированы перед слиянием (что по-прежнему потребует слияния и все еще может быть испорчено).   -  person Etan Reisner    schedule 18.08.2014
comment
если ваши разработчики не понимают, что такое слияние, они абсолютно не поймут и перебазирование, что нанесет гораздо больший ущерб. даже не упомяните rebase.   -  person Eevee    schedule 18.08.2014
comment
Ни один oe не использует --ours или подобные флаги при слиянии. Проблема в том, что у нас есть в основном 3 инструмента для использования git. Многие люди используют черепаховый git, многие другие используют git bash, а некоторые другие используют eclipse/intellij ides для выполнения своей работы с git.   -  person Biswajit_86    schedule 18.08.2014
comment
Итак, я в замешательстве. (a) как разработчикам удается откатывать файлы, которые они не трогали изначально? (б) что вы имеете в виду, файл откатывается к предыдущему идентификатору коммита? (c) почему запрос на включение одобрен, если он портит мастер?   -  person Eevee    schedule 18.08.2014
comment
(a) разработчики технически не откатывают файлы. Когда возникают конфликты слияния, они иногда выбирают свою версию вместо удаленной. (c) Это должно быть зафиксировано в запросе на вытягивание, но бывают случаи, когда у нас есть изменения в более чем 50-100 файлах, и рецензенты не следят за тем, чтобы все 100 файлов были частью этого изменения. Наши утверждающие запросы на вытягивание — это сотрудники отдела контроля качества, которые одобряют любой запрос на вытягивание, если он был успешно протестирован (открыто для интерпретации).   -  person Biswajit_86    schedule 18.08.2014
comment
@Eevee (b) Когда в git создается запрос на вытягивание, а файл, являющийся частью запроса на вытягивание, является предыдущей версией, Git не добавляет его в качестве фиксации. Он ловко скрывает последний коммит из истории. Так, например, если файл имеет идентификаторы sha a, b, c в истории, а новый запрос на вытягивание добавляет фиксацию b, после того, как запрос будет одобрен, вы увидите только идентификатор фиксации a и b, если вы запустите журнал git для файла.   -  person Biswajit_86    schedule 18.08.2014
comment
(a) вы сказали, что это происходит с файлами, которые ваши разработчики не меняли, и в этом случае git не должен даже считать их конфликтующими. (c) ваши рецензенты обязательно должны быть разработчиками. проверка кода бесполезна, если ее не проверяют люди, которые понимают код.   -  person Eevee    schedule 18.08.2014
comment
@Eevee, я согласен с (c), но, к сожалению, я не имею никакого контроля или права голоса в этом процессе. Вот почему я пытаюсь найти процесс или безопасную и надежную команду git, чтобы я мог обработать ее до того, как она отправится в запрос на извлечение.   -  person Biswajit_86    schedule 18.08.2014
comment
нет ни одного. именно для этого требуются пулл-реквесты. лучшее, что вы можете сделать, это отчитать разработчиков, которые этим занимаются.   -  person Eevee    schedule 18.08.2014
comment
Хорошее тестовое покрытие и запуск тестов в CI по запросу на вытягивание помогут, но универсального решения не существует.   -  person steveax    schedule 11.06.2015


Ответы (1)


Добро пожаловать в гит. здесь вы понимаете, что это не волшебство, проблемы слияния не исчезли, и вам по-прежнему нужно сливать, как вы делали это всегда.

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

Я бы порекомендовал обзоры кода, которые являются обязательными для всех push-запросов обратно к источнику или слиянию с мастером. Один из обзоров будет заключаться в проверке истории, чтобы увидеть, произошли ли какие-либо такие переопределения с соответствующими порицаниями.

person gbjbaanb    schedule 17.08.2014
comment
Я полностью согласен, и это то, что я пытаюсь сделать. То, что я ищу, - это способ автоматически проверять историю, чтобы проверить, произошло ли какое-либо переопределение. Некоторые из наших запросов на вытягивание содержат ›100 файлов, и иногда бывает сложно вручную просмотреть историю каждого файла. - person Biswajit_86; 18.08.2014