2013-12-03 6 views
0

Моя команда и я используем git около года - никто из нас не имел опыта работы с git или любым другим контролем версий. Мы выполняем большую часть нашей работы в dev, и когда мы будем готовы, мы создаем ветвь релиза, при необходимости вносим какие-либо изменения, а затем объединяем ветвь release в master. Когда мы объединяем наши ветви релиза в master, мы выполняем сквош-слияние, чтобы сохранить историю фиксации чистой. Мы прочитали много руководств/учебников/инструкций, и каждый из них говорит что-то другое, но это то, что мы решили сделать.Объединить конфликты при использовании сквош-слияния

Что я заметил - всякий раз, когда мы объединяем нашу ветвь релиза в master, мы всегда получаем конфликты слияния. Не с каждым файлом, а с примерно 15% из них или около того. Большинство из них не похоже, что они должны быть конфликтами, но они появляются как единое целое. Вот пример:

Мастер ветви до слияния:

<div style="float:right"> 
    <strong>Select Report: </strong> 
    <select name="report" id="report"> 
     <option value="">-- SELECT REPORT --</option> 
     <optgroup label="General"> 
      <option value="aganalysis_stats"<?php if($report == 'aganalysis_stats') echo " selected"; ?>>AgAnalysis Stats</option> 
     </optgroup> 
     <optgroup label="LSPs"> 
      <option value="lsps_pending_approval_for_current_quarter"<?php if($report == 'lsps_pending_approval_for_current_quarter') echo " selected"; ?>>LSPs Pending Approval for Current Quarter</option> 
      <option value="members_requiring_lsps"<?php if($report == 'members_requiring_lsps') echo " selected"; ?>>Members Requiring LSPs</option> 
      <option value="missing_lsps_for_current_quarter"<?php if($report == 'missing_lsps_for_current_quarter') echo " selected"; ?>>Missing LSPs for Current Quarter</option> 
     </optgroup> 
     <optgroup label="UCCs"> 
      <option value="uccs_by_branch"<?php if($report == 'uccs_by_branch') echo " selected"; ?>>UCCs by Branch</option> 
      <option value="uccs_eligible_for_renewal"<?php if($report == 'uccs_eligible_for_renewal') echo " selected"; ?>>UCCs Eligible for Renewal</option> 
      <option value="uccs_expired"<?php if($report == 'uccs_expired') echo " selected"; ?>>Expired UCCs</option> 
     </optgroup> 
    </select> 
</div> 

Мастер ветвь после слияния:

<div style="float:right"> 
    <strong>Select Report: </strong> 
    <select name="report" id="report"> 
     <option value="">-- SELECT REPORT --</option> 
     <optgroup label="Appraisal Requests"> 
      <option value="appraisal_request_stats">Appraisal Request Stats</option> 
     </optgroup> 
     <optgroup label="General"> 
      <option value="aganalysis_stats">AgAnalysis Stats</option> 
     </optgroup> 
     <optgroup label="LSPs"> 
      <option value="lsps_pending_approval_for_current_quarter">LSPs Pending Approval for Current Quarter</option> 
      <option value="members_requiring_lsps">Members Requiring LSPs</option> 
      <option value="missing_lsps_for_current_quarter">Missing LSPs for Current Quarter</option> 
     </optgroup> 
     <optgroup label="UCCs"> 
<<<<<<< HEAD 
      <option value="uccs_by_branch"<?php if($report == 'uccs_by_branch') echo " selected"; ?>>UCCs by Branch</option> 
      <option value="uccs_eligible_for_renewal"<?php if($report == 'uccs_eligible_for_renewal') echo " selected"; ?>>UCCs Eligible for Renewal</option> 
      <option value="uccs_expired"<?php if($report == 'uccs_expired') echo " selected"; ?>>Expired UCCs</option> 
======= 
      <option value="uccs_by_branch">UCCs by Branch</option> 
      <option value="uccs_eligible_for_renewal">UCCs Eligible for Renewal</option> 
      <option value="uccs_expired">Expired UCCs</option> 
>>>>>>> refs/remotes/origin/dev 
     </optgroup> 
    </select> 
</div> 

Как вы можете видеть, я сделал точно такие же изменения на обоих " LSPs "и" UCCs ". Но в группе опций «UCCs» я получаю конфликт слияния. Почему я получаю конфликт слияния? Я сливаю неправильно? Должен ли я использовать сквош-слияние при объединении ветвей в мастер? Я читал так много вещей о переустановке, компрометации, отсутствии быстрой перемотки вперед и т. Д., Я не знаю, что правильно или неправильно.

+2

whould recomment using 'git config --global merge.conflictstyle diff3', позволит вам увидеть исходный код + оба изменения –

+0

Я не знал, что он существует. После некоторого googling, он выглядит намного чище! – Jeff

ответ

0

Позвольте мне попытаться ответить на эти вопросы ... Надеюсь, это поможет.

Почему я получаю этот конфликт слияния?

Потому что git обнаружил, что то, что пытается слиться, настолько отличается, что вам нужно вмешаться и сказать, какой именно код должен быть там. Параметры, которые он дал вам, это то, что git имеет на master (выше =======) и что находится в вашей ветке (ниже =======).

Вы можете выбрать один или внести дополнительные изменения, сохранить файл и зафиксировать файл с новым сообщением (как правило, что-то вроде строки «fixing merge conflict by ...»).

Я сливаю неправильно?

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

Должен ли я использовать сквош-сливание при объединении ветвей в мастер?

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

+0

Хорошо - это имеет смысл.Но то, что я до сих пор не понимаю, - это то, почему git смог обработать изменения в группе opts группы LSP, но не в группе opt UCCs. У меня были другие случаи, когда комментирование строки (// некоторый код) вызывало конфликт слиянием. Я мог понять конфликт, если весь блок кода изменился, но когда простые изменения сделаны в одной строке, я просто думаю, что git будет достаточно умным, чтобы понять это. – Jeff

+0

Скорее всего, изменения кода LSP были менее значительными, чем изменения UCC, поэтому они были автоматически объединены. – CDub

+0

Я думаю, я смущен, потому что я удалил одну и ту же вещь из обеих групп тегов «option» и просто не понимаю, зачем работать, а другой - нет. Думаю, мне просто нужно признать, что так работает git: лучше быть в безопасности, чем сожалеть. – Jeff

Смежные вопросы