Git &引用;修订;上一次提交并编辑邮件

Git &引用;修订;上一次提交并编辑邮件,git,git-commit,git-reset,Git,Git Commit,Git Reset,假设我想通过当前的最后一次提交“HEAD”更改HEAD~2,而不需要HEAD~所做的更改。此外,我希望编辑HEAD~2中的消息,而不是覆盖它(只需对消息进行少量更改)。 我发现: 这是我当前的git日志: 然后我执行了以下命令: git reset --mixed Head~3 git add new_file.cpp git commit -m "Erased previous new_file.cpp by current new_file" git add other_file.cpp

假设我想通过当前的最后一次提交“HEAD”更改HEAD~2,而不需要HEAD~所做的更改。此外,我希望编辑HEAD~2中的消息,而不是覆盖它(只需对消息进行少量更改)。 我发现: 这是我当前的git日志:

然后我执行了以下命令:

git reset --mixed Head~3
git add new_file.cpp
git commit -m "Erased previous new_file.cpp by current new_file"
git add other_file.cpp
git commit -m "Added other_file.cpp"
现在我明白了:

正如你所看到的,我已经重写了我所有的承诺,让它变得清晰。 因为我是一个新的重置。。。它可能有点脏

仅仅通过“编辑”提交就可以得到这个清理器吗? 例如,我想编辑第一次提交的前一条消息,并保持第二次提交的消息不变

此外,我进行修改的方式让我认为以前的提交仍然存在,并且必须污染存储库:它们将被擦除还是永远留在那里


另外:(reflog非常可怕,因为我在找到正确的命令之前犯了一些命令错误)

如果不更改(至少是SHA)所有子消息,就不可能更改提交消息。但是,如果您仍然希望这样做(例如,您之前输入了错别字,但尚未发布提交),则可以执行以下操作:

git rebase --interactive HEAD~2
然后在行的开头更改
选择
,并提交给
改写
。它将完成所有的git签出/
git提交——修改
/
git rebase
为您带来魔力

如果您想了解更多信息:


    • 如果不更改所有子消息(至少是SHA),则无法更改提交消息。但是,如果您仍然希望这样做(例如,您之前输入了错别字,但尚未发布提交),则可以执行以下操作:

      git rebase --interactive HEAD~2
      
      然后在行的开头更改
      选择
      ,并提交给
      改写
      。它将完成所有的git签出/
      git提交——修改
      /
      git rebase
      为您带来魔力

      如果您想了解更多信息:

      此外,我做修改的方式让我想到了前面的问题 提交仍然存在,并且必须污染存储库:它们会吗 被抹去还是永远留在那里

      它们最终将被垃圾收集。但是,您不应该将不可访问的提交视为一个问题,有很多这样的提交是完全正常的,因为在许多操作之后,例如
      rebase
      reset

      说到
      rebase
      :正如@TimBiregeleisen提到的,我认为交互式rebase将是这里更干净的解决方案:
      git rebase-I HEAD~2
      允许您修改最后两次提交。您可以选择重写提交消息、编辑整个提交、将多个提交压缩为一个或其他内容;有大量的文档(例如)

      当然,一个交互式的重基会创建全新的、有光泽的提交,并使旧的提交悬而未决,但是,如上所述,只要您没有推送这些旧的提交,并且其他人开始在它们上面工作,这就没有问题

      此外,我做修改的方式让我想到了前面的问题 提交仍然存在,并且必须污染存储库:它们会吗 被抹去还是永远留在那里

      它们最终将被垃圾收集。但是,您不应该将不可访问的提交视为一个问题,有很多这样的提交是完全正常的,因为在许多操作之后,例如
      rebase
      reset

      说到
      rebase
      :正如@TimBiregeleisen提到的,我认为交互式rebase将是这里更干净的解决方案:
      git rebase-I HEAD~2
      允许您修改最后两次提交。您可以选择重写提交消息、编辑整个提交、将多个提交压缩为一个或其他内容;有大量的文档(例如)


      当然,一个交互式的重基会创建全新的、闪亮的提交,并使旧的提交悬而未决,但是,如上所述,只要你没有推送这些旧的提交,而其他人开始在它们上面工作,这是没有问题的。

      此外,我想编辑HEAD~2的消息,而不是覆盖它。
      。。。你不能那样做。如果更改提交消息,则更改提交。您可以考虑进行交互式重基,但tbat会重写分支的历史记录,对于公共/共享分支来说并不可取。
      此外,我希望编辑HEAD~2的消息,而不是覆盖它。
      。。。你不能那样做。如果更改提交消息,则更改提交。你可以考虑做一个交互式的重基,但是tbat会重写分支的历史,对于公共/共享分支来说是不可取的。