在Git上更改旧的提交消息

时间:2009-12-10 22:16:14

标签: git repository rebase git-rebase

我正在尝试编辑旧的提交消息,如here所述。

现在的问题是,当我尝试运行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'.

有什么想法吗?

5 个答案:

答案 0 :(得分:106)

它说:

  

当您保存并退出编辑器时,它将回退到该列表中的最后一次提交,并使用以下消息将您放到命令行中:

$ 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 Lindhis answer git rebase reword命令中提及:

  

通过使用命令“edit”替换命令“pick”,您可以告诉git rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交,并继续变基。

     

如果您只想编辑提交的提交消息,请使用命令“pick替换命令“reword”,因为Git1.6.6 (January 2010)

     

在交互式rebase期间,“edit”执行相同的操作,除了它只允许您编辑提交消息而不将控制权返回给shell 。这非常有用   目前,如果要清理提交消息,则必须:

$ git rebase -i next
  

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

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

使用“reword”代替“edit”可以跳过git-commitgit-rebase来电

答案 1 :(得分:47)

答案 2 :(得分:31)

正如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 e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

保存文件后退出编辑器,然后系统会提示您在每个邮件的一个文件中编辑已标记为 reword 的提交的邮件。请注意,当您使用pick替换reword时,编辑提交消息会更加简单,但这样做无效。

在GitHub的Changing a commit message页面上了解详情。

答案 3 :(得分:3)

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

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

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

来自最新主人:

git checkout -b new-branch

然后

git checkout 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

答案 4 :(得分:1)

这是一个非常好的要点,涵盖了所有可能的情况:https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

概述:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue