我想更改上一次提交的 Git 提交消息

Pra*_*ull 15 git

我想更改之前推送的提交消息。此外,在那之后我还推送了其他提交。如果我更改提交消息,旧消息将显示在 Git 提交历史记录中。

eft*_*ft0 25

git checkout revision-to-correct
git commit --amend -m "corrected message"
Run Code Online (Sandbox Code Playgroud)

如果修订版“是”位于顶部,您可以挑选它们,然后将原始分支移动到新位置...然后您可以推送 --force:

git cherry-pick revision-to-correct..some-branch
git branch -f some-branch
git push origin --force some-branch
Run Code Online (Sandbox Code Playgroud)

更新:在学习了更多技巧之后,还有另一种非常简单的方法:

git rebase -i HEAD~2
# rebase will open a list of revisions, on the first line, change pick for reword (or r, for short)
# save and exit.... git rebase will start running
# and it will stop right after the second to last revision is applied
# and you will be on the editor so that you can modify the message for the revision
# set the message, save and exit
# git rebase will finish running and you are done
Run Code Online (Sandbox Code Playgroud)

  • 我认为任何尝试应用此方法的人都应该阅读下面 Mark Adelsberger 的答案。tl;dr - 没有任何方法可以编辑历史记录中较早提交的消息而不严重扰乱历史记录。 (2认同)

ikb*_*mad 10

要在挑选时更改提交消息,请使用 \xe2\x80\x9c git cherry-pick\xe2\x80\x9d 和 \xe2\x80\x9c -e\xe2\x80\x9d 选项。

\n
$ git cherry-pick -e <hash>\n
Run Code Online (Sandbox Code Playgroud)\n

如本示例所示,您的默认编辑器将打开,您可以更改提交消息。

\n

在此输入图像描述

\n

当您对编辑感到满意时,保存文件,您的提交消息应该已成功保存。

\n


Mar*_*ger 9

所以你有一个答案告诉你如果提交没有被推送你会如何做(忽略你明确表示它已经被推送)。您有几个答案,为您提供了您认为效果很好的程序,直到您的同事开始抱怨。但似乎没有人愿意告诉你真实的分数。

提交消息是提交身份的基本部分。这就是为什么在埃德蒙多的程序中,你最终不得不做一堆无意义的挑选和强制操作。(如果你有使用-f--force选项,那么 git 会尝试警告你一些事情。)

所以澄清一下:

没有用于编辑提交消息的机制。您可以用除了有新消息之外相同的新提交替换提交,但是如果这样做您删除了已推送的提交,则存储库的每个其他用户都将必须恢复,因为您刚刚执行了有效的操作上游变基。(请参阅文档中的“从上游变基恢复” git rebase。)

这并不意味着你永远做不到;这意味着在执行此操作之前,您应该获得使用相关分支的每个人的同意。

在您指定的情况下 - 不仅要修改的提交,而且还推送了一些后续提交 - 这些提交也将需要被替换。每一个指向其中任何一个的裁判都必须重写。例如,如果您有

x --- x --- A --- B --- C --- D <--(master)
                   \
                    E --- F <--(branch1)
Run Code Online (Sandbox Code Playgroud)

并且您想重写 的提交消息A。所以你遵循了埃德蒙多的建议(毕竟,这比其他人的建议更接近正确)。您签出A并运行commit --amend,现在您有了

x --- x --- A --- B --- C --- D <--(master)
       \           \
        \           E --- F <--(branch1)
         A'
Run Code Online (Sandbox Code Playgroud)

请注意,您的分支仍然在其历史记录中“看到”原始提交(带有原始消息),这就是为什么埃德蒙多说您将进行一些挑选。现在,如果你真的想这样做,挑选樱桃实际上是一条艰难的道路;此时您最好将其重新设置BA使用.A'filter-branch

当然,重新养育仍然是历史重写,所以现在你得到的是

x --- x --- A --- B --- C --- D <--(origin/master)
       \           \
        \           E --- F <--(origin/branch1)
         \
          A' --- B' --- C' --- D' <--(master)
                  \
                   E' --- F' <--(branch1)
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,您必须强制推动masterbranch1。一旦您这样做,任何其他人在之后添加的任何工作DF无论是在相应的分支上,还是在新的分支上)也都必须重新基于您的工作。

如果你没有仔细地与你的同事协调,他们会发现需要通过一个有点神秘的错误消息来重新调整他们的工作,并且如果他们以“错误”的方式做出反应——即导致他们最后失败的方式头痛——即强制推送,因为它清除了错误,就像你所做的那样——然后历史记录将再次拥有原始的A和你想要删除的原始提交消息。

因此,如果这听起来仍然值得麻烦,那么正确的程序是

1) 与存储库的所有其他用户协调切换 2) 遵循与 Edmundo 类似的过程,但可能需要进行我上面建议的修改

您可能想看看不同的解决方案(例如注释或带注释的标签)是否可以满足您的需求。