【问题标题】:How to revert a few commits in Git without creating reverse patches?如何在不创建反向补丁的情况下恢复 Git 中的一些提交?
【发布时间】:2014-09-21 23:47:30
【问题描述】:

考虑以下情况。

有一个项目 X 有一些积极的上游开发。我们正在为我们自己的内部目的开发项目 X 的​​一个分支。由于我们没有对项目 X 的​​ Git 存储库的写入权限,因此我们在自己的服务器上创建了该 Git 存储库的克隆。在本地计算机上工作时,所有同事都使用该克隆存储库作为origin

为了能够不断的将项目 X 的​​上游开发整合到我们的 fork 中,我们没有在我们的origin 服务器上碰master 分支。 (master 分支设置为跟踪项目 X 的​​ Git 存储库的 master 分支。)相反,我们在分支 my_master 上工作,我们在其中提交更改(并将它们推送到 origin 服务器) .在我们的origin 服务器上,我们可以定期将项目 X 的​​最新提交拉入master 分支。然后,我们可以切换到my_master 分支,并通过运行git merge master 将项目X 的最新开发合并到我们自己的fork 中。

很好。但是,现在在我们的 fork 上工作的同事不小心在 master 分支上进行了很多提交,而不是在 my_master 分支上进行,并将这些提交到 origin 服务器。他注意到自己的错误,在本地切换到 my_master 并将他的 master 分支合并到他的 my_master 分支中,以便这些更改存在于正确的分支上,并将其推送。

所以my_master 分支现在很好,但是master 分支包含一些不应该存在的补丁。当然,我们可以通过创建“还原提交”来还原这些更改,以还原错误做出的单个提交。然后,origin 服务器上的master 分支的状态将再次类似于项目 X 的​​ Git 存储库中的master 分支的状态。但是,它实际上包含一些还原提交。这意味着,下次我们在origin 服务器上更新master 分支,并尝试将上游更改合并到我们的my_master 分支中,恢复提交也将被应用,并且假定的新功能内置到my_master 分支将被撤消。这是正确的吗?

那么我们该怎么做呢?原则上,我们希望将origin 服务器上的master 分支重置为意外提交之前的提交。但我们无法创建恢复提交,因为这意味着下一次将master 合并到my_master 也会恢复my_master 分支上的更改。

【问题讨论】:

    标签: git git-branch branching-and-merging git-revert


    【解决方案1】:

    首先,我建议您在my_master 分支中恢复已恢复的提交,以在master 分支中保持线性历史记录。这种方式是更安全的方式,尽管这样它们仍然会全部显示在提交历史中。

    如果你真的希望这些提交消失,另一种方法是在 master 中进行 rebase 交互以删除它们,但随后每个人都必须重新设置基于那个有缺陷的 master 的分支!

    git rebase --interactive [commit hash before faulty commits]^
    

    (不要忘记提交哈希后的^

    它将打开您的默认文本编辑器,您所要做的就是删除错误提交的行。

    这样就好像它们从未发生过一样。但要小心使用cherry-pick 让它们回到my_master 分支(在针对master 重新定位之后)。然后push --force origin master,并要求每个人刷新他们的遥控器,并根据重写的master重新调整他们的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2014-11-28
      • 2020-08-30
      • 2012-09-05
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多