修改为分离的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,则它们不是相同的提交。

    当我们说BC的父提交时,我们的意思是提交C引用提交B的SHA。 然而,提交C没有办法知道任何关于提交D的SHA,因为提交D是在C之后创建的。 因此, D不能是C的父母。 这就是为什么提交D切线并没有任何后代的原因。


    如果你想在以下状态下降落,

    在这里输入图像描述

    B'甚至只与B略有不同,你应该使用git rebase -i ,而不是git commit --amend

    链接地址: http://www.djcxy.com/p/49865.html

    上一篇: amend in detached HEAD state

    下一篇: Retroactively rename branch?