如何在git中编辑不正确的提交消息(我推送的)?

如何在git中编辑不正确的提交消息(我推送的)?,git,commit-message,Git,Commit Message,我想在历史中更深入地修改提交消息,我已经推送了许多新的提交 如何更改提交消息?有可能吗?来自Linus Torvalds的消息可能会回答您的问题: 简短回答:你不能(如果按) 摘录(Linus将BitKeeper称为BK): 旁注,只是出于历史兴趣:在BK你可以 如果你习惯了(像我一样),那真的很实用。我 会从安德鲁那里申请一个补丁炸弹,注意到出了问题,然后 在将其推出之前对其进行编辑 我也可以用git做同样的事情。这本来是很容易做到的 使提交消息不成为名称的一部分,并且仍然保证 历史记录未

我想在历史中更深入地修改提交消息,我已经推送了许多新的提交


如何更改提交消息?有可能吗?

来自Linus Torvalds的消息可能会回答您的问题:

简短回答:你不能(如果按)


摘录(Linus将BitKeeper称为BK):

旁注,只是出于历史兴趣:在BK你可以

如果你习惯了(像我一样),那真的很实用。我 会从安德鲁那里申请一个补丁炸弹,注意到出了问题,然后 在将其推出之前对其进行编辑

我也可以用git做同样的事情。这本来是很容易做到的 使提交消息不成为名称的一部分,并且仍然保证 历史记录未被篡改,允许“稍后修复评论” 事情

但我没有

部分原因纯粹是“内部一致性”。Git只是一种清洁剂 由于所有东西都受到了SHA1保护,所有对象都受到了 无论对象类型如何,处理方式相同。是的,有四个 不同种类的物体,它们都是不同的,它们 不能以相同的方式使用,但同时,即使 磁盘上的编码可能不同,从概念上讲,它们都能准确地工作 同样的

但内部一致性并不是僵化的借口,而且 显然,如果我们能在事后纠正错误,那将是非常灵活的 它们发生了。所以这不是一个很有力的论点

git不允许您更改提交消息的真正原因是 简单地说:这样,你就可以信任这些信息了。如果你允许的话 后来人们改变了他们,这些信息本来就不是很好 值得信赖


完整地说,您可以重写本地提交历史,以反映您想要的内容,例如(通过一些重设和重设——很难,喘息!)

但是,一旦您再次发布修改后的历史记录(使用
git push origin+master:master
+
符号强制执行推送,即使它不会导致“快进”提交)。。。你

从另一个SO问题中摘录:

事实上,我曾经用力推到git.git存储库,结果被Linus狠狠地骂了一顿。这会给其他人带来很多问题。一个简单的答案是“不要这样做”

(来自)

如何改变历史

由于Git中的历史是不可变的,因此修复除最近的提交(不是分支头的提交)之外的任何内容都需要从更改的提交和转发中重写历史

您可以使用StGIT,必要时初始化分支,取消提交到要更改的提交,必要时弹出到它,进行更改,然后刷新补丁(如果要更正提交消息,请使用-e选项),然后推送所有内容和stg提交

或者您可以使用rebase来实现这一点。创建新的临时分支,使用git reset将其倒带到您想要更改的提交——硬,更改该提交(它将位于当前头部的顶部),然后使用git rebase在更改的提交上重新设置分支的基础

或者您可以使用git rebase——interactive,它允许各种修改,比如补丁重新排序、折叠等等

我认为这应该回答你的问题。但是,请注意,如果您已将代码推送到远程存储库,而人们已从中提取代码,那么这将打乱他们的代码历史记录以及他们所做的工作。所以要小心点。

目前a可能会起作用

详细内容: 创建临时工作分支

git checkout -b temp
重置为要替换的提交

git reset --hard <sha1>


完成。

您可以使用
git-rebase-i
(针对您的分支) “我”代表互动

r
(或
reword
)替换您要更改的提交注释旁边的
选择
,保存并退出,这样您就可以进行编辑了


git再推一次
,你就完了

在我们的商店里,我介绍了一种惯例,即向带有错误消息的提交添加可识别名称的带注释的标记,并使用注释作为替换

尽管这对运行临时“git log”命令的人没有帮助,但它确实为我们提供了一种方法来修复注释中不正确的bug跟踪器引用,而且我的所有构建和发布工具都理解这个约定


这显然不是一个通用的答案,但它可能是人们可以在特定社区内采用的。我敢肯定,如果在更大范围内使用,可能会出现某种陶瓷支架,最终…

假设你有一棵这样的树:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
首先,
签出
临时分支:

git checkout -b temp
temp
分支上,
reset--hard
到要更改其消息的提交(例如,该提交是
946992
):

使用
amend
更改消息:

git commit --amend -m "<new_message>"
然后,
cherry-pick
946992
之前的所有提交从
master
temp
并提交它们,如果您还想更改它们的消息,请使用
amend

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
现在强制将临时分支推到远程:

git push --force origin temp:master
最后一步,在本地删除分支
master
git fetch origin
从服务器上拉分支
master
,然后切换到分支
master
并删除分支
temp


现在,您的本地和远程都将更新所有消息。

如果您使用的是Git扩展: 进入提交屏幕,底部应该有一个复选框,上面写着“修改提交”,如下所示:


理论上回答得不错,但实际上却非常危险:请看@Jonah:当我试图推到另一个答案中提到的遥控器时,我收到了一条“一切都是最新的”消息:u
git reset --hard 946992
git commit --amend -m "<new_message>"
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
git push --force origin temp:master