Можно ли переписать очень старую историю git для ветки разработки?

Я использую git-поток. Я установил несколько правил, как сохранить историю git в чистоте, потому что я генерирую журнал изменений из этих коммитов.

Но некоторые старые коммиты (сделанные непосредственно для разработки) или объединенные ветки функций не следуют этим правилам. Есть ли какой-нибудь простой способ раздавить эти старые коммиты, не затрагивая все текущие ветки (мастер, теги версий и т. д.)?

Я знаком с перебазированием внутри веток функций, но не могу представить, как это сделать внутри ветки разработки/мастера.


person Dawe    schedule 18.03.2019    source источник
comment
В общем, нет, нет способа вернуться в историю и переписать ее, не оказав какого-либо влияния на существующие ветви, которые зависят от этой истории. Если вы хотите логически удалить некоторые старые коммиты, рассмотрите возможность использования git revert. Двигаясь вперед, просто постарайтесь соблюдать правила этикета при использовании Git, чтобы избежать подобных ситуаций в будущем.   -  person Tim Biegeleisen    schedule 18.03.2019


Ответы (1)


Нет. Git — это простая цепочка блоков, в которой каждый блок (коммит) содержит в себе ссылку на идентификатор предыдущего блока. В Git идентификаторы блоков — это просто хэш их содержимого, поэтому, когда вы меняете содержимое, даже немного, хэш меняется, а значит, и идентификатор. Поскольку родительский идентификатор является частью содержимого блока, вы не можете изменить эти ранние блоки, не изменив при этом все последующие блоки. Изменение родителя означает, что вам нужно изменить дочерний элемент, а значит, вам нужно изменить дочерние элементы и т. д.

Это вполне возможно, но это вызовет большие головные боли у всех, кто работает над функциональной веткой, основанной на старых коммитах. Это также сломает все ваши теги, которые будут по-прежнему указывать на исходные коммиты, если вы не удалите и не создадите заново каждый из них, что может сломать любого, кто делал сборки и т. Д., От старых указателей тегов.

По сути, вам просто придется жить с запутанной историей, которая отказывается соответствовать более современным принципам. Вроде как реальная жизнь.

Единственным исключением из этого правила является то, что вы можете найти способ взломать исходные коммиты, чтобы сгенерировать коллизии хешей. Это заставит следующие коммиты думать, что они все еще указывают на исходные коммиты. Это было бы нелегко осуществить и почти наверняка нежелательно, поскольку взломанные коммиты выглядели бы беспорядочно, но Git использует SHA-1, который был взломан, поэтому он технически возможно.

person JDB still remembers Monica    schedule 18.03.2019