Git:仅编辑先前提交的消息


12

出于懒惰的原因,我用默认消息推送了一堆提交,但现在变得很麻烦,因为我真的不知道每次提交中所做的更改。

如何仅编辑先前提交的消息,并(如果可能)保留提交树?


10
当心不断变化的公共历史!
D. Ben Knoble

2
我担心这里的答案不会给您几乎可怕的警告。如果其他人同时撤消了您的历史记录,这造成巨大的混乱-如果他们在此基础上进行了新工作,则更是如此!
伊芙

我将使用原因,这里有一个简单的案例,我是唯一使用此仓库的人。
Tuyen Pham

3
信息:这已经(可能多次)在Stack Overflow上被询问。
user202729 '12

Answers:


20

要编辑一系列提交的提交消息,我运行

git rebase -i firstsha

其中firstsha是我要编辑的第一个提交的父提交的标识符。(您可以在此处使用任何有效的引用,因此git rebase -i HEAD~4将显示最后四个提交。)

在打开的编辑器中,将所有要修改的提交的“ pick”条目更改为“ reword”,然后关闭编辑器;然后将要求您输入所有选择的提交的提交消息。

请注意,这更改提交树,因为提交的哈希值将更改。您将必须强行推入新树,或将其推到新分支。它还会搞乱合并,因此请避免编辑合并提交。

要仅快速编辑最后一次提交,请运行

git commit --amend

(但是要注意任何准备提交的东西)。


它将如何影响提交树,它将在提交树中创建中间垂直线?我现在只有一棵垂直线提交树,并且需要更改100多个消息。
Tuyen Pham

3
它不会在您的提交树中创建新的“行”,它将更改所有提交。如果您的历史记录当前是线性的,则它将保持线性。
斯蒂芬·基特

这取决于。您是自己使用它,而不是推送到服务器吗?然后不,只有一条“线”。但是否则可能会有两个,并且根据您对前两个问题的回答,我们可以帮助您摆脱旧的“界线”。
曼队长

1
Rebase确实有一个标记来处理合并(我认为是preserve-merges
D. Ben Knoble

6

您正在寻找的是git rebase

如果仅希望更改上git commit一条消息,则只需使用以下内容:

git commit --amend

然后对上一次提交进行所需的更改,然后保存编辑。

但是,如果您需要更改较早的提交,则需要使用rebase

git rebase -i HEAD~N 

其中N等于您希望返回的提交次数,例如2或12或6,等等。

在这里,您应该获得一个带有提交内容的文本编辑器。将选项从更改pickreword来更改消息。

确定了所有要更改的提交并适当更改了它们的选项后,保存并关闭编辑器。然后对每个提交消息进行更改。一旦您满意,就可以运行:

git push --force

而且您应该使用不同的哈希值来维护git历史记录,因为您已经进行了所需的更改。这是您应该查看的一些其他链接:

7.6 Git工具-重写历史记录
GitHub帮助-更改提交消息
StackOverflow-更改旧提交消息的问题


如果您“ reword”,则不需要“ commit --amend”,除非您以某种方式弄乱了提交过程。
Stephen Kitt

谢谢你,这里的步骤,我会做从您的文章我的理解:1。做git rebase -i firstshafirstsha是父母提交的哈希的承诺,我会想改变的信息,然后在编辑,更改pickrewordenter新的消息,则问题git rebase --continue而且git push --force呢?
Tuyen Pham

@StephenKitt,我刚刚注意到了您的回答,当您提交您的答案时,我正在做我的事情。我会听从您的建议,并希望进行修改。如果更合适,我可以将答案合并到您的答案中,方法是将链接添加到您的答案中,如果您认为比起多个类似答案更适合此问题。
kemotep

@TuyenPham您只需要将git rebase -i HEAD~NN作为您希望返回的提交次数即可。将要编辑消息的每个提交选项从pick更改为reword,保存此文件,对每个提交文件进行更改并保存。一旦您确信自己完成了,就只需要git push --force [Name of git branch you are were working on]。您可以随时返回并再次执行此操作,也可以分阶段执行。
kemotep
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.