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

我试图编辑一个旧的提交消息,如 给你所解释的那样。

现在的情况是,当我试图运行 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'.

有什么想法吗?

187117 次浏览

上面写着:

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

$ 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他的回答中提到了 ABC0命令: “ http://git-scm.com/docs/git-rebase”rel = “ norefrer”> git rebase :

通过将命令“ pick”替换为命令“ edit”,您可以告诉 git rebase在应用提交之后停止,这样您就可以编辑文件和/或提交消息,修改提交,并继续重新定基。

如果您只想编辑提交的提交消息,请将命令“ ABC0”替换为命令“ rewordGit1.6.6(2010年1月)开始。

它和“ edit”在交互式 rebase 中做同样的事情,除了 它只允许您编辑提交消息,而无需将控制返回到 shell。这非常有用。 < br/> 当前,如果你想清理你的提交消息,你必须:

$ git rebase -i next

然后将所有提交设置为“编辑”,然后对每个提交进行:

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

使用‘ ABC0’而不是‘ ABC1’可以让您跳过 ABC2和 git-rebase调用.

FWIW,git rebase 交互现在有一个 reword选项,这使得这更少的痛苦!

正如 Gregg Lind 建议的那样,您可以使用 重复一遍来提示只更改提交消息(否则保持提交完整不变) :

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

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

了解更多关于 更改提交消息的 GitHub 页面。

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

只是想提供一个不同的选择。在我的例子中,我通常在各个分支上工作,然后合并到 master,而我对本地分支执行的各个提交并不那么重要。

由于 git 钩子检查 Jira 上的适当票号,但是区分大小写,我被阻止推送我的代码。而且,提交很久以前就完成了,我不想计算有多少次提交要返回到 rebase 上。

因此,我所做的就是从最新的 master 创建一个新的分支,并将问题分支的所有提交压缩到新分支上的单个提交中。这对我来说更容易,我认为把它放在这里作为将来的参考是个好主意。

来自最新的大师:

git checkout -b new-branch

然后

git merge --squash problem-branch
git commit -m "new message"
< p > 参考文献: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch

更改历史上任何地方的提交消息:

< p > 1-git rebase -i <commit_sha>,< commit _ sha > 是一个在提交之前被改变的提交 enter image description here

2-在第一行将 pick改为 reword

3-保存并退出

< p > 4-接下来,您将在另一个文件中看到提交消息,编辑,然后保存并退出 enter image description here

就是这样,现在历史被修改,一个 git push --force-with-lease将在远程上替换