В настоящее время я работаю в компании, которая использует VSTS для управления git-кодом. «Рекомендованный» для Microsoft способ объединения веток - это «объединение в сквош», означающее, что все коммиты для этой ветки будут объединены в один новый коммит, включающий все изменения.
Проблема в том, что если я сделаю некоторые изменения в одной ветви для одного элемента журнала невыполненных работ, то сразу же захочу начать вносить изменения в другой ветви для другого элемента журнала невыполненных работ, и эти изменения зависят от набора изменений первой ветви?
Я могу создать ветку для этого элемента журнала и основать ее на первой ветке. Все идет нормально. Тем не менее, когда приходит время создать запрос на извлечение для меня второй ветви, первая ветвь уже была объединена с главной, и, поскольку это было сделано как слияние в виде сквоша, git выдает кучу конфликтов. Это потому, что git не видит исходные коммиты, на которых основана вторая ветвь, он просто видит одно большое слияние сквоша, и поэтому, чтобы объединить вторую ветвь с мастером, он пытается воспроизвести все коммиты первой ветки в Вершина сквоша сливается, вызывая множество конфликтов.
Итак, мой вопрос: есть ли способ обойти это (кроме того, что никогда не основывать одну ветку функций на другой, что ограничивает мой рабочий процесс), или объединение в сквош просто нарушает алгоритм объединения git?
feature1
мастером, а затем захотите слитьсяfeature2
позже. В таком случае, не приведет ли первый подход к конфликтам, поскольку git попытается повторно применитьfeature1
коммиты поверх сжатого коммита, тогда как второй позволит git определить, что эти коммиты не нужно объединять?git clone
создания репозитория и копирования моих измененных файлов!), Потому что я разветвлялся из ветви, а затем сопровождающий подавлял первую ветку. На моей работе они также делают сквош слияния. Это означает, что я не могу работать над функцией,b
которая зависит от функции,a
пока функция неa
будет объединена.Сквошное слияние нарушает алгоритм слияния для любых веток, которые содержат любые коммиты, которые были удалены сквошем. Иными словами, ребазы являются вирусными. Если вы перебазируете одну ветку, вам нужно перебазировать любые другие ветви, которые зависели от этой ветви. Если вы используете rerere , любые конфликты слияния, которые вы решили вручную в своем локальном репо, не нужно будет снова решать вручную, но это не поможет с конфликтами, разрешенными другими людьми.
Вот почему наше неписанное правило гласит, что все в порядке, если никто больше не зависел от вашей ветки функций, что может быть в 90% случаев. В противном случае прямое слияние помогает всем избежать проблем.
источник
feature-xyz
филиал. Вы можете создатьfeature-xyz-squashed
ветку, начинающуюся с того же коммита, что иfeature-xyz
ветка,git cherry-pick
коммиты изfeature-xyz
вfeature-xyz-squashed
, раздавить их там и объединитьfeature-xyz-squashed
сmaster
. Вы не должны сливатьсяfeature-xyz
тогда. Иногда вышеупомянутое имеет смысл (например, вы не хотите включать коммиты с паролем), но это обходной путь, вряд ли лучший способ.