Control Freak: фиксация отклонена. Слияние фокстротов запрещено в Bitbucket

В чем именно причина Control Freak: Commit rejected. Foxtrot merges not allowed

Мы продолжаем получать эту ошибку довольно часто, это вызвано комбинацией pull, rebase и amend пользователями при фиксации?

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

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

Как определить зафиксированный тип, например, это была правильная фиксация после rebase, pull или исправления, и что именно является фиксацией и кем?

Мы хотим научить разработчиков избавляться от подобных ошибок при коммитах. Хотелось бы услышать о лучших практиках.

Кроме того, хочу понять, есть ли причина для использования комбинированных инструментов, таких как git-bash / source-tree?

Можем ли мы случайно отключить эту причину?

введите описание изображения здесь


person Mithun Shreevatsa    schedule 14.03.2019    source источник
comment
Должен сказать, что никогда раньше не слышал о слиянии фокстротов. Вот сообщение в блоге, которое, кажется, приносит пользу работа по объяснению. Решение здесь - исправить рабочий процесс Git и прекратить использование слияний фокстрот.   -  person Tim Biegeleisen    schedule 14.03.2019


Ответы (2)


Это связано с слияниями Foxtrot, которые конкретно запрещены на BitBucket. :

Слияние фокстротов - это определенная последовательность коммитов git. Особенно гнусная последовательность. На открытом воздухе, на пышных пастбищах последовательность выглядит так:

https://developer.atlassian.com/blog/2016/04/stop-foxtrots-now/02-foxtrot.png

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

https://developer.atlassian.com/blog/2016/04/stop-foxtrots-now/foxtrot-redrawn.png

Слияния фокстрот плохи, потому что они меняют историю первоисточников origin / master.

Заказываются родители коммита слияния. Первый родитель - HEAD. Второй родительский элемент - это коммит, на который вы ссылаетесь с помощью команды git merge.

Вы можете думать об этом так:

git checkout 1st-parent
git merge 2nd-parent

При нажатии:

https://developer.atlassian.com/blog/2016/04/stop-foxtrots-now/05-foxtrot-pasted.png

Как объяснено в GIT: как я могу предотвратить слияние фокстротов в моей «главной» ветке?, коммит 'D' - это фокстрот объединить, потому что «origin/master» является его вторым родителем.
Это результат извлечения (выборка + слияние)
После того, как это слияние «фокстрот D» проталкивается ... история первого родителя 'origin/master 'больше не содержит фиксации' B '!

Как объяснено torek в как чтобы избежать слияния фокстротов в git, это результат работы непосредственно с master (новый коммит C) и выполнения git pull (вместо pull --rebase, как я всегда советую)

Это объединит B и C в D (слияние фокстротов), что после нажатия означает, что origin/master больше не имеет B в качестве прямого предка, но C.
Ваша работа 'C' теперь становится основной опубликованной историей ветки ( origin/master), а не B, относился к чему-то, что было объединено.

