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

qeeaahzv  于 2023-03-28  发布在  Git
关注(0)|答案(6)|浏览(562)

我试图编辑一个旧的提交消息,解释为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'.

有什么想法吗

yrdbyhpb

yrdbyhpb1#

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

$ 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在他的回答中提到了git rebase
reword命令

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

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

它和'edit'在交互式变基时做的事情一样,除了它只允许你编辑提交消息而不把控制权返回给shell。这是非常有用的。
现在,如果你想清理你的提交消息,你必须:

$ git rebase -i next

然后将所有提交设置为'edit'。然后在每个提交上:

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

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

k97glaaz

k97glaaz2#

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

现在将你想要编辑的提交的消息替换为pickreword

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

保存文件后退出编辑器,接下来你会被提示编辑你标记为reword的提交的消息,每个消息一个文件。注意,当你用reword替换pick时,只编辑提交消息会简单得多,但是这样做没有效果。
在GitHub的Changing a commit message页面上了解更多信息。

qzlgjiam

qzlgjiam3#

参考消息,git rebase interactive现在有了reword选项,这样就不会那么麻烦了!

3bygqnnd

3bygqnnd4#

只是想提供一个不同的选择。在我的情况下,我通常在我的个人分支上工作,然后合并到master,我对我的本地所做的个人提交并不那么重要。
由于Jira上有一个git hook,它会检查相应的ticket编号,但区分大小写,所以我无法推送代码。此外,提交是很久以前完成的,我不想计算在rebase上有多少提交要返回。
所以我所做的就是从latest 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

pkmbmrz7

pkmbmrz75#

要更改历史记录中的任何位置的提交消息,请执行以下操作:
1-git rebase -i <commit_sha>,<commit_sha>是SHA一次提交之前要更改的提交(这里:eb232eb6b):

2-将第一行中的pick(默认值)更改为reword(不编辑消息本身)
3-保存并退出
4-接下来,您将再次看到编辑器,其中只有旧的提交消息行,因此请编辑它,然后保存并退出

就是这样,现在修改了历史记录,git push --force-with-lease将在远程替换

mgdq6dx1

mgdq6dx16#

这里有一个非常好的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

相关问题