更改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行只有一个提交消息文件。这只是不必要的。即使不是pick或reword需要启动外部命令的其他操作,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.