假设我有一个提交消息的日志。有没有办法可以修改第一个提交消息?或者这就是为什么我们将第一次提交作为初始提交,因为它无法完成。
答案 0 :(得分:4)
您实际上无法更改 任何提交。什么“修改”(或交互式rebase中的“reword”)是提交一个新的,不同的副本。在此副本中,您可以准确地更改需要更改的内容,其余所有内容都相同。
这里的问题是所有后续提交最终都会指向您原来的第一次提交,而不是副本。例如,假设有三个提交。我们称他们为A
,B
和C
。分支标签master
指向提交C
。但是提交C
指向B
,B
指向A
。由于A
是初始提交,因此链在这里结束(这就是你知道提交是初始提交的方式:它指向没有人。)
A <- B <- C <-- master
您现在建议将提交A
复制到某个新提交,我们称之为A'
:
A <- B <- C <-- master
A'
为了使其有用,您现在还必须复制B
和C
,每个都进行一次更改:B
的副本,我们将其称之为{ {1}}必须指向B'
,A'
的副本必须指向C
:
B'
以这种方式复制每个提交后,您可以将标签A <- B <- C <-- master
A' <- B' <- C'
更改为指向最后一个副本(此处为master
):
C'
现在放弃原始的A <- B <- C
A' <- B' <- C' <-- master
提交链是安全的,因为您复制了所关注的所有内容,同时进行了必要的更改,以使新的A-B-C
链看起来像你想要它。
执行此操作直到root提交的方法是使用A'-B'-C'
。但是,与所有重新定位或任何其他“编辑历史记录”的方式一样,对于那些获得早期发布的作品副本并且认为您仍然提交git rebase -i --root
而非新{{}}的人来说,这将会引起很大的麻烦。 1}}序列。因此,如果您的存储库被其他人克隆或推送给其他人,请不要这样做 - 或者至少在没有先与他们讨论的情况下不这样做。