git - 'git commit --amend' 处于分离的 HEAD 状态

标签 git commit rebase git-commit git-amend

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

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

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

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

最佳答案

在 Git 中,一旦创建了提交,它就固定不变了;你不能改变它。您所能做的(通过修改它、挑选它等)就是创建一个“类似于”它的新提交。

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

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

enter image description here

(你的 HEAD 是分离的,但这不是重点。)无论你是否进行和暂存更改,运行 git commit --amend 都会让你进入这个情况:

enter image description here

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

当我们说BC 的父提交时,我们指的是提交C 引用通过其 SHA 提交 B。 但是,提交 C 无法知道有关提交 D 的 SHA 的任何信息,因为提交 D 是在之后 C。因此,D 不能是 C 的父级。这就是提交 D 偏离正切并且没有任何后代的原因。


如果你想以下面的状态落地,

enter image description here

其中 B'B 甚至只有一点点不同,你应该使用 git rebase -i,而不是 git commit - -修改.

关于git - 'git commit --amend' 处于分离的 HEAD 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948049/

相关文章:

windows - sh.exe“:/bin/git bad file number when git -version

git - 从 master 恢复本地分支的提交

svn - 将新版本提交到 svn 存储库时出现提交失败错误

git - 在 Git 中 : Why is it good to commit often?

git - 在 smartgit "git-am is in progress"中重新定位

git - 在一个 rebase 后 merge 来自相似分支的选定文件

Git 在 merge 时获取他们或我的文件

git - 将文件添加到 .gitignore 后,git 会从版本控制中删除文件吗?

git - SourceTree - 如何 checkout 到远程 repo 分支

git - 如何在 git 中备份私有(private)分支