person VonC    schedule 14.03.2019
comment
Спасибо @VonC, но как подробно отслеживать фиксацию - person Mithun Shreevatsa; 14.03.2019
comment
@Mithun фиксация, это история коммитов, которая покажет слияние фокстрот, а не просто фиксацию: git log --all --decorate --oneline --decorate --branches - это начало, чтобы увидеть, что происходит. - person VonC; 14.03.2019
comment
Я могу видеть полную историю, но будет ли указана дата: Foxtrot? - person Mithun Shreevatsa; 14.03.2019
comment
@Mithun Нет: это шаблон слияния, а не термин Git, который может появиться в журналах. - person VonC; 14.03.2019
comment
поможет ли git squash все коммиты в ветке решить эту проблему с фокстротом? - person Mithun Shreevatsa; 14.03.2019
comment
@Mithun Нет: это больше о перебазировании ветки C поверх ветки B, а не слиянии ветки B с веткой C. - person VonC; 14.03.2019
comment
Я обычно делаю это с помощью тяги, и никогда не сталкивался с такими проблемами, но в некоторые дни мы сталкиваемся с этим - person Mithun Shreevatsa; 14.03.2019
comment
@Mithun Можете ли вы попробовать с помощью stackoverflow.com/a/30209750/6309? С pull.rebase и rebase.autoStash вы должны полностью минимизировать / избегать любого ложного слияния, следовательно, избегать любого слияния Foxtrox. - person VonC; 14.03.2019
comment
@Mithun Я имею в виду: что сказал Торек в stackoverflow.com/a/55156429/6309, но мои настройки - это практический ответ на ваш второй вопрос. Я сейчас на работе. Я снова открою ваш вопрос и отвечу на него сегодня же. - person VonC; 14.03.2019
comment
Многие разработчики помечают основные версии, а затем отменяют все промежуточные коммиты. В этом случае блокирование коммитов фокстрот не имеет значения. - person Tim; 24.04.2020
comment
@Tim Я полагаю, BitBucket изначально не имел такого же типа сквоша и процесса слияния, как GitHub (help.github.com/en/github/), что может объяснить, почему они блокируют такое слияние. BitBucket теперь имеет то же самое (atlassian.com/blog/bitbucket / new-features-bitbucket-4-9) - person VonC; 24.04.2020
comment
Хотя это претендует на объяснение ситуации ... для меня это не удается. Я этого не получал. Может быть, только я. Но примеры, объяснения, все здесь слабо и непоследовательно. Почему есть git checktout 1st-parent и git merge 2nd parent, а на картинке коммиты названы A B C? Какая связь между текстом и картинками? Пожалуйста. Больше объяснений. - person Zordid; 13.07.2020
comment
@Zordid Я понимаю. Я соответствующим образом отредактировал ответ. - person VonC; 13.07.2020

Самый простой способ избежать этой проблемы - всегда запускать «git pull --rebase» и никогда не запускать «git pull» по умолчанию. Вот подробное сообщение в блоге об этом: Слишком весело с "git pull --rebase"

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что ваша компания установила бесплатный Control Freak для Bitbucket, и они оставили его значение по умолчанию Контроль Foxtrot Prevention включен для всех веток.

Если вы используете Bitbucket Server 5.5 или новее, вы можете перебазировать запросы на вытягивание прямо с экрана запроса на вытягивание. Нажмите кнопку «...» в дальнем правом углу экрана запроса на включение, и должен стать доступен пункт меню «Rebase».

В качестве альтернативы вы можете попросить администратора отключить защиту от фокстротов. Это могут делать даже администраторы репо (не требуются глобальные администраторы). Но я не рекомендую отключать этот элемент управления, так как он предотвращает беспорядочную историю коммитов.

Полное раскрытие информации: я написал и поддерживаю бесплатный плагин Control Freak для Bitbucket Server.

Примечание: перестановки и исправления никогда не должны вызывать фокстротов. Обычно слияние фокстротов обычно вызывает только команда «git pull» по умолчанию, а «git pull -r» - отличное средство. Команда «git merge» также может вызвать это, но люди редко случайно создают слияние фокстрот при использовании «git merge» в типичных сценариях, требующих «git merge». Я подозреваю, что в 99% случаев причиной проблемы является "git pull".

person G. Sylvie Davies    schedule 30.03.2019
comment
Мы часто сталкиваемся с слиянием фокстротов, когда пытаемся убедиться, что текущая ветвь feature совместима с master путем слияния master с feature. Это предпочтительнее, чем rebasing на master, поскольку последнее часто требует утомительного разрешения конфликтов слияния во многих коммитах ветки feature вместо разрешения их всех за один раз в коммите слияния. Есть ли способ сохранить простоту одного коммита для решения всех проблем, но избежать слияния фокстротов? - person nitzel; 12.12.2019
comment
Когда появляется предупреждение о фокстроте? Когда вы наконец попытаетесь слиться с «мастером»? Или в другое время? - person G. Sylvie Davies; 13.12.2019
comment
При слиянии с мастером (через PR). Должны ли мы переместить это в чат? - person nitzel; 13.12.2019