【问题标题】:change a git commit already pushed [duplicate]更改已推送的 git 提交 [重复]
【发布时间】:2014-07-13 00:35:49
【问题描述】:

在 git 中进行合并时,我不小心覆盖了另一个开发人员的更改。我知道undo the last commit,也就是我的合并。

我的问题是我已经将这些提交推送到我们的在线存储库中。因此,如果我回滚,再次合并合并(这次是他的修改)并尝试再次推送它,就会发生冲突(对吗?)。处理这个问题的正确方法是什么?

编辑 澄清一下,情况如下:

commit A --- commit B --- merge

但在合并中,我不小心丢弃了提交 A 中所做的修改。这并不是真正的问题。我知道如何在本地进行更改(撤消合并)。 但是我的问题是整个东西已经被推送到我们的共享存储库(想想 github 或 bitbucket)。

【问题讨论】:

  • 请注意“更改修订”实际上是“删除修订并添加新的不同修订”。
  • 这似乎不是建议问题的重复。该建议涵盖回滚本地更改,但此处的 OP 询问是否将远程存储库回滚到以前的状态。
  • 我认为最干净的解决方案是使用 git cherry-pick 重新应用提交 A 补丁。这样,您将添加到历史记录而不是更改它,如果历史记录被发布,这总是一个坏主意!
  • @nha 是的,所有权将被保留。
  • 正如@poke 在他的回答中提到的那样,您也可以git revert 合并。所以也许这是另一种选择!

标签: git


【解决方案1】:

默认情况下,远程服务器将不允许覆盖已推送的提交。这是因为这些新提交是与之前发布的不兼容的不同对象。这意味着一旦您覆盖提交,任何已经从远程获取的人都将在修复它时遇到重大问题。所以你真的应该重新考虑用其他东西覆盖提交。请注意,git revert 也适用于合并提交,因此您可能需要考虑这样做。

话虽如此,您仍然可以推送重写的提交,即使它与服务器上的内容冲突。简而言之,您可以通过使用git push --forcegit push -f 强制推送来做到这一点。

【讨论】:

  • 我不确定我是否理解git revert。我是否能够推送到存储库,但什么也没发生?或者它是否添加了与最后一个完全相反的提交?你对git revertgit cherry-pick 有意见吗?
  • 是的,git revert 将添加一个撤消选定提交的新提交。所以推送它会起作用,因为它不会删除任何已经发布的提交。
  • 谢谢!我会接受你的回答,但我也支持你@musicmatze。 (我很高兴听到关于这两种选择各自优点的意见)
猜你喜欢
  • 2013-06-09
  • 2017-04-20
  • 2017-07-04
  • 1970-01-01
  • 2018-12-19
  • 2012-04-28
  • 1970-01-01
  • 2016-03-01
  • 2013-02-13
相关资源
最近更新 更多