';GIT提交--修改分离的磁头状态 [英] 'git commit --amend' in detached HEAD state
问题描述
我知道修改旧的Git提交的正确方法是使用rebase --interactive
,但为了澄清概念,我想了解一下当我这样做时会发生什么
git checkout <commit>
- 更改文件中的内容
- 将更改的文件添加到索引
- 然后
git commit . --amend
当我这样做时,它不是修改提交,而是从同一提交的父级分支新提交。
这是否只是Git告诉我我无法修改已有子代提交的提交的方式?
推荐答案
在Git中,一旦创建了提交,它就是一成不变的;您无法更改它。您所能做的就是创建一个类似于它的新承诺,通过修改它、挑选它等等。
我理解您的困惑:&amendate";是一个有点用词不当的词;它有点误导,因为它暗示修改某些适当的东西。在Git中,修改提交实际上就是创建一个与原始提交具有相同父级的全新提交。
以
为例,假设在运行git checkout B
后,您处于以下情况:
(您的HEAD
是分离的,但这不是重点。)无论您是否进行更改和暂存更改,运行git commit --amend
都会使您处于这种情况:
CommitD
可能与B
非常、非常相似;尤其是,它可能具有与B
完全相同的补丁、完全相同的提交消息,等等。然而,(Commit,Author)时间戳通常会不同(unless you can amend a commit under a second!),这意味着D
的SHA-1将与B
的SHA-1不同;如果两个提交没有相同的SHA,则它们不是相同的提交。
当我们说B
是C
的父提交时,我们指的是提交C
引用提交B
通过其SHA。
但是,COMMITC
无法知道COMMITD
的SHA,因为COMMITD
是在C
之后创建的。因此,D
不能是C
的父项。这就是提交D
在切线上开始并且没有任何子项的原因。
如果您要在以下状态下着陆,
如果B'
与B
仅略有不同,则应使用git rebase -i
,而不是git commit --amend
。
这篇关于';GIT提交--修改分离的磁头状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!