使用 `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
行都有一个提交消息文件。这只是不必要的。即使pick
或reword
之外的其他操作需要启动外部命令,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 rebase
的reword
命令:
通过将命令“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-commit
和git-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` 更改旧的提交消息的主要内容,如果未能解决你的问题,请参考以下文章