使用 `git rebase` 更改旧的提交消息

Posted

技术标签:

【中文标题】使用 `git rebase` 更改旧的提交消息【英文标题】:Change old commit message using `git rebase` 【发布时间】:2010-12-25 11:07:05 【问题描述】:

我试图按照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'.

有什么想法吗?

【问题讨论】:

用户被告知在此处添加问题内容,​​而不是在链接中。原因之一是这些链接迟早会失效。链接schacon.github.com/history.html 不再有效。 【参考方案1】:

FWIW,git rebase interactive 现在有一个 reword 选项,这让这变得不那么痛苦了!

【讨论】:

当使用reword 时,为什么 git 不能简单地让您使用提交列表编辑该文件中的提交消息?相反,它将启动编辑器,每个reword 行都有一个提交消息文件。这只是不必要的。即使pickreword 之外的其他操作需要启动外部命令,reword 也不需要这样做。 您是否将单行提交消息与完整提交消息混淆了(您仅在变基时看到提交消息标题(摘要))?【参考方案2】:

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

由于 git 钩子会检查 Jira 上的相应票号但区分大小写,因此我无法推送我的代码。此外,提交是很久以前完成的,我不想计算有多少提交要返回到 rebase。

所以我所做的是从最新的 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

【讨论】:

你的回答真的拯救了我的一天:)。我在rebase -i 上挣扎了大约 2 个小时,但没有成功。我的提交落后于 18 次提交,所以你可以想象。这是我可以找到的更简单方便的方法,无需使用 rebase。谢谢朋友! 我不确定将所有提交合并为一个时提交历史记录会发生什么。也许在你的答案中解释,也许展示一个例子。我试图理解手册页对--squash 选项的描述,但我无法理解它的实际作用。 正如我所提到的,对于这个变通方法,你不应该担心单个提交,因为你会忘记它并使其成为一个新消息。抱歉延迟回复 这很有帮助,也很简单,但也有缺点,现在在单个提交中有n 个文件,并且还丢失了整个提交历史。【参考方案3】:

正如 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

现在将 pick 替换为 reword 用于您要编辑以下消息的提交:

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

保存文件后退出编辑器,接下来将提示您编辑标记为 reword 的提交的消息,每条消息在一个文件中。请注意,当您将 pick 替换为 reword 时,只编辑提交消息会简单得多,但这样做没有任何效果。

在Changing a commit message 的 GitHub 页面上了解更多信息。

【讨论】:

我这样做了,然后来自其他分支的提交出现在我的分支中 @Reza 你可能搞砸了。在其他一些 repo 中试试这个。该解决方案完美运行 令人困惑的是,git 在保存修改后的提交消息(使用reword)后说“分离的 HEAD ...”,但随后git rebase --continue 触发“致命:没有正在进行的变基?”。也许在答案中也指出这一点。见于 git 2.26.2。【参考方案4】:

这是一个非常好的 Gist,涵盖了所有可能的情况: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

【讨论】:

当你想要一个很长的提交信息时,我认为这比改写更好,而不仅仅是一行【参考方案5】:

上面写着:

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

$ 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 在 cmets 中提到的那样,git rebase --continue 用于在你修改了第一个提交之后,进入变基过程中的下一个任务

另外,Gregg Lind 在his answer 中提到了git rebasereword 命令

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

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

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

$ git rebase -i next

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

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

使用“reword”而不是“edit”可以跳过git-commitgit-rebase 调用

【讨论】:

另外,git rebase --continue 在您修改了第一个提交之后,会转到变基过程中的下一个任务。 将link 添加到 github wiki 文章以更改提交消息 如果我的提交似乎不起作用,因为有问题的提交都是用--allow-empty 完成的并且没有实际差异。 Rebase 只是说“无事可做” @lucidbrot 你使用的是什么版本的 Git? git rebase -i 可以保留自 Git 2.26(2020 年第一季度)以来的空提交:***.com/a/60532362/6309 @VonC 有趣,谢谢!我在2.17。没有意识到它已经过时了 - 我从 ubuntu apt 得到它

以上是关于使用 `git rebase` 更改旧的提交消息的主要内容,如果未能解决你的问题,请参考以下文章

Git rebase 更改作者? [复制]

自定义 Git *Rebase* 提交消息模板

如何 git rebase -i 编辑并查看过去的提交更改

尝试更改旧提交消息时出错 [重复]

如何自定义 git rebase --interactive 提交消息的格式?

sh Git rebase不会更改提交时间戳