我知道修改旧Git提交的正确方法是使用rebase --interactive
,但为了更清楚地理解概念,我想了解当我执行以下操作时会发生什么:
git checkout <commit>
- 更改文件中的某些内容
- 将更改的文件添加到索引中
- 然后执行
git commit . --amend
当我这样做时,它不是修改提交,而是在该提交的父级上创建一个新提交。
这只是Git告诉我不能修改已经有子提交的提交吗?
我知道修改旧Git提交的正确方法是使用rebase --interactive
,但为了更清楚地理解概念,我想了解当我执行以下操作时会发生什么:
git checkout <commit>
git commit . --amend
当我这样做时,它不是修改提交,而是在该提交的父级上创建一个新提交。
这只是Git告诉我不能修改已经有子提交的提交吗?
git checkout B
后,您处于以下情况:
(你的 HEAD
已经分离,但这并不是重点。) 无论你是否进行更改和暂存,运行 git commit --amend
都会让你处于这种情况:
提交 D
可能与 B
非常相似;特别是,它可能具有完全相同的补丁、完全相同的提交信息等。然而,(提交、作者)时间戳通常会不同(除非您可以在一秒内修改提交!),这意味着 D
的 SHA-1 与 B
的 SHA-1 不同;如果两个提交的 SHA-1 不同,它们就不是同一个提交。
B
是C
的父提交时,我们指的是C
通过其SHA引用了B
提交。
然而,C
提交无法知道D
提交的SHA,因为D
提交是在C
提交之后创建的。因此,D
不能成为C
的父提交。这就是为什么D
提交会走向一个分支,并且没有任何后代的原因。
如果B'
与B
只有轻微的不同,您应该使用git rebase -i
而不是git commit --amend
。