Как изменить SHA-1 конкретной фиксации на месте с помощью git?

Целевое коммит может иметь родителей и потомков.

ему нужно заменить старый commit на месте,

так что это не так просто, как команда cherry.

Мой вопрос будет ждать решения точного.

Ответы

Ответ 1

Нет, вы не можете этого сделать.

Точка SHA-1 предназначена для предотвращения таких изменений. Вся архитектура git зависит от того, что SHA-1 однозначно идентифицирует объект во всем репозитории git. Невозможно обойти это (не без перепроектирования всего, то есть).

Подробности объясняются в Git Волшебная книга.

Ответ 2

Я не знаком с Git, но в Mercurial вы можете сделать это: вывести последнюю фиксацию из репозитория и сохранить ее в "патче" (hg qimport). Результатом является репо без каких-либо следов последней фиксации плюс патч, который даст вам начальное состояние.

Таким образом, рецепт будет состоять в том, чтобы поп-материал из репо, пока коммит не изменится, станет HEAD. Поп, который тоже изменит патч (или примените патч без фиксации и изменения рабочей области).

Теперь вы можете зафиксировать новую версию и применить все остальные исправления.

Так как Git и Mercurial очень похожи, возможно, существует команда Git для достижения того же, но я не знаю его имени. Возможно, этот ответ может помочь: https://serverfault.com/questions/12373/how-do-i-edit-gits-history-to-correct-an-incorrect-email-address-name

Ответ 3

Хорошо, посмотрим, поможет ли это.

ВНИМАНИЕ:

  • Этот разрыв (некоторые) pull/push/fetch.
  • Не все команды git поддерживают это.
  • Он не делится с другими пользователями.
  • Это не изменяет фиксацию, она ее заменяет.

Вы действительно хотите это сделать? Прокрутите вниз, если да.


Это называется точкой прививки. Вы создаете файл .git/info/grafts и имеете следующую информацию:

<commit-id> <new-parent-of-the-commit>

Скажем, у вас есть это:

/---D
A---B---C

Теперь вы хотите заменить B на D (без изменения идентификатора фиксации), вы поместите это в трансплантат:

<commit-id-of-C> <commit-id-of-D>

Он сохраняет старый commitid с указанным выше ограничением.