我理解修改旧GIT提交的正确方法是使用rebase --interactive
,但为了清楚这些概念,我想了解当我做什么时会发生什么
git checkout <commit>
git commit . --amend
当我这样做时,它不是修改提交,而是从同一提交的PARENT分支新提交。
这只是GIT的方式告诉我,我不能修改已经有子代提交的提交吗?
答案 0 :(得分:17)
在Git中,一旦创建了一个提交,它就会陷入困境;你无法改变它。您所能做的就是创建一个“类似”它的新提交 - 通过修改它,挑选它等等。
我理解你的困惑:“修正”有点用词不当;这有点误导,因为它建议修改一些适当的地方。在Git中,修改提交实际上在于创建一个与原始提交具有相同父级的全新提交。
例如,我们假设在运行git checkout B
之后,您处于以下情况:
(您的HEAD
已分离,但这不是重点。)无论您是否制作并进行更改,运行git commit --amend
都会让您遇到这种情况:
提交D
可能非常非常类似于B
;特别是,它可能具有完全相同的补丁,与B
完全相同的提交消息等。但是,(commit,author)时间戳通常会有所不同(unless you can amend a commit under a second!),这意味着SHA- D
中的1个与B
的不同;如果两个提交没有相同的SHA,则它们不是同一个提交。
当我们说 B
是C
的父提交时,我们的意思是 commit C
引用提交B
的SHA 。
但是,提交C
无法知道有关提交D
的SHA的任何信息,因为提交D
是在 C
之后创建的。因此,D
不能是C
的父级。这就是为什么提交D
在切线上发生并且没有任何后代的原因。
如果您想要以下列状态着陆,
其中B'
与B
略有不同,您应该使用git rebase -i
,而不是git commit --amend
。