10

我知道修改旧 Git 提交的正确方法是使用rebase --interactive,但只是为了弄清概念,我想了解当我这样做时会发生什么

  • git checkout <commit>
  • 更改文件中的某些内容
  • 将更改的文件添加到索引
  • 接着git commit . --amend

当我这样做时,它不是修改提交,而是从同一个提交的父级分支一个新的提交。

这只是 Git 告诉我我不能修改已经有子提交的提交的方式吗?

4

1 回答 1

24

在 Git 中,一旦创建提交,它就会一成不变;你不能改变它。你所能做的——通过修改它、挑选它等等——就是创建一个“类似”它的新提交。

我理解您的困惑:“修改”有点用词不当;这有点误导,因为它建议修改一些地方。在 Git 中,修改提交实际上包括创建一个与原始提交具有相同父级的全新提交。

举个例子,让我们假设,在运行之后git checkout B,您处于以下情况:

在此处输入图像描述

(你HEAD是超然的,但这无关紧要。)无论你是否做出改变和阶段改变,跑步git commit --amend都会让你处于这种情况:

在此处输入图像描述

CommitD可能非常非常类似于B; 特别是,它可能具有完全相同的补丁,完全相同的提交消息B等。但是,(提交,作者)时间戳通常会有所不同(除非您可以在一秒钟内修改提交!),这意味着 SHA- 1D将不同于B; 如果两个提交没有相同的 SHA,则它们不是相同的提交。

当我们说B是 的父提交时C,我们的意思是提交C引用B由它的 SHA提交。但是,commitC无法知道关于 commit 的 SHA 的任何信息D,因为 commitD C. 因此,D不能是C的父母。这就是为什么 commitD偏离正题并且没有任何后代。


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

在此处输入图像描述

where B'is even only 略有不同B,你应该使用git rebase -i,而不是git commit --amend

于 2014-09-20T11:41:56.680 回答