修改为分离的HEAD状态
我知道修改旧的GIT提交的正确方法是使用rebase --interactive
,但只是为了清楚概念,我想了解当我做什么时会发生什么
git checkout <commit>
git commit . --amend
git commit . --amend
当我这样做时,它不是修改提交,而是从同一提交的PARENT分支一个新的提交。
这只是GIT的方式告诉我,我不能修改已经有子提交的提交吗?
在Git中,一旦创建了一个提交,它就成了石头; 你不能改变它。 你所能做的就是创建一个“类似”它的新提交 - 通过修改,樱桃采摘等等。
我理解你的困惑:“修正”有点用词不当; 这有些误导,因为它表明修改了某些东西。 在Git中,修改提交实际上是创建一个与原始提交具有相同父代的全新提交。
举个例子,让我们假设,在运行git checkout B
,您处于以下情况:
(你的HEAD
是分离的,但那不是重点。)无论你是否创建并改变了阶段,运行git commit --amend
都会使你处于这种情况:
提交D
可能与B
非常非常相似; 特别是,它可能有完全相同的补丁,与B
完全相同的提交消息等。但是,(commit,author)时间戳通常会不同(除非您可以在一秒内修改提交!),这意味着SHA D
-1与B
不同; 如果两个提交不具有相同的SHA,则它们不是相同的提交。
当我们说B
是C
的父提交时,我们的意思是提交C
引用提交B
的SHA。 然而,提交C
没有办法知道任何关于提交D
的SHA,因为提交D
是在C
之后创建的。 因此, D
不能是C
的父母。 这就是为什么提交D
切线并没有任何后代的原因。
如果你想在以下状态下降落,
B'
甚至只与B
略有不同,你应该使用git rebase -i
,而不是git commit --amend
。