Git: как сквоировать коммиты, которые связаны между собой?
Я работаю над ветвью функций.
- Сделано несколько коммитов. Squashed совершает.
- Внесенные изменения в удаленную ветвь. Получены конфликты.
- Объединенные изменения из главного, разрешенные конфликты в ветки функции. (git fetch начальный мастеp > git merge FETCH_HEAD > разрешенные конфликты вручную > git commit > git push)
- Я сделал еще одну фиксацию.
Итак, текущая история фиксации выглядит так.
От текущего до старого:
- commit 3
- commit M yyy (Объединенный)
- commit 2
Как я сквошу выше 3 коммиттов в 1, прежде чем объединить мою ветку функций для управления?
Ответы
Ответ 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-> С
(только один коммит, который был перебазирован с источником!)
Я надеюсь, что это помогает кому-то еще с той же проблемой.