Почему я не могу использовать git merge --squash с --no-ff?

Я пытаюсь использовать git merge -squash с параметром -no-ff, но git не разрешает. Кто-нибудь может мне помочь?

Я не могу использовать быстрое слияние вперёд, и мне нужно использовать параметр -squash для группировки множества коммитов, которые были сделаны в другой ветке.

Спасибо!

Ответ 1

Вероятно, это не позволяет вам, потому что такая команда не имеет смысла.

В документации для --squash говорится (основное внимание):

- кабачки
Создайте рабочее дерево и индексное состояние , как если бы произошло реальное слияние (за исключением информации о слиянии), , но на самом деле не совершать фиксацию или перемещать HEAD, а также не записывать GIT_DIR/MERGE_HEAD, чтобы вызвать следующую команду git commit для создания фиксации слияния. Это позволяет создать единую фиксацию поверх текущей ветки, эффект которой совпадает с объединением другой ветки (или более в случае осьминогов).

Флаг --no-ff:

Создайте фиксацию слияния, даже когда слияние будет разрешено как перемотка вперед.

Вы по существу просите git совершить фиксацию и НЕ совершить фиксацию в одно и то же время.

Если вы хотите сохранить всю историю своего ветки, вы должны использовать флаг --no-ff. Commit d - это слияние, состоящее из двух родителей: a и c.

a ------ d -- ....
 \      /
  b -- c  

Если вы хотите, чтобы все коммиты на этой ветке обрабатывались как единое целое, используйте --squash. Commit d - это регулярное коммитирование, которое содержит все изменения от коммитов b и c, но имеет только один родитель, a.

a ---- d -- ....
 \      
  b -- c  

Ответ 2

Что делает --squash? - он сжимает все коммиты вместе, создает ваше индексное состояние, так что вы можете зафиксировать все изменения из ветки как единую фиксацию. Изменение вашего кода будет похоже на то, что вы объединили ветку, но ваша история будет такой, как вы сделали одну огромную фиксацию.

Что делает --no-ff? - говорит он, даже если ветвь может быть переадресована, обработайте ее как слияние и создайте фиксацию слияния.

Таким образом, --squash заключается в получении истории без следа слияния. --no-ff заключается в форсировании истории слиянием, даже когда она пересылается. Таким образом, они являются взаимоисключающими и не могут использоваться вместе.

Я думаю, что вопрос возникает из-за непонимания fast-forward. Это не слияние; он просто перенаправляет ветвь непосредственно на другую фиксацию из объединенной ветки, потому что фиксации были сделаны непосредственно на коммитах в прежней ветки. Никакая быстрая перемотка не останавливает это поведение и заставляет слияние совершать сверху. Когда вы раздавливаете, не имеет значения, просите ли вы его не перескочить вперед. Это было бы одинаково в любом случае.

Ответ 3

Этот ответ не связан с вашим актуальным вопросом:

Почему я не могу использовать git merge --squash с --no-ff?

как это было уже правильно ответили.

Скорее, чтобы прояснить, что то, к чему вы стремились, действительно возможно с немного другим подходом: вы бы сначала перебазировали интерактивную ветку вашей функции (например, чтобы раздавить все ваши коммиты), а после этого вы можете выполнить git merge --no-ff the branch on мастер.