在git中替换一个提交

我很久以前就有一个不好的提交,我想从git历史中彻底删除它,就像它从未发生过一样。 我知道提交ID让我们说1f020。 我已经尝试了git rebase并将其删除,但重新绑定时发生太多冲突,以至于无法这样做。 该提交是简单的1行代码更改,并推送一些与项目无关的文件。 所以我想写这1行代码更改并提交它,然后以很久以前替换这个新的提交。


如果违规提交位于私有存储库中,则要执行的操作不是什么大问题。 重写已发布的git历史令您的协作者感到恼火,因此请确保删除此行是值得的。

git-rebase文档有一个有用的通道。

git rebase [...] [<--onto newbase>] [<upstream>] [<branch>]

一系列的提交也可以用rebase去除。 如果我们有以下情况:

E---F---G---H---I---J  topicA

然后命令

git rebase --onto topicA~5 topicA~3 topicA

会导致提交F和G被移除:

E---H'---I'---J'  topicA

如果F和G以某种方式存在缺陷,或者不应该成为topicA一部分,这topicA 。 请注意,-- --onto和upstream参数的参数可以是任何有效的commit-ish。

假设您的历史记录是线性的,并且违规提交在您的主分支中,您可以通过运行来修改上述示例

git rebase --onto 1f020~ 1f020 master

对于更加烦人的情况,请使用交互式底座。 您可能会发现,遵循一个合并两个提交的示例会很有帮助,但不要使用s为squash标记提交,请移除整行以从历史记录中删除提交。


这有点复杂,但无论如何,这是如何发生的:

分离头部并移动以在提交提交。 使用git log来查找1f020之后的下一次提交。

git checkout <SHA1-for-commit-just-after-bad-commit-1f020>

移动HEAD以在提交失败之前提交,但保持索引和工作树不变

git reset --soft <SHA1-for-just-previous-to-bad-commit-1f020>

重做提交之后 ,重新使用提交消息,但现在在提交之前 ,只是提交失败之前 。 从而删除那个不好的提交

git commit -C <SHA1-for-commit-just-after-bad-commit-1f020>

将所有从提交之后的提交开始重新应用到这个新的地方

git rebase --onto HEAD <SHA1-for-commit-just-after-bad-commit-1f020> master

你不应该从git的历史中删除提交。 您稍后会遇到问题。

但是如果你知道自己在做什么,你可以在本地回退你的历史记录,用当前的提交代替提交,然后重新提交所有提交 - 然后在存储库上强制推送。

但我强烈建议不要这样做。 只要做一个新的承诺,并承认历史上有一个不好的承诺。

链接地址: http://www.djcxy.com/p/23455.html

上一篇: Replace a commit in git

下一篇: Git: How to rebase and squash commits from branch to master?