我知道修改旧 Git 提交的正确方法是使用rebase --interactive
,但只是为了弄清概念,我想了解当我这样做时会发生什么
git checkout <commit>
- 更改文件中的某些内容
- 将更改的文件添加到索引
- 接着
git commit . --amend
当我这样做时,它不是修改提交,而是从同一个提交的父级分支一个新的提交。
这只是 Git 告诉我我不能修改已经有子提交的提交的方式吗?
我知道修改旧 Git 提交的正确方法是使用rebase --interactive
,但只是为了弄清概念,我想了解当我这样做时会发生什么
git checkout <commit>
git commit . --amend
当我这样做时,它不是修改提交,而是从同一个提交的父级分支一个新的提交。
这只是 Git 告诉我我不能修改已经有子提交的提交的方式吗?
在 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
。