Подтвердить что ты не робот

Git: как сквоировать коммиты, которые связаны между собой?

Я работаю над ветвью функций.

  • Сделано несколько коммитов. Squashed совершает.
  • Внесенные изменения в удаленную ветвь. Получены конфликты.
  • Объединенные изменения из главного, разрешенные конфликты в ветки функции. (git fetch начальный мастеp > git merge FETCH_HEAD > разрешенные конфликты вручную > git commit > git push)
  • Я сделал еще одну фиксацию.

Итак, текущая история фиксации выглядит так. От текущего до старого:

  • commit 3
  • commit M yyy (Объединенный)
  • commit 2

Как я сквошу выше 3 коммиттов в 1, прежде чем объединить мою ветку функций для управления?

4b9b3361

Ответ 1

Вы можете rebase -i начинать с родителя commit 2 (то есть, commit на master, с которого вы разветвлялись). Вероятно, вам придется повторно разрешать конфликты, когда вы переходите к фиксации слияния.

Итак, если ваша история выглядит как

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)

Начните с git rebase -i A. Вы увидите список коммитов, включая как master, так и your_branch, но не фиксацию слияния. pick первый (B или C, в зависимости от времени) и squash остальные.

Ответ 2

В моем случае я начал работать с веткой, в которой было несколько коммитов, затем слияние с веткой main/source, затем больше коммитов, и я хотел раздавить все коммиты, но продолжал сталкиваться с ошибкой из-за коммита слияния:

ошибка: коммит - это слияние, но опция -m не указана.

-> C1-> C2-> M (объединить с веткой источника) → C3-> C4

Возможно, есть лучший способ (и я с нетерпением жду обучения), но после долгих чтений, проб и ошибок я сделал то, что создал копию ветки для справки, а затем вернул текущую ветку в C1,

сброс --hard (C1-хэш)

затем сбор вишни C2, C3, C4, затем сдавливание, затем перебазировка... в результате:

M-> С

(только один коммит, который был перебазирован с источником!)

Я надеюсь, что это помогает кому-то еще с той же проблемой.