Как изменить 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
с указанным выше ограничением.