在Git上更改旧的提交消息

Pab*_*dez 126 git repository rebase 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'.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Von*_*onC 115

它说:

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

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with
Run Code Online (Sandbox Code Playgroud)

这并不意味着:

再次输入 git rebase -i HEAD~3

退出编辑器时尝试输入 git rebase -i HEAD~3,它应该可以正常工作.
(否则,在您的特定情况下,git rebase -i --abort可能需要重置所有内容并允许您再次尝试)


正如Dave Vogt在评论中提到的那样,git rebase --continue在你修改了第一次提交之后,进入了变基过程中的下一个任务.

此外,Gregg Lind他的回答中提到以下reword命令git rebase:

通过使用命令"edit"替换命令"pick",您可以告诉git rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交并继续重新定位.

如果您只想编辑提交的提交消息,请将命令" pick"替换为命令" reword",因为Git1.6.6(2010年1月).

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

$ git rebase -i next
Run Code Online (Sandbox Code Playgroud)

然后将所有提交设置为"编辑".然后在每一个:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue
Run Code Online (Sandbox Code Playgroud)

使用' reword'代替' edit'可以跳过git-commitgit-rebase调用.

  • 此外,在您修改第一次提交后,`git rebase --continue`将进入重新定位过程中的下一个任务. (2认同)

Gre*_*ind 51

FWIW,git rebase interactive现在有一个"reword"选项,这样可以减少痛苦!

  • 使用 `reword` 时,为什么 git 不简单地让您使用提交列表编辑该文件中的提交消息?相反,它会在每个 `reword` 行启动一个提交消息文件的编辑器。这只是不必要的。即使除 `pick` 或 `reword` 之外的其他操作需要启动外部命令,`reword` 也不需要这样做。 (5认同)

Pun*_*ara 39

正如Gregg Lind建议的那样,您可以使用reword来提示仅更改提交消息(并保持提交保持原样):

git rebase -i HEAD~n
Run Code Online (Sandbox Code Playgroud)

n是最后n次提交的列表.

例如,如果您使用git rebase -i HEAD~4,您可能会看到如下内容:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc
Run Code Online (Sandbox Code Playgroud)

现在更换改写为要编辑的消息提交:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc
Run Code Online (Sandbox Code Playgroud)

保存文件后退出编辑器,然后将提示您编辑已标记为reword的提交的消息,每个消息在一个文件中.请注意,它会一直要简单得多,当你更换,只需编辑提交信息pickreword,但这样做没有效果.

有关更改提交消息的更多信息,请参阅GitHub的页面.


Erf*_*ary 26

要更改历史记录中任何位置的提交消息:

1- , <commit_sha> 是要更改的提交之前的git rebase -i <commit_sha>SHA一次提交eb232eb6b(此处:): 在此输入图像描述

2-将pick(默认)更改为reword第一行(不要编辑消息本身)

3-保存并退出

4-接下来您将再次看到编辑器,其中仅包含旧的提交消息行,因此对其进行编辑,然后保存并退出 在此输入图像描述

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


Mah*_*alt 9

这是一个非常好的 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
Run Code Online (Sandbox Code Playgroud)


Web*_*ver 6

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

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

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

来自最新的大师:

git checkout -b new-branch
Run Code Online (Sandbox Code Playgroud)

然后

git checkout new-branch
git merge --squash problem-branch
git commit -m "new message" 
Run Code Online (Sandbox Code Playgroud)

裁判:https ://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch