"amend" 之前提交并编辑消息

"amend" previous commit and edit the message

假设我想通过我当前的最后一次提交 "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"

现在我明白了:

如您所见,我重写了所有提交以使其干净。 由于我是重置新手......它可能有点脏。

是否有可能仅通过 "editting" 提交来获得此清洁器? 例如,我想编辑第一次提交的前一条消息,并保持第二次提交的消息不变。

此外,我进行修改的方式让我认为之前的提交仍然存在并且一定会污染存储库:它们会被删除还是永远留在那里?

P.S : the GitHub repository(reflog 非常可怕,因为我在找到正确的命令之前犯了一些命令错误)

如果不更改(至少 SHA)其所有后代,则不可能更改提交消息。但是,如果您仍然想这样做(例如,您之前打错了字,但您仍然没有发布您的提交),那么您可以这样做:

git rebase --interactive HEAD~2

然后将行首的 pick 更改为 reword。它会为你施展所有 git checkout/git commit --amend/git rebase 魔法。

如果您想了解更多:

Moreover, the way I did the modification let me think the previous commit are still present and must pollute the repository : will they be erased or stay there foreever ?

它们最终会被垃圾回收。但是你不应该将无法访问的提交视为一个问题,有很多这样的提交是完全正常的,因为在许多操作之后会有一些像 rebasereset.

说到 rebase:正如@TimBiregeleisen 所提到的,我认为交互式变基将是更简洁的解决方案:git rebase -i HEAD~2 允许您修改最后两次提交。您可以选择重写提交消息、编辑整个提交、将多个提交压缩为一个和其他内容;那里有很多文档(例如here or here)。

当然,交互式 rebase 会创建全新且闪亮的提交并留下旧的悬空,但是,如上所述,这没问题 只要您没有推送那些旧的提交并且有人else 开始在它们之上工作