我们正在开发一个有几个分支的git仓库。系统仅允许将更改部署到实时系统,如果所有提交都将feature-id作为提交注释的开头,则必须由公司为此项目批准。
我们在一次提交中有一个拼写错误,过去有超过100次提交(有几个人正在处理这个回购),这会导致feature-id出错(因此不会批准此项目)。所以现在我们无法将我们的更改推送到实时系统,因为这一次提交。
因此我需要更改此提交的提交消息以解决我的问题。
我使用git rebase
进行了研究并遇到this solution。我知道我会在这里改变git历史,并且我知道其含义。那到目前为止还不错。现在我的问题是(根据我的理解),git rebase接受所有~140次提交,从历史记录中删除它们并尝试再次应用它们。如果您的提交中没有任何合并,这很有效。
但是男孩我们有很多合并。有许多合并冲突,已经解决了(显然)。
但是当rebase完成后,关于如何解决冲突的信息似乎丢失了,git要求我再次合并所有内容。这不是一个可行的选择,因为重做大约140次提交的合并将需要大约四周或更长时间(还有关于如何合并的信息可能不再可用)。
因此,我们需要使用repo中提供的信息让git自动解决这些冲突。
我无法弄清楚如何做到这一点。我读到了git rerere
命令(see here),但根据我的理解,我应该在解决所有冲突之前启用该选项,同时这样做,git会记录下来的必要信息。
我有什么选择让这个提交重命名?看起来像一个简单的任务,但我没有想法。
非常感谢您的帮助!
答案 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
一起使用,请确保您不会更改提交的顺序,否则可能会搞砸。