在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下一篇: Git: How to rebase and squash commits from branch to master?