Почему в истории коммитов появляется запись "merge branch"?

Можно переформулировать вопрос следующим образом:
Как исправить появление дополнительного коммита о слиянии веток после операции Revert "Revert", которое не отображалось ранее? Возникла ли данная проблема из-за ошибки или это ожидаемое поведение системы?
  • 19 августа 2024 г. 9:33
Ответы на вопрос 2
Появление записи "merge branch" в истории коммитов обычно связано с операцией слияния веток в Git. Эта запись появляется, когда происходит слияние изменений из одной ветки в другую. 

Что касается появления дополнительного коммита о слиянии веток после операции Revert "Revert", данная проблема обычно не является ошибкой, а скорее ожидаемым поведением системы. Когда вы отменяете отмену (Revert "Revert") какого-либо коммита, Git может создавать дополнительный коммит о слиянии веток, чтобы объединить изменения из разных версий истории коммитов.

Для исправления данной проблемы вы можете использовать команду git rebase с параметром --interactive, чтобы переписать историю коммитов и исключить ненужные слияния. Однако будьте осторожны, так как переписывание истории коммитов может привести к потере данных или созданию конфликтов. Важно иметь резервные копии перед выполнением подобных операций.
Это - не баг, это - результат ваших (непродуманных?) действий. 
Revert (в отличие от reset) создаает commit. Поэтому у вас в main появилась цепочка commit после точки разделения (можете посмотреть любым средством просмотра веток - да хоть git log: git log с ключом --graph после слияния покажет это достаточно наглядно. Слить такие ветки быстрой перемоткой (fast-forward), как вам удавалось делать раньше, не получится, поэтому gitу приходится создавать merge commit с двумя родителями - исходными указателями сливаемых веток.
Основных способов выйти их такого положения - два.
Первый - сбросить указатель ветки main на точку разделения: переключиться на нее и выполнить git reset. Если вы действительно делали только отмену (revert) и отмену отмены, то вы ничего не должны потерять. Если опасаетесь потерять - создайте перед сбросом еще одну ветку на базе текущего main, потом вытащите в случае чего изменения из нее (а вообще-то в git зафиксированные изменения так сразу не теряются, и можно обычно вытащить их даже при отсутсвии ветки).
Второй способ - перебазировать (git rebase) ветку update на текущий указатель ветки main. Правда, в этом варианте у вас останутся в истории обе ваши отмены.
После этого вы сможете выполнить так нравящееся вам слияние быстрой перемоткой.
PS Есть ещё и третий вариант решения - забрать изменения из update в main с помощью cherry-pick, но в данном случае это - лишние заморочки IMHO.
Похожие вопросы