Git:使用git rebase更改已经推送的提交消息

时间:2017-02-15 14:54:00

标签: git rebase

我们正在开发一个有几个分支的git仓库。系统仅允许将更改部署到实时系统,如果所有提交都将feature-id作为提交注释的开头,则必须由公司为此项目批准。

我们在一次提交中有一个拼写错误,过去有超过100次提交(有几个人正在处理这个回购),这会导致feature-id出错(因此不会批准此项目)。所以现在我们无法将我们的更改推送到实时系统,因为这一次提交。

因此我需要更改此提交的提交消息以解决我的问题。

我使用git rebase进行了研究并遇到this solution。我知道我会在这里改变git历史,并且我知道其含义。那到目前为止还不错。现在我的问题是(根据我的理解),git rebase接受所有~140次提交,从历史记录中删除它们并尝试再次应用它们。如果您的提交中没有任何合并,这很有效。 但是男孩我们有很多合并。有许多合并冲突,已经解决了(显然)。

但是当rebase完成后,关于如何解决冲突的信息似乎丢失了,git要求我再次合并所有内容。这不是一个可行的选择,因为重做大约140次提交的合并将需要大约四周或更长时间(还有关于如何合并的信息可能不再可用)。

因此,我们需要使用repo中提供的信息让git自动解决这些冲突。

我无法弄清楚如何做到这一点。我读到了git rerere命令(see here),但根据我的理解,我应该在解决所有冲突之前启用该选项,同时这样做,git会记录下来的必要信息。

我有什么选择让这个提交重命名?看起来像一个简单的任务,但我没有想法。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以使用git amend更改提交消息。然后在所有分支中将current commit替换为new commit

$ git branch backup                                 # backup your branch just for safety

$ git checkout <commit-hash>                        # checkout the commit trying to modify
$ git commit --amend -m 'Change message here'       # change the author name and mail

$ git log                                           # copy the new-commit-hash
$ git replace <old-commit-hash> <new-commit-hash>   # replace the old commit by new one
$ git filter-branch -- --all ^<old-commit-hash>     # note '^' before hash, rewrite all futures commits based on the replacement                   

$ git replace -d <old-commit-hash>                  # remove the replacement for cleanliness 

$ git checkout <branch>                             # go to branch HEAD and see if the commit is changed perfectly

$ git push -f origin HEAD                           # force push as history is changed.

答案 1 :(得分:1)

尝试在您的rebase上使用--preserve-merges

git rebase --preserve-merges HEAD~100

它应该尝试重新创建合并提交,并可能会帮助你。如果与-i一起使用,请确保您不会更改提交的顺序,否则可能会搞砸。