我知道修改旧 Git 提交的正确方法是使用 rebase --interactive
,但为了弄清楚这些概念,我想了解当我这样做时会发生什么
-
git checkout <commit>
- 更改文件中的内容
- 将修改后的文件加入索引
- 然后是
git commit . --amend
当我这样做时,它没有修改提交,而是从同一个提交的 PARENT 分支出一个新的提交。
这只是 Git 告诉我不能修改已经有子提交的提交的方式吗?
最佳答案
在 Git 中,一旦创建了提交,它就固定不变了;你不能改变它。您所能做的(通过修改它、挑选它等)就是创建一个“类似于”它的新提交。
我理解您的困惑:“修改”有点用词不当;这有点误导,因为它建议修改某些地方。在 Git 中,修改提交实际上包括创建一个全新提交,该提交与原始提交具有相同的父提交。
例如,假设在运行 git checkout B
后,您处于以下情况:
(你的 HEAD
是分离的,但这不是重点。)无论你是否进行和暂存更改,运行 git commit --amend
都会让你进入这个情况:
提交 D
可能与 B
非常、非常相似;特别是,它可能具有完全相同的补丁,与 B
完全相同的提交消息等。但是,(提交,作者)时间戳通常会有所不同(unless you can amend a commit under a second!),这意味着 SHA D
的-1与B
的不同;如果两个提交没有相同的 SHA,则它们不是同一个提交。
当我们说B
是C
的父提交时,我们指的是提交C
引用通过其 SHA 提交 B
。
但是,提交 C
无法知道有关提交 D
的 SHA 的任何信息,因为提交 D
是在之后 C
。因此,D
不能是 C
的父级。这就是提交 D
偏离正切并且没有任何后代的原因。
如果你想以下面的状态落地,
其中 B'
与 B
甚至只有一点点不同,你应该使用 git rebase -i
,而不是 git commit - -修改
.
关于git - 'git commit --amend' 处于分离的 HEAD 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948049/