Я использую git-поток. Я установил несколько правил, как сохранить историю git в чистоте, потому что я генерирую журнал изменений из этих коммитов.
Но некоторые старые коммиты (сделанные непосредственно для разработки) или объединенные ветки функций не следуют этим правилам. Есть ли простой способ раздавить эти старые коммиты, не затрагивая все текущие ветки (мастер, теги версии и т. д.)?
Я знаком с перебазированием внутри веток функций, но не могу представить, как это сделать внутри ветки разработки/мастера.
Нет. Git — это простая цепочка блоков, в которой каждый блок (фиксация) содержит в себе ссылку на идентификатор предыдущего блока. В Git идентификаторы блоков — это просто хеш их содержимого, поэтому, когда вы меняете содержимое, даже немного, хэш меняется, а значит, и идентификатор. Поскольку родительский идентификатор является частью содержимого блока, вы не можете изменить эти ранние блоки, не изменив также все последующие блоки. Изменение родителя означает, что вам нужно изменить дочерний элемент, а значит, вам нужно изменить дочерние элементы и т. д.
Это вполне возможно, но это вызовет большие головные боли у всех, кто работает над функциональной веткой, основанной на старых коммитах. Это также сломает все ваши теги, которые будут по-прежнему указывать на исходные коммиты, если вы не удалите и не создадите заново каждый из них, что может сломать любого, кто делал сборки и т. д., От старых указателей тегов.
По сути, вам просто придется жить с запутанной историей, которая отказывается соответствовать более современным принципам. Вроде как реальная жизнь.
Единственным исключением из этого правила является то, что вы можете найти способ взломать эти исходные коммиты, чтобы сгенерировать хэш-коллизии. Это заставит следующие коммиты думать, что они все еще указывают на исходные коммиты. Это было бы нелегко осуществить и почти наверняка нежелательно, так как взломанные коммиты выглядели бы как беспорядок, но Гит использует SHA-1, который был взломан, так что технически это возможно.
В общем, нет, нет способа вернуться в историю и переписать ее, не оказав какого-либо влияния на существующие ветви, которые зависят от этой истории. Если вы хотите логически удалить некоторые старые коммиты, рассмотрите возможность использования
git revert
. Двигаясь вперед, просто постарайтесь соблюдать правила этикета при использовании Git, чтобы избежать подобных ситуаций в будущем.