Нет. Git — это простая цепочка блоков, в которой каждый блок (коммит) содержит в себе ссылку на идентификатор предыдущего блока. В Git идентификаторы блоков — это просто хэш их содержимого, поэтому, когда вы меняете содержимое, даже немного, хэш меняется, а значит, и идентификатор. Поскольку родительский идентификатор является частью содержимого блока, вы не можете изменить эти ранние блоки, не изменив при этом все последующие блоки. Изменение родителя означает, что вам нужно изменить дочерний элемент, а значит, вам нужно изменить дочерние элементы и т. д.
Это вполне возможно, но это вызовет большие головные боли у всех, кто работает над функциональной веткой, основанной на старых коммитах. Это также сломает все ваши теги, которые будут по-прежнему указывать на исходные коммиты, если вы не удалите и не создадите заново каждый из них, что может сломать любого, кто делал сборки и т. Д., От старых указателей тегов.
По сути, вам просто придется жить с запутанной историей, которая отказывается соответствовать более современным принципам. Вроде как реальная жизнь.
Единственным исключением из этого правила является то, что вы можете найти способ взломать исходные коммиты, чтобы сгенерировать коллизии хешей. Это заставит следующие коммиты думать, что они все еще указывают на исходные коммиты. Это было бы нелегко осуществить и почти наверняка нежелательно, поскольку взломанные коммиты выглядели бы беспорядочно, но Git использует SHA-1, который был взломан, поэтому он технически возможно.
person
JDB still remembers Monica
schedule
18.03.2019
git revert
. Двигаясь вперед, просто постарайтесь соблюдать правила этикета при использовании Git, чтобы избежать подобных ситуаций в будущем. - person Tim Biegeleisen   schedule 18.03.2019