GIT在分离的HEAD状态下提交--amend

时间:2014-09-20 11:01:30

标签: git commit rebase git-commit amend

我理解修改旧GIT提交的正确方法是使用rebase --interactive,但为了清楚这些概念,我想了解当我做什么时会发生什么

  • git checkout <commit>
  • 更改文件中的内容
  • 将更改的文件添加到索引
  • 然后git commit . --amend

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

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

1 个答案:

答案 0 :(得分:17)

在Git中,一旦创建了一个提交,它就会陷入困境;你无法改变它。您所能做的就是创建一个“类似”它的新提交 - 通过修改它,挑选它等等。

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

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

enter image description here

(您的HEAD已分离,但这不是重点。)无论您是否制作并进行更改,运行git commit --amend都会让您遇到这种情况:

enter image description here

提交D可能非常非常类似于B;特别是,它可能具有完全相同的补丁,与B完全相同的提交消息等。但是,(commit,author)时间戳通常会有所不同(unless you can amend a commit under a second!),这意味着SHA- D中的1个与B的不同;如果两个提交没有相同的SHA,则它们不是同一个提交。

当我们说 BC 的父提交时,我们的意思是 commit C引用提交B的SHA 。 但是,提交C无法知道有关提交D的SHA的任何信息,因为提交D是在 C之后创建的。因此,D不能是C的父级。这就是为什么提交D在切线上发生并且没有任何后代的原因。


如果您想要以下列状态着陆,

enter image description here

其中B'B略有不同,您应该使用git rebase -i,而不是git commit --amend