如何使用git更改特定提交的SHA-1?

时间:2011-08-16 07:39:32

标签: git

目标提交可能包含父项和后代。

它需要替换旧的提交到位

所以它不像cherry命令那么简单。

我的问题将等待完全解决方案。

3 个答案:

答案 0 :(得分:4)

不,你做不到。

SHA-1的目的是防止这些变化。整个git体系结构依赖于SHA-1在所有git存储库中唯一标识对象的假设。没办法解决这个问题(不是没有重新设计所有东西,就是这样)。

详细信息在Git Magic book中说明。

答案 1 :(得分:0)

我不熟悉Git,但在Mercurial中,您可以这样做:从存储库中弹出最新的提交并将其保存在“补丁”(hg qimport)中。结果是repo没有任何最新提交的痕迹加上一个可以给你起始状态的补丁。

所以配方将是从repo中弹出东西,直到修改提交变为HEAD。 Pop也可以修改补丁(或者在没有提交的情况下应用补丁并修改工作区)。

现在您可以提交新版本并应用所有其他补丁。

由于Git和Mercurial非常相似,可能有一个Git命令来实现相同但我不知道它的名字。也许这个答案可以提供帮助:https://serverfault.com/questions/12373/how-do-i-edit-gits-history-to-correct-an-incorrect-email-address-name

答案 2 :(得分:0)

好的,让我们看看这是否有帮助。

警告:

  • 这个中断(某些)拉/推/取。
  • 并非所有git命令都支持此功能。
  • 不与其他用户分享。
  • 这不会改变提交,而是替换它。

你确定要这么做吗? 如果是,请向下滚动。


这称为graft point。您创建文件.git/info/grafts并具有以下信息:

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

假设你有这个:

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

现在您要将B替换为D(不更改提交ID),将其置于移植中:

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

它保留旧的commitid,并具有上述限制。