change a git commit already pushed
在Git中进行合并时,我意外地重写了另一个开发人员的更改。我知道如何撤消上一次提交,也就是我的合并。
我的问题是,我已经将这些提交推送到了我们的在线存储库中。因此,如果我回滚,是否再次进行合并(这次对其进行了修改),并尝试再次推送合并,将出现冲突(对吗?).处理这件事的正确方法是什么?
编辑澄清一下,情况如下:
1
| commit A --- commit B --- merge |
但在合并中,我意外地放弃了在提交A中所做的修改,这实际上不是问题。我知道如何在本地进行更改(撤消合并)。但我的问题是,整个问题都被推到了我们的共享存储库中(比如github或bitback)。
- 请注意,"更改修订"实际上是"删除修订并添加新的、不同的修订"。
- 这看起来不像是建议问题的副本。建议包括回滚本地更改,但这里的操作要求将远程存储库回滚到以前的状态。
- @卡莱布谢谢你,正是这样。我做了一个编辑试图进一步解释,但这就是我的想法。我应该补充一点,我是个无赖。
- 我认为最干净的解决方案是用git cherry-pick重新应用commit-a补丁。这样你就可以增加历史而不是改变它,如果历史被公布,这总是一个坏主意!
- @我明白了。那么,埃多克斯,对吗?承诺的所有权也将保留,对吗?我不想自称是我的…
- @是的,所有权将被保留。
- 正如他回答中提到的那样,你也可以合并。所以也许这是另一个选择!
- 我应该补充一点,我认为这不是复制品。这有时很接近,但有些"重复"并不存在远程存储库的问题。有些人不考虑相同的场景(即添加/重放提交而不是删除提交)。这会产生不同的解决方案,如git cherry-pick。
默认情况下,远程服务器将不允许覆盖已推送的提交。这是因为这些新提交是不同的对象,与以前发布的对象不兼容。这意味着,从那以后已经从远程获取的任何人在覆盖提交之后都将遇到修复它的主要问题。所以你真的应该重新考虑用其他东西覆盖提交。请注意,git revert也适用于合并提交,因此您可能需要考虑这一点。
也就是说,即使重写提交与服务器上的内容冲突,您仍然可以推动它。简而言之,您可以使用git push --force或git push -f通过强制推动来实现这一点。
- 我不确定我是否理解git revert。我能推到存储库吗?什么也没发生?或者它是否添加了与上一个完全相反的提交?你对git revert和git cherry-pick有什么看法吗?
- 是的,git revert将添加一个撤消所选提交的新提交。因此,推送它将起作用,因为它不会删除任何已发布的提交。
- 谢谢您!我接受你的回答,但我也反对你@musicmatze。(我很高兴听到关于这两种选择各自优点的意见)