更改Git上的旧提交消息


136

我试图按照此处的说明编辑旧的提交消息。

问题是,现在,当我尝试运行rebase -i HEAD~5时说interactive rebase already started

因此,我尝试:git rebase --continue但是收到此错误:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

有任何想法吗?

Answers:


125

它说:

保存并退出编辑器时,它会将您倒带到该列表中的最后一个提交,并在命令行中显示以下消息:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

这并不意味着:

再次输入 git rebase -i HEAD~3

退出编辑器时,尝试键入内容 git rebase -i HEAD~3,这样应该可以正常工作。
(否则,在您的特定情况下,git rebase -i --abort可能需要重新设置所有内容并允许您重试)


正如Dave Vogt在评论中所提到的那样,它git rebase --continue在修改了第一次提交之后转到重新编制基础过程中的下一个任务。

此外,Gregg Lind回答中提到以下reword命令git rebase

通过将命令“ pick”替换为命令“ edit”,您可以告知git rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交并继续重新设置基准。

如果你只是想编辑用于提交的提交信息,替换命令“ pick”用命令“ reword,因为Git1.6.6(2010年1月)

它与edit交互式rebase期间的功能相同,只是它只允许您编辑提交消息,而不将控制权返回给shell。这是非常有用的。
当前,如果您要清理提交消息,则必须:

$ git rebase -i next

然后将所有提交设置为“编辑”。然后在每个:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

使用' reword'代替' edit'可以跳过git-commitand git-rebase调用


2
此外,git rebase --continue在修改了第一次提交之后,请转到重新定级过程中的下一个任务。
戴夫·沃格特

1
链接添加到github Wiki文章中以更改提交消息
Joy

60

正如Gregg Lind所建议的那样,您可以使用reword来提示您仅更改提交消息(否则保持提交不变):

git rebase -i HEAD~n

n是最近n次提交的列表。

例如,如果您使用git rebase -i HEAD~4,您可能会看到类似以下的内容:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

现在,对于要编辑以下消息的提交,用reword替换pick

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

保存文件后退出编辑器,然后将提示您编辑标记为reword的提交的消息,每个消息一个文件。请注意,它会一直要简单得多,只是编辑提交信息,当你更换pick使用reword,但这样做没有效果。

在GitHub页面上了解更多有关更改提交消息的信息


很好解释。谢谢:D
Shubham Jain

感谢@ShubhamJain开心我的回答很有用
Punit Vara

我这样做了,然后其他分支的提交显示在我的分支中
Reza

@Reza,您可能已经弄乱了东西。在其他回购中尝试此操作。该解决方案非常有效
Punit Vara

54

FWIW,git rebase交互式现在有了一个“ reword”选项,这使痛苦减轻了很多!


3
使用时reword,为什么git不能简单地让您使用提交列表来编辑该文件中的提交消息?相反,它将启动编辑器,每reword行只有一个提交消息文件。这只是不必要的。即使不是pickreword需要启动外部命令的其他操作,reword也不需要这样做。
Dan Dascalescu

9

只是想为此提供一个不同的选择。就我而言,我通常在我的个人分支上工作,然后合并到master,而我对本地所做的个人提交并不那么重要。

由于git钩子会在Jira上检查适当的票证号,但区分大小写,因此无法推送代码。另外,提交是在很久以前完成的,我不想计算有多少提交可以返回到基准站。

所以我要做的是从最新的master创建一个新分支,并将问题分支中的所有提交压缩为新分支中的单个提交。这对我来说比较容易,我认为将其作为将来的参考是一个好主意。

来自最新的大师:

git checkout -b new-branch

然后

git merge --squash problem-branch
git commit -m "new message" 

裁判:https ://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
您的回答确实挽救了我的生命:)。我挣扎了rebase -i大约2个小时,但没有成功。我的提交落后于18次提交,因此可以想象。这是我无需使用rebase就能找到的更简单便捷的方法。谢谢你,朋友!
卡洛斯·帕拉

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.