【问题标题】:'git commit --amend' in detached HEAD state'git commit --amend' 处于分离 HEAD 状态
【发布时间】:2014-11-14 21:10:58
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: git commit rebase git-commit git-amend


    【解决方案1】:

    在 Git 中,一旦创建提交,它就会一成不变;你不能改变它。你所能做的——通过修改它、挑选它等等——就是创建一个“类似”它的新提交。

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

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

    (您的HEAD 是分离的,但这不是重点。)无论您是否进行和阶段更改,运行git commit --amend 都会使您处于这种情况:

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

    当我们说 BC 的父提交时,我们的意思是 commit C 通过其 SHA 引用提交 B。 然而,提交C 无法知道提交D 的SHA,因为提交D 是在C 之后创建的。因此,D 不能是 C 的父级。这就是为什么提交 D 会偏离正题并且没有任何后代。


    如果你想降落在以下状态,

    如果B'B 仅略有不同,则应使用git rebase -i,而不是git commit --amend

    【讨论】:

    • 很棒的答案。谢谢!我完全错过了 --amend 总是从 HEAD 的父级分支出来的事实。现在我想起来它是完全有道理的。
    猜你喜欢
    • 2014-03-17
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    相关资源
    最近更新 更